Spring - JdbcTemplate事务操作

事务概念

JDBC数据库的事务处理

搭建事务操作环境

调用
调用
创建
创建
Service
创建转账的方法
调用Dao的两个方法
多钱
少钱
Dao
创建两个方法
  1. 创建数据库表,添加记录

    idusernamemoney
    1lucy1000
    2mary1000
  2. 创建service,搭建dao,完成对象创建和注入关系
    (1)service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource

    @Service
    public class UserService {
         //注入 dao
         @Autowired
         private UserDao userDao;
    }
    @Repository
    public class UserDaoImpl implements UserDao {
         @Autowired
         private JdbcTemplate jdbcTemplate;
    }
    
  3. 在 dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)

    @Repository
    public class UserDaoImpl implements UserDao {
         @Autowired
         private JdbcTemplate jdbcTemplate;
         //lucy 转账 100 给 mary
         //少钱
         @Override
         public void reduceMoney() {
             String sql = "update t_account set money=money-? where username=?";
             jdbcTemplate.update(sql,100,"lucy");
         }
         //多钱
         @Override
         public void addMoney() {
             String sql = "update t_account set money=money+? where username=?";
             jdbcTemplate.update(sql,100,"mary");
         }
    }
    @Service
    public class UserService {
         //注入 dao
         @Autowired
         private UserDao userDao;
         //转账的方法
         public void accountMoney() {
             //lucy 少 100
             userDao.reduceMoney();
             //mary 多 100
             userDao.addMoney();
         }
    }
    
  4. 上面代码,如果正常执行没有问题的,但是如果代码执行过程中出现异常,有问题

    //转账的方法
    public void accountMoney(){
        //lucy少100
        userDao.reduceMoney();
    
        //模拟异常
        int i= 10/0
    
        //mary 多 100
        userDao.addMoney();
    }
    

    (1)上面问题如何解决呢?

    • 使用事务进行解决

    (2)事务操作过程

    public void accountMoney(){
        try{
            //第一步 开启事务
            //第二步 进行业务操作
            //lucy少100
            userDao.reduceMoney();
    
            //模拟异常
            int i= 10/0
    
            //mary 多 100
            userDao.addMoney();
            //第三步 没有发生异常,提交事务
        }catch(Exception e){
            //第四步 出现异常,事务回滚
        }
    }
    

事务操作

Spring 事务管理介绍

  1. 事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)
  2. 在 Spring 进行事务管理操作
    (1)有两种方式:编程式事务管理和声明式事务管理(使用)
  3. 声明式事务管理
    (1)基于注解方式(使用)
    (2)基于 xml 配置文件方式
  4. 在 Spring 进行声明式事务管理,底层使用 AOP 原理
  5. Spring 事务管理 API
    (1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
    接口:PlatformTransactionManager实现类见IDE自动解析

注解声明式事务管理

  1. 在 spring 配置文件配置事务管理器
    <!--创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <!--注入数据源-->
         <property name="dataSource" ref="dataSource"></property>
    </bean>
    
  2. 在 spring 配置文件,开启事务注解
    (1)在 spring 配置文件引入名称空间 tx
    <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:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                                    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
                                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    (2)开启事务注解
    <!--开启事务注解-->
    <tx:annotation-driven transactionmanager="transactionManager"></tx:annotation-driven>
    
  3. 在 service 类上面(或者 service 类里面方法上面)添加事务注解
    (1)@Transactional,这个注解添加到类上面,也可以添加方法上面
    (2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务
    (3)如果把这个注解添加方法上面,为这个方法添加事务
    @Service
    @Transactional
    public class UserService {
        ......
    }
    

声明式事务管理参数配置

  1. 在 service 类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
    (1)propagation:事务传播行为
    (2)isolation:事务隔离级别
    (3)timeout:超时时间
    (4)readOnly:是否只读
    (5)rollbackFor:回滚
    (6)noRollbackFor:不回滚
  2. propagation:事务传播行为
    (1)多事务方法直接进行调用,这个过程中事务 是如何进行管理的
    Spring框架事务传播行为有7种
    传播属性描述
    REQUIRED如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
    REQUIRED_NEW当前的方法必须启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该讲它挂起
    SUPPORTS如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中
    NOT_SUPPORTS当前的方法不应该运行在事务中。如果有运行的事务,将它挂起
    MANDATORY当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常
    NEVER当前的方法不应该运行在事务中。如果有运行的事务,就抛出异常
    NESTED如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则,就启动一个新的事务,并在它自己的事务内运行
    @Service
    @Transactiona(propagation = Propagation.REQUIRED)
    public class UserService{
        ......
    }
    
  3. isolation:事务隔离级别
    关于事务的隔离级别的介绍见MySQL事务、视图、变量、存储过程和函数、流程控制结构
    @Service
    @Transactiona(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
    public class UserService{
        ......
    }
    
  4. timeout:超时时间
    (1)事务需要在一定时间内进行提交,如果不提交进行回滚
    (2)默认值是 -1 ,设置时间以秒单位进行计算
  5. readOnly:是否只读
    (1)读:查询操作,写:添加修改删除操作
    (2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作
    (3)设置 readOnly 值是 true,设置成 true 之后,只能查询
  6. rollbackFor:回滚
    (1)设置出现哪些异常进行事务回滚
  7. noRollbackFor:不回滚
    (1)设置出现哪些异常不进行事务回滚

XML 声明式事务管理

  1. 在 spring 配置文件中进行配置
    第一步 配置事务管理器
    <!--1 创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <!--注入数据源-->
         <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    第二步 配置通知
    <!--2 配置通知-->
    <tx:advice id="txadvice">
         <!--配置事务参数-->
         <tx:attributes>
             <!--指定哪种规则的方法上面添加事务-->
             <tx:method name="accountMoney" propagation="REQUIRED"/>
            <!--<tx:method name="account*"/>-->
         </tx:attributes>
    </tx:advice>
    
    第三步 配置切入点和切面
    <!--3 配置切入点和切面-->
    <aop:config>
         <!--配置切入点-->
         <aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"/>
         <!--配置切面-->
         <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
    </aop:config>
    

完全注解声明式事务管理

创建配置类,使用配置类替代 xml 配置文件

@Configuration //配置类
@ComponentScan(basePackages = "com.atguigu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
     //创建数据库连接池
     @Bean
     public DruidDataSource getDruidDataSource() {
         DruidDataSource dataSource = new DruidDataSource();
         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
         dataSource.setUrl("jdbc:mysql:///user_db");
         dataSource.setUsername("root");
         dataSource.setPassword("root");
         return dataSource;
     }
     //创建 JdbcTemplate 对象
     @Bean
     public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
         //到 ioc 容器中根据类型找到 dataSource
         JdbcTemplate jdbcTemplate = new JdbcTemplate();
         //注入 dataSource
         jdbcTemplate.setDataSource(dataSource);
         return jdbcTemplate;
     }
     //创建事务管理器
     @Bean
     public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
     DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
     transactionManager.setDataSource(dataSource);
     return transactionManager;
     }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值