JAVA Spring 事物 ( 已轉賬為例 ) 基于 AOP 注解

<一> 配置為文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
><!-- 配置 C3P0 連接池數據源, 作為 DAO 層的數據源--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="jdbcUrl"><value>jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</value></property><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="user" value="root"></property><property name="password" value="920619"></property></bean><!-- 配置 DAO 層, 把 C3P0 連接池作為數據源注入到 DAO 層 --><bean id="accountDao" class="spring.things_2.AccountDao"><property name="dataSource" ref="dataSource"></property></bean><!-- 配置 SERVICE 層, 把 DAO 層注入到 SERVICE 層 --><bean id="accountService" class="spring.things_2.AccountService"><property name="accountDao" ref="accountDao"></property></bean><!-- 配置事物管理類 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 開啟注解事物 --><tx:annotation-driven transaction-manager="transactionManager" /></beans>

?

<二> Dao 層和 Service?層的接口

package spring.things_2;import org.springframework.jdbc.core.support.JdbcDaoSupport;public class AccountDao extends JdbcDaoSupport implements IAccountDao {@Overridepublic void outMoney(String outName, double money) {String sql = "update User set money = money - ? where UserName = ?";this.getJdbcTemplate().update(sql, money, outName);}@Overridepublic void inMoney(String inName, double money) {String sql = "update User set money = money + ? where UserName = ?";this.getJdbcTemplate().update(sql, money, inName);}}
package spring.things_2;import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;/*** 注解該類為事物類( 參數類型如下 )* propagation:   事物的傳播行為* isolation:     事物的隔離級別* readOnly:      是否只讀* rollbackFor:   被回滾的異常類型* noRollbackFor: 不會滾的異常類型*/
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT)
public class AccountService implements IAccountService {// 注入的 Dao 層private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}// 這個方法在測試中是一個事物單元
    @Overridepublic void transfer(String outName, String inName, double money) {accountDao.outMoney(outName, money);accountDao.inMoney(inName, money);}}

< 三 > 接口的實現類

package spring.things_2;import org.springframework.jdbc.core.support.JdbcDaoSupport;public class AccountDao extends JdbcDaoSupport implements IAccountDao {@Overridepublic void outMoney(String outName, double money) {String sql = "update User set money = money - ? where UserName = ?";this.getJdbcTemplate().update(sql, money, outName);}@Overridepublic void inMoney(String inName, double money) {String sql = "update User set money = money + ? where UserName = ?";this.getJdbcTemplate().update(sql, money, inName);}}
package spring.things_2;import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;/*** 注解該類為事物類( 參數類型如下 )* propagation:   事物的傳播行為* isolation:     事物的隔離級別* readOnly:      是否只讀* rollbackFor:   被回滾的異常類型* noRollbackFor: 不會滾的異常類型*/
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT)
public class AccountService implements IAccountService {// 注入的 Dao 層private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}// 這個方法在測試中是一個事物單元
    @Overridepublic void transfer(String outName, String inName, double money) {accountDao.outMoney(outName, money);accountDao.inMoney(inName, money);}}

?

轉載于:https://www.cnblogs.com/lovling/p/6817282.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252724.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全球視頻監控設備市場規模分析

權威電子行業研究機構IHS Research發布《中國CCTV與視頻監控設備市場研究報告》顯示&#xff0c;2014年全球視頻監控設備市場143億美元&#xff0c;同比增長14.2%。歐洲、美洲、亞洲都增長低于預期;中國增長高于預期&#xff0c;市場總量達57.1億美元;美國市場雖然出貨量在增加…

vue 新窗口打開外鏈接

背景&#xff1a;vue-router 打開外鏈接 如果使用 a 標簽&#xff0c;會默認加上根路由&#xff0c;導致跳轉失效。那么如何讓 a 標簽點擊跳轉到新窗口&#xff1f;解決方法&#xff1a;html 代碼<a class"a-style" click"linkDownload(https://www.baidu.co…

EasyWeChat微信開放平臺第三方平臺接入

目錄實例化微信服務器推送事件預授權獲取預授權 Code獲取預授權 URLAPI 列表使用授權碼換取公眾號的接口調用憑據和授權信息獲取授權方的公眾號帳號基本信息獲取授權方的選項設置信息設置授權方的選項信息調用授權方 API實例化<?phpuse EasyWeChat\Foundation\Application;…

201521145048《Java程序設計》第11周學習總結

1. 本周學習總結 1.1 以你喜歡的方式&#xff08;思維導圖或其他&#xff09;歸納總結多線程相關內容。 2. 書面作業 本次PTA作業題集多線程 Q1.互斥訪問與同步訪問 完成題集4-4(互斥訪問)與4-5(同步訪問) 1.1 除了使用synchronized修飾方法實現互斥同步訪問&#xff0c;還有什…

修改chrome記住密碼后自動填充表單的背景

2019獨角獸企業重金招聘Python工程師標準>>> input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {background-color: rgb(250, 255, 189); /* #FAFFBD; */background-image: none;color: rgb(0, 0, 0); } 轉載于:https://my.oschina.net…

2018年我國視頻監控市場趨勢:智能視頻分析進入規模化

在安防領域中&#xff0c;視頻監控無疑是不可缺少的一環。我國是全球視頻安防行業增速最快的國家之一&#xff0c;近年來我國的視頻監控市場經歷了持續強勁的發展。我國視頻監控市場的高速增長反映了對個人安全及財產保護的擔憂增加。為解決該擔憂&#xff0c;公司及個人機構大…

RUP,XP,敏捷原理

①RUP-- RUP&#xff08;Rational Unified Process&#xff0c;統一軟件開發過程&#xff0c;統一軟件過程)是一個面向對象且基于網絡的程序開發方法論。 根據Rational(Rational Rose和統一建模語言的開發者)的說法&#xff0c;好像一個在線的指導者&#xff0c;它可以為所有方…

1001. A+B Format (20)---------------PAT開始

今天是第一次用Java提交PAT的代碼&#xff1a; 源代碼不能直接提交&#xff0c;需要經過修改&#xff1a; 源代碼&#xff1a; 1 package test;//提交時不能顯示這句2 3 import java.util.Scanner;4 5 public class Test_1001 {//提交時名字要改成Main6 public static void…

第一篇:SpringCloud 構建微服務系統之服務注冊和發現(consul)

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/u010046908/article/details/85260629 今天我們要學習的是consul在soringcloud中的使用。首先學習consul之前&#xff0c;我們應該看看consul的官網&#xff0c;對它有一個初…

2018 年視頻監控企業競爭力分析 海康威視連續七年蟬聯全球第一

視頻監控是安防行業的核心 近年來&#xff0c;隨著我國政府對平安城市、" 雪亮工程 " 以及金融和交通運輸等領域的重視&#xff0c;對于安防產品的需求不斷提升&#xff0c;安防市場規模也在隨之不斷擴大。視頻監控是整個安防系統最重要的物理基礎&#xff0c;視頻監…

java 二維數組

二維數組 多維數組可以簡單地理解為在數組中嵌套數組 二維數組的定義格式 二維數組的定義有很多方式 第一種方式 1 int[][] arr new int[3][4]; 上面的代碼相當于定義了一個3*4的二維數組&#xff0c;即二維數組的長度為3&#xff0c;二維數組中的每個元素又是一個長度為4的數…

Ambient occlusion

https://en.wikipedia.org/wiki/Ambient_occlusion https://gamedev.stackexchange.com/questions/23/what-is-ambient-occlusion http://people.mpi-inf.mpg.de/~ritschel/Papers/SSDO.pdf 注解&#xff1a; 論文&#xff08;http://people.mpi-inf.mpg.de/~ritschel/Papers/S…

利用RTL2832u電視棒芯片追蹤民航飛機軌跡

我國民航飛機通訊的頻率為1090Mhz&#xff0c;而rtl2832u電視棒芯片可以接受的頻率范圍為24 – 1766 MHz&#xff08;通過改制Q通道可以接收0-30Mhz的短波&#xff09;下面開始介紹利用rtl2832u電視棒芯片獲取民航航線 第一步淘寶搜索rtl2832u820T(50塊錢就能買到) <ignore_…

預見2019:《2019年中國視頻監控產業全景圖譜》(附產業布局、政策環境、市場規模、發展趨勢)

2019-2024年中國視頻監控設備行業市場需求預測與投資戰略規劃分析報告2019-2024年中國安防行業市場前瞻與投資戰略規劃分析報告2019-2024年中國智能安防行業市場前瞻與投資戰略規劃分析報告2019-2024年中國智能家居設備行業市場前瞻與投資策略規劃報告2019-2024年中國城市軌道交…

nginx負載均衡 頁面緩存

nginx的upstream目前支持4種方式的分配 1、輪詢&#xff08;默認&#xff09; 每個請求按時間順序逐一分配到不同的后端服務器&#xff0c;如果后端服務器down掉&#xff0c;能自動剔除。 2、weight 指定輪詢幾率&#xff0c;weight和訪問比率成正比&#xff0c;用于后端服務器…

Date擴展 正則匹配

<script>Date.prototype.formatfunction(){var dthis;//嚴格匹配 yyyy-mm-dd hh-mm-ssvar reg1/yyyy-mm-dd hh-m-s/;//匹配 yyyy*mm*dd hh*mm*ss *為任意一個除\r\n之外的字符 中間為任意多個空格var reg2/y{4}.m{2}.dd\shh.mm.ss/;reg1.test(arguments[0]);reg2.test(a…

終于有人把EMC基礎知識總結如此清晰

傳導與輻射 電磁干擾(Electromagnetic Interference)&#xff0c;簡稱EMI&#xff0c;有傳導干擾和輻射干擾兩種。傳導干擾主要是電子設備產生的干擾信號通過導電介質或公共電源線互相產生干擾&#xff1b;輻射干擾是指電子設備產生的干擾信號通過空間耦合把干擾信號傳給另一個…

填坑-十萬個為什么?(13)

簡介:很多概念不清或忘記&#xff0c;重新構建自己的知識體系。每天問自己1~多個問題。我是菜鳥 成為大神之路! 1. 經典面試題 for(var i0;i<3;i){ setTimeout(function() { console.log(i) }, 10);}打印結果&#xff1f;分析&#xff1f; for(var i 0; i < 10; i) {con…

WordPress分類列表函數:wp_list_categories用法及參數詳解舉例

http://www.511yj.com/wordpress-wp-categories.html 注意&#xff1a; 1、 wp_list_categories() 和 list_cats() 以及 wp_list_cats() 的使用類似&#xff0c;但是后面 2 個已經棄用。 2、如果你希望不格式化輸出分類&#xff0c;請使用 get_categories() 3、因為 WordPress …

DVP,LVDS和MIPI

Mipi 接口 和 LVDS 接口區別 主要區別&#xff1a; 1. LVDS接口只用于傳輸視頻數據&#xff0c;MIPI DSI不僅能夠傳輸視頻數據&#xff0c;還能傳輸控制指令&#xff1b; 2. LVDS接口主要是將RGB TTL信號按照SPWG/JEIDA格式轉換成LVDS信號進行傳輸&#xff0c;MIPI DSI接口則…