时间:2021-07-01 10:21:17 帮助过:8人阅读
spring JdbcTemplate 事务管理
spring的JDBC框架能够承担资源管理和异常处理的工作,从而简化我们的JDBC代码, 让我们只需编写从数据库读写数据所必需的代码。Spring把数据访问的样板代码隐藏到模板类之下,
结合Spring的事务管理,可以大大简化我们的代码.
Spring提供了对事务的声明式事务管理,只需要在配置文件中做一些配置,即可把操作纳入到事务管理当中,解除了和代码的耦合。
Spring声明式事务管理,核心实现就是基于Aop。
Spring声明式事务管理是粗粒度的事务控制,只能给整个应用方法事务,不可以对方法的某几行应用事务。
Spring声明式事务管理器类:
Jdbc技术:DataSourceTransactionManager
hibernate技术:HibernateTransactionManager
先创建一个实体类的包,并在该包中创建Account实体类,写上属性并将其进行get,set封装
public class Account { private int aid; private String aname; private Double balance;
同样在该包中创建Stock实体类,写上该类的属性值,并将其进行get,set封装
public class Stock { private int sid; private String sname; private int count;
创建StoreException类,并继承异常类,并将该类的名称进行有参无参构造
public class StoreException extends Exception { public StoreException() { super(); } public StoreException(String message){ super(message); } }
创建dao包,并在该包中创建AccountDao接口,并写上接口的实现方法
public interface AccountDao { //要进行购买操作 银行账户 public boolean updateAccount(int aid,double money,boolean isBuy); }
在dao层中创建AccountDaoImpl接口实现类,并且继承JdbcDaoSupport父类,并实现接口方法
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { public boolean updateAccount(int aid, double money, boolean isBuy) { boolean flg=false; String sql=null; if(isBuy){
//购买股票 sql="update account set balance=balance-? where aid=?"; }else { sql="update account set balance=balance+? where aid=?"; }
//对数据进行增删改,都用update() int count=this.getJdbcTemplate().update(sql,money,aid); if(count>0){ flg=true; } return flg; } }
同样在dao层中创建SackDao接口,并写上接口的实现方法
public interface SaockDao { //要进行购买操作 银行账户 public boolean updateSock(int sid,double count,boolean isBuy); }
如上述所示,在dao层中创建SaockDaoImpl接口实现类,并且继承JdbcDaoSupport父类,并实现接口方法
public class SaockDaoImpl extends JdbcDaoSupport implements SaockDao { public boolean updateSock(int sid, double count, boolean isBuy) { boolean fl=false; String sql=null; if(isBuy){ sql="update stock set count=count+? where sid=?"; }else { sql="update stock set count=count-? where sid=?"; } int pl=this.getJdbcTemplate().update(sql,count,sid); if(pl>0){ fl=true; } return fl; } }
之后创建service层,并在该层中创建AccountService接口,并写上接口的实现方法
public interface AccountService { public void buySock(int sid,int count,int aid,double money); }
同样在service包中,创建接口实现类并继承AccountService接口,实现该接口中的方法,并将dao包中的接口重新植入,将其进行封装
public class AccountServiceImpl implements AccountService{ private AccountDao accountDao; private SaockDao saockDao; public void buySock(int sid, int count, int aid, double money){ boolean isBuy=true; //购买股票 accountDao.updateAccount(aid,money,isBuy); //异常 if(1==1){ try { throw new cn.happy.SpringJDBCTemplateSW.entity.StoreException(); } catch (cn.happy.SpringJDBCTemplateSW.entity.StoreException e) { e.printStackTrace(); } } saockDao.updateSock(sid,count,isBuy); } public AccountDao getAccountDao() { return accountDao; } public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } public SaockDao getSaockDao() { return saockDao; } public void setSaockDao(SaockDao saockDao) { this.saockDao = saockDao; } }
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///bookstok jdbc.user=sha jdbc.password=sha
applicationContestSpringSW.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!--识别jdbc.properties文件--> <context:property-placeholder location="jdbc.properties"></context:property-placeholder> <!--创建数据源 Spring --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!--dao配置--> <bean id="AccountDaoImpl" class="cn.happy.SpringJDBCTemplateSW.dao.AccountDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="SaockDaoImpl" class="cn.happy.SpringJDBCTemplateSW.dao.SaockDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <!--service accuntservice--> <bean id="accuntservice" class="cn.happy.SpringJDBCTemplateSW.service.AccountServiceImpl"> <property name="accountDao" ref="AccountDaoImpl"></property> <property name="saockDao" ref="SaockDaoImpl"></property> </bean> <!--事务管理器--> <bean id="tranasationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--配置事务,拦截业务方法--> <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!--目标类型--> <property name="target" ref="accuntservice"></property> <property name="transactionManager" ref="tranasationManager"></property> <!--增强--> <property name="transactionAttributes"> <props> <prop key="buy*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop> </props> </property> </bean> </beans>
测试类:
public class SpringJDBCTemplateSWTest { @Test public void testTx(){ ApplicationContext appl=new ClassPathXmlApplicationContext("applicationContestSpringSW.xml"); AccountService acc= (AccountService) appl.getBean("accountServiceProxy"); try { acc.buySock(1,12,1,200); }catch (StoreException e){ e.printStackTrace(); } } }
Spring jdbcTemplate
标签:store targe cte 代码 bean default tac username private