掘金日新计划 · 8 月更文挑战第5天--spring-编程式事务处理

80 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

事务(Transaction)控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。

1.创建项目

Dingtalk_20220804115138.jpg

2.## applicationContext.xml配置事务

<!--事务管理器-->
<bean id="transationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataScource"/>
</bean>

3.创建EmployeeDao

Dingtalk_20220804114124.jpg

package com.imooc.dao;
import com.imooc.entity.Employee;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class EmployeeDao {
    //引入jdbcTemplate
    public JdbcTemplate jdbcTemplate;
    //创建get
    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }
    //创建set
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }    
    //写入数据
    public void insert(Employee employee) {
        String sql = "insert into employee (eno,ename,salary,dname,hiredate) values (?,?,?,?,?)";
        int num = jdbcTemplate.update(sql, new Object[]{employee.getEno(), employee.getEname(), employee.getSalary(), employee.getDname(), employee.getHiredate()});
        System.out.println(num);
    }
}

4.applicationContext.xml新增配置bean

    <bean id="employeeService" class="com.imooc.service.EmployeeService">
            <property name="employeeDao" ref="employeeDao"/>
<!--        注入 transationManager 对象-->
            <property name="transationManager" ref="transationManager"/>
    </bean>

5.创建entity Employee

数据表有几个字段,就添加对应的属性,并且设置get和set方法 Dingtalk_20220804114431.jpg

6.创建EmployeeService

package com.imooc.service;
import com.imooc.dao.EmployeeDao;
import com.imooc.entity.Employee;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import java.util.Date;
public class EmployeeService {
    public EmployeeDao employeeDao;
    //引入事务并且设置get和set方法
    private DataSourceTransactionManager transationManager;
    public DataSourceTransactionManager getTransationManager() {
        return transationManager;
    }
    public void setTransationManager(DataSourceTransactionManager transationManager) {
        this.transationManager = transationManager;
    }
    public EmployeeDao getEmployeeDao() {
        return employeeDao;
    }
    public void setEmployeeDao(EmployeeDao employeeDao) {
        this.employeeDao = employeeDao;
    }
    public void batchInsert(){
        TransactionDefinition definition = new DefaultTransactionDefinition();
        TransactionStatus status = transationManager.getTransaction(definition);
        try {
            for(int i=0;i<10;i++){
            if(i==3){
              //模拟异常错误
              throw new RuntimeException("错误");
            }
                Employee employee = new Employee();
                employee.setEno(i+1);
                employee.setEname("测试"+i);
                employee.setSalary(500);
                employee.setHiredate(new Date());
                employee.setDname("dev");
                employeeDao.insert(employee);
            }
            //事务成功,直接提交
            transationManager.commit(status);
        }catch (Exception e){
            //产生错误,回滚
            transationManager.rollback(status);
            throw  e;
        }
    }
}

7.查看日志

Dingtalk_20220804115051.jpg