spring&JDBC模板类&事务管理平台

梦里梦外; 2022-05-22 05:21 300阅读 0赞

Spring的JDBC的模板

!\[spring框架JDBC模板类.png\]\[1\]
jar包:
!\[jar包.png\]\[2\]
创建一个测试类:

  1. @Test
  2. // JDBC模板的基本使用:
  3. public void demo1(){
  4. DriverManagerDataSource dataSource = new DriverManagerDataSource();
  5. dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  6. dataSource.setUrl("jdbc:mysql:///spring_day03");
  7. dataSource.setUsername("root");
  8. dataSource.setPassword("123");
  9. JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  10. jdbcTemplate.update("insert into account values (null,?,?)", "会希",10000d);
  11. }

将连接池的配置交给Spring管理

1.配置内置连接池

  1. <!-- 配置Spring的内置连接池 -->
  2. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  4. <property name="url" value="jdbc:mysql:///spring_day02"/>
  5. <property name="username" value="root"/>
  6. <property name="password" value="123"/>
  7. </bean>

2.将模板配置到Spring中(也可以让dao层继承HibernateDaoSupport类注入SessionFactory创建,或者是连接池)




3.编写测试类
引入spring-aop.jar

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration("classpath:applicationContext.xml")
  3. public class SpringDemo2 {
  4. @Resource(name="jdbcTemplate")
  5. private JdbcTemplate jdbcTemplate;
  6. @Test
  7. public void demo1(){
  8. jdbcTemplate.update("insert into account values (null,?,?)", "凤姐",10000d);
  9. }
  10. }

Spring中配置DBCP连接池

!\[dbcp链接池.png\]\[3\]
【配置连接池】

  1. <!-- 配置DBCP连接池 -->
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  4. <property name="url" value="jdbc:mysql:///spring_day02"/>
  5. <property name="username" value="root"/>
  6. <property name="password" value="123"/>
  7. </bean>

配置c3p0连接池

!\[c3p0连接池.png\]\[4\]
配置连接池

  1. <!-- 配置C3P0连接池 -->
  2. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  3. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  4. <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"/>
  5. <property name="user" value="root"/>
  6. <property name="password" value="123"/>
  7. </bean>

Spring进行事务管理一组API

PlatformTransactionManager:平台事务管理器.
真正管理事务的对象
使用Spring JDBC或iBatis 进行持久化数据时使用
org.springframework.jdbc.datasource.DataSourceTransactionManager
使用Hibernate版本进行持久化数据时使用
org.springframework.orm.hibernate3.HibernateTransactionManager

TransactionDefinition:事务定义信息
事务定义信息:
隔离级别
传播行为
超时信息
是否只读
TransactionStatus:事务的状态:
记录事务的状态

Spring的这组接口是如何进行事务管理:
平台事务管理根据事务定义的信息进行事务的管理,事务管理的过程中产生一些状态,将这些状态记录到TransactionStatus里面

事务的传播行为:
PROPAGION_XXX :事务的传播行为
保证同一个事务中
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常

  1. 保证没有在同一个事务中
  2. PROPAGATION\_REQUIRES\_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
  3. PROPAGATION\_NOT\_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
  4. PROPAGATION\_NEVER 以非事务方式运行,如果有事务存在,抛出异常
  5. PROPAGATION\_NESTED 如果当前事务存在,则嵌套事务执行

[事务传播详细解释][5]

转账代码

创建业务层和DAO的类

  1. public interface AccountService {
  2. public void transfer(String from,String to,Double money);
  3. }
  4. public class AccountServiceImpl implements AccountService {
  5. // 业务层注入DAO:
  6. private AccountDao accountDao;
  7. public void setAccountDao(AccountDao accountDao) {
  8. this.accountDao = accountDao;
  9. }
  10. @Override
  11. /**
  12. * from:转出的账号
  13. * to:转入的账号
  14. * money:转账金额
  15. */
  16. public void transfer(String from, String to, Double money) {
  17. accountDao.outMoney(from, money);
  18. accountDao.inMoney(to, money);
  19. }
  20. }
  21. public interface AccountDao {
  22. public void outMoney(String from,Double money);
  23. public void inMoney(String to,Double money);
  24. }
  25. public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
  26. @Override
  27. public void outMoney(String from, Double money) {
  28. this.getJdbcTemplate().update("update account set money = money - ? where name = ?", money,from);
  29. }
  30. @Override
  31. public void inMoney(String to, Double money) {
  32. this.getJdbcTemplate().update("update account set money = money + ? where name = ?", money,to);
  33. }
  34. }

配置业务层和DAO

  1. <!-- 配置业务层的类 -->
  2. <bean id="accountService" class="cn.itcast.transaction.demo1.AccountServiceImpl">
  3. <property name="accountDao" ref="accountDao"/>
  4. </bean>
  5. <!-- 配置DAO的类 -->
  6. <bean id="accountDao" class="cn.itcast.transaction.demo1.AccountDaoImpl">
  7. <property name="dataSource" ref="dataSource"/>
  8. </bean>

1.5.1.3编写测试类

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration("classpath:applicationContext2.xml")
  3. public class SpringDemo4 {
  4. @Resource(name="accountService")
  5. private AccountService accountService;
  6. @Test
  7. // 转账的测试:
  8. public void demo1(){
  9. accountService.transfer("会希", "凤姐", 1000d);
  10. }
  11. }

Spring的编程式事务(不推荐使用)

手动编写代码完成事务的管理
配置事务管理器

  1. <!-- 配置事务管理器 -->
  2. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dataSource"/>
  4. </bean>

配置事务管理的模板

  1. <!-- 配置事务管理模板 -->
  2. <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
  3. <property name="transactionManager" ref="transactionManager"/>
  4. </bean>

需要在业务层注入事务管理模板

  1. <!-- 配置业务层的类 -->
  2. <bean id="accountService" class="cn.itcast.transaction.demo1.AccountServiceImpl">
  3. <property name="accountDao" ref="accountDao"/>
  4. <!-- 注入事务管理模板 -->
  5. <property name="transactionTemplate" ref="transactionTemplate"/>
  6. </bean>

手动编写代码实现事务管理

  1. public void transfer(final String from, final String to, final Double money) {
  2. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  3. @Override
  4. protected void doInTransactionWithoutResult(TransactionStatus status) {
  5. accountDao.outMoney(from, money);
  6. int d = 1 / 0;
  7. accountDao.inMoney(to, money);
  8. }
  9. });
  10. }

spring的声明式事务管理XML方式(推荐使用注解方式):思想就是AOP.

不需要进行手动编写代码,通过一段配置完成事务管理
引入AOP开发的包
aop联盟.jar
Spring-aop.jar
aspectJ.jar
spring-aspects.jar
配置事务管理器

  1. <!-- 事务管理器 -->
  2. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dataSource"/>
  4. </bean>

配置事务的通知

  1. <!-- 配置事务的增强 -->
  2. <tx:advice id="txAdvice" transaction-manager="transactionManager">
  3. <tx:attributes>
  4. <!--
  5. isolation="DEFAULT" 隔离级别
  6. propagation="REQUIRED" 传播行为
  7. read-only="false" 只读
  8. timeout="-1" 过期时间
  9. rollback-for="" -Exception
  10. no-rollback-for="" +Exception
  11. -->
  12. <tx:method name="transfer" propagation="REQUIRED"/>
  13. </tx:attributes>
  14. </tx:advice>

配置aop事务

  1. <aop:config>
  2. <aop:pointcut expression="execution(表达式)" id="pointcut1"/>
  3. <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
  4. </aop:config>

发表评论

表情:
评论列表 (有 0 条评论,300人围观)

还没有评论,来说两句吧...

相关阅读