日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

spring事务管理-演示事务的环境准备

發(fā)布時(shí)間:2024/4/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring事务管理-演示事务的环境准备 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
咱們想一個(gè)業(yè)務(wù)環(huán)境,最經(jīng)典的業(yè)務(wù)環(huán)境就是轉(zhuǎn)賬,轉(zhuǎn)賬的話咱們涉及一個(gè)Service方法,方法就叫轉(zhuǎn)賬方法,然后轉(zhuǎn)賬方法調(diào)用兩個(gè)DAO,一個(gè)DAO是從一個(gè)賬戶取錢(qián)出來(lái),從另外一個(gè)賬戶存錢(qián)進(jìn)去,咱們來(lái)做這件事,我新寫(xiě)一個(gè)項(xiàng)目,spring-day03tx,不部署web項(xiàng)目,就單擊運(yùn)行,是這樣,首先導(dǎo)包,把剛才的包全部導(dǎo)進(jìn)來(lái)

然后咱們的核心配置文件,咱們復(fù)制過(guò)來(lái),然后db.properties復(fù)制過(guò)來(lái),接下來(lái)咱們得書(shū)寫(xiě)DAO,Service,完成剛才的業(yè)務(wù)操作,新建一個(gè)DAO,轉(zhuǎn)賬的話跟錢(qián)有關(guān),AccountDao,然后這里面一共就兩個(gè)方法,加錢(qián)和減錢(qián),第一個(gè)方法void,方法名,addMoney,addMoney就是加錢(qián),先考慮減錢(qián)的方法名,這個(gè)參數(shù),這回真的要做數(shù)據(jù)庫(kù)了,咱們是想Integer類型的,id,逗號(hào)再來(lái)一個(gè),Double型的money,給哪個(gè)id加多少錢(qián),然后這個(gè)方法再?gòu)?fù)制一份,decreaseMoney,減錢(qián)decreaseMoney,外國(guó)人估計(jì)能看懂,這里加錢(qián)減錢(qián)兩個(gè)方法,是不是前面兩節(jié)課的知識(shí) package com.learn.dao;public interface AccountDao {//加錢(qián)void increaseMoney(Integer id,Double money);//減錢(qián)void decreaseMoney(Integer id,Double money); } 咱們?cè)賮?lái)一個(gè)AccountImpl,剛才學(xué)了怎么實(shí)現(xiàn)來(lái)的,extends JdbcDaoSupport,然后在這里根據(jù)jdbc模板操作的,在這里getJdcbTemplate,然后增刪改剛才學(xué)的是update方法,然后update方法的話,我就直接調(diào)update方法,SQL語(yǔ)句就直接update,表的話我們就新增一個(gè)表CREATE TABLE t_account (id int PRIMARY KEY auto_increment,name varchar(255),money double ) ENGINE=InnoDB;然后列的話就來(lái)一個(gè)id列,來(lái)一個(gè)name列,來(lái)一個(gè)money列,然后id的數(shù)據(jù)類型就是int,name的類型就是varchar,然后money就是double,vachar長(zhǎng)度需要指定,其他的需要默認(rèn)長(zhǎng)度,主鍵自增,比如咱們這個(gè)表里有tom,劉躍東,然后tom手頭有1000塊,我手頭也有1000塊,insert into t_account(id,name,money) values(1,'tom',1000);insert into t_account(id,name,money) values(2,'劉躍東',1000);表有了,然后咱們DAO的加錢(qián)的方法,update t_account表,set money = money + ?,然后where id = ?,所以咱們傳參數(shù)的話,money是不是要放前面,對(duì)應(yīng)第一個(gè)方法,然后id是不是放第二個(gè),然后最后再加上咱們的分號(hào)結(jié)束,這樣的話加錢(qián)方法就寫(xiě)完了,下面的只要把減號(hào),DAO寫(xiě)完了 package com.learn.dao;import org.springframework.jdbc.core.support.JdbcDaoSupport;public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {@Overridepublic void increaseMoney(Integer id, Double money) {getJdbcTemplate().update("update t_account set money = money+? where id = ? ", money,id);}@Overridepublic void decreaseMoney(Integer id, Double money) {getJdbcTemplate().update("update t_account set money = money-? where id = ? ", money,id);}} 咱們?cè)贉?zhǔn)備一下Service環(huán)境,Service的話也是來(lái)一個(gè)接口,比如咱們來(lái)一個(gè)AccountService,然后包選在Service包下,那這個(gè)里面的方法就一個(gè),轉(zhuǎn)賬方法,transfer方法,然后傳的參數(shù)就是Integer類型的,Integer類型的,to,然后再來(lái)一個(gè)money,double類型的money,能看明白這個(gè)方法啥意思吧,這個(gè)id的用戶,給這個(gè)id的用戶,是不是轉(zhuǎn)了多少錢(qián)了,然后再去實(shí)現(xiàn)咱們的Service package com.learn.service;public interface AccountService {//轉(zhuǎn)賬方法void transfer(Integer from,Integer to,Double money);} 實(shí)現(xiàn)的話你們能想象到吧,是不是很簡(jiǎn)單,是不是調(diào)兩個(gè)DAO方法,這塊就是AccountServiceImpl,放在一個(gè)包,然后添加一個(gè)接口,AccountService,然后這里面要實(shí)現(xiàn)轉(zhuǎn)賬太簡(jiǎn)單了,然后首先減錢(qián),銀行里面一般是先減,再給你加,減的話你看,加錢(qián)咱們是用DAO,DAO是不是可以聲明讓Spring注入進(jìn)來(lái),privateAccountDao,ad,如果要注入要注意聲明set方法才能夠注入,選擇set方法,然后減錢(qián)可以ad.decrease方法,然后從哪兒減錢(qián),是不是from,然后money,然后加錢(qián)是可以ad.increaseMoney,那這兒的話就是to,加多少錢(qián),完事了是不是,這樣的話咱們的DAO和Service,是不是準(zhǔn)備好了 package com.learn.service;import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;import com.learn.dao.AccountDao;@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true) public class AccountServiceImpl implements AccountService {private AccountDao ad ;@Overridepublic void transfer(final Integer from,final Integer to,final Double money) {//減錢(qián)ad.decreaseMoney(from, money);//加錢(qián)ad.increaseMoney(to, money);}public void setAd(AccountDao ad) {this.ad = ad;}} 接下來(lái)的話需要在咱們的applicationContext當(dāng)中,把咱們Service的DAO,以及依賴的所有對(duì)象,你一開(kāi)始寫(xiě)Spring可能配置生疏,建議你可以在圖上分析一下,現(xiàn)在一共有多少對(duì)象,他們之間的關(guān)系是什么,這個(gè)圖的話你看,咱們最后是希望讓Service運(yùn)行起來(lái),那這個(gè)Service依賴于誰(shuí)啊,他是不是依賴叫做DAO,所以你在這里要配一個(gè)叫DAO,DAO要運(yùn)行起來(lái)要依賴于誰(shuí)啊,咱們這個(gè)DAO要運(yùn)行依賴的話,一開(kāi)始,咱們說(shuō)依賴與JDBC模板,后來(lái)咱們繼承了JdbcSupport,直接依賴于數(shù)據(jù)源,所以這里叫DataSource,那依賴關(guān)系出來(lái)了,DataSource需要注入到Dao當(dāng)中,Dao是不是需要注入到Service當(dāng)中,那接下來(lái)的話咱們就配,配的先從底下開(kāi)始配,配dataSource,dataSource本來(lái)就有,然后jdbc模板可以刪掉了,然后dao咱們改就可以了,然后對(duì)象的名字改成accountDao,a改成小寫(xiě),然后accountDao里面需要daoSource,第一步連接池,第二步userDao,第三步service,service就需要配置serviceImpl,然后service里面需要accountDao,再把AccountDao注入進(jìn)去 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "><!-- 指定spring讀取db.properties配置 --> <context:property-placeholder location="classpath:db.properties" /><!-- 1.連接池 --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" ><property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property><property name="driverClass" value="${jdbc.driverClass}" ></property><property name="user" value="${jdbc.user}" ></property><property name="password" value="${jdbc.password}" ></property> </bean><!-- 2.Dao--> <bean name="accountDao" class="com.learn.dao.AccountDaoImpl" ><property name="dataSource" ref="dataSource" ></property> </bean> <!-- 3.Service--> <bean name="accountService" class="com.learn.service.AccountServiceImpl" ><property name="ad" ref="accountDao" ></property> </bean> </beans> 現(xiàn)在還沒(méi)有事務(wù)呢,接下來(lái)寫(xiě)一個(gè)Demo,直接是tx包下,Demo里面要測(cè)試的話,@Runwith你要用的話,你還得先@Test一下,來(lái)一個(gè)方法,先把Junit庫(kù)導(dǎo)進(jìn)來(lái),然后在這里寫(xiě)@Runwith,SpringJunit4ClassRunner.class,這個(gè)4讀成for,再來(lái)一個(gè)@ContextConfiguration,然后在這里配置配置文件的位置,classpath:applicationContext.xml,然后咱們要配的是service,所以在這里聲明一個(gè)private AccountService,在這里可以聲明一個(gè)@Resource(name="accountService"),咱們就可以測(cè)試as的transfer方法,100d,知道為什么叫d,接下來(lái)執(zhí)行一下看看,執(zhí)行成功,那這個(gè)時(shí)候是不是就轉(zhuǎn)過(guò)來(lái)了 jdbc.jdbcUrl=jdbc:mysql:///day20 jdbc.driverClass=com.mysql.jdbc.Driver jdbc.user=root jdbc.password=123456 package com.learn.tx;import javax.annotation.Resource;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.learn.service.AccountService;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo {@Resource(name="accountService")private AccountService as;@Testpublic void fun1(){as.transfer(1, 2, 100d);} }

100d,是不是把錢(qián)轉(zhuǎn)過(guò)來(lái)了,接下來(lái)我們說(shuō)不加事務(wù)會(huì)怎么辦呢,如果不加事務(wù)我們是不是會(huì)有問(wèn)題,比如中間int i = 1/0;知道啥意思不,如果出異常了,你發(fā)現(xiàn)少了100,總共是1900 package com.learn.service;import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;import com.learn.dao.AccountDao;@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true) public class AccountServiceImpl implements AccountService {private AccountDao ad ;@Overridepublic void transfer(final Integer from,final Integer to,final Double money) {//減錢(qián)ad.decreaseMoney(from, money);int i = 1/0;//加錢(qián)ad.increaseMoney(to, money);}public void setAd(AccountDao ad) {this.ad = ad;}} package com.learn.tx;import javax.annotation.Resource;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.learn.service.AccountService;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo {@Resource(name="accountService")private AccountService as;@Testpublic void fun1(){as.transfer(1, 2, 100d);} }

?

總結(jié)

以上是生活随笔為你收集整理的spring事务管理-演示事务的环境准备的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。