SpringJDBC与事务管理

SpringJDBC与事务管理

  • Spring JDBC是Spring框架用于处理关系型数据库的模块
  • Spring JDBC对JDBC API进行封装, 极大简化开发工作量
  • JdbcTemplate是Spring JDBC核心类, 提供数据CRUD方法

SpringJDBC的使用步骤

  • Maven工程引入依赖spring-jdbc mysql-connector-java spring-context
  • applicationContext.xml配置DataSource数据源, JdbcTemplate核心对象, 还要将之前配置好的DataSrouce数据源注入到JdbcTemplate的dataSrouce属性中
  • 在Dao中注入JdbcTemplate对象, 实现数据CRUD

JdbcTemplate的数据查询方法

  • queryForObject方法
public Employee findById(Integer eno) {
    String sql = "select * from employee where eno = ?";
    // 查询单条数据
    Employee employee = jdbcTemplate.queryForObject(sql, new Object[]{eno}, new BeanPropertyRowMapper<>(Employee.class));
    return employee;
}
  • query方法
public List<Employee> findByDname(String dname) {
    String sql = "select * from employee where dname = ?";
    // 查询复合数据
    List<Employee> list = jdbcTemplate.query(sql, new Object[]{dname}, new BeanPropertyRowMapper<>(Employee.class));
    return list;
}
  • queryForList方法
public List<Map<String, Object>> findMapByDname(String dname) {
    String sql = "select eno as empno, salary as s from employee where dname = ?";
    // 将查询结果作为Map进行封装
    List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, new Object[]{dname});
    return maps;
}

JdbcTemplate的数据写入方法

  • update方法
public void insert(Employee employee) {
    String sql = "insert into employee values(?,?,?,?,?)";
    jdbcTemplate.update(sql, new Object[]{employee.getEno(), employee.getEname(), employee.getSalary(), employee.getDname(), employee.getHiredate()});
}

public int update(Employee employee) {
    String sql = "update employee set ename = ?, salary = ?, dname = ?, hiredate = ? where eno = ?";
    int count = jdbcTemplate.update(sql, new Object[]{employee.getEname(), employee.getSalary(), employee.getDname(), employee.getHiredate(), employee.getEno()});
    return count;
}

public int delete(Integer eno) {
    String sql = "delete from employee where eno = ?";
    int count = jdbcTemplate.update(sql, new Object[]{eno});
    return count;
}

Spring事务管理

什么是事务?

  • 事务是一种可靠的, 一致的方式, 访问和操作数据库的程序单元
  • 事务依赖于数据库实现, MySQL通过事务区作为数据缓冲地带

编程式事务

  • 编程式事务是指通过代码手动提交或回滚事务的事务控制方法
  • SpringJDBC通过TransactionManager事务管理器实现事务控制
  • 事务管理器提供commit/rollback方法进行事务提交与回滚

声明式事务

  • 声明式事务指在不修改源码情况下通过配置形式自动实现事务控制, 声明式事务本质就是AOP环绕通知
  • 当目标方法执行成功时, 自动提交事务
  • 当目标方法抛出运行时异常时, 自动事务回滚
配置过程(XML配置)
  • 配置TransactionManager事务管理器
  • 配置事务通知与事务属性
  • 为事务通知绑定PointCut切点
事务传播行为
  • 事务传播行为是指多个拥有事务的方法在嵌套调用时的事务控制方式
  • XML配置: <tx:method name="..." propagation="REQUIRED"/>
  • 注解: @Transactional(propagation=Propagation.REQUIRED)

事务传播行为七种类型

事务传播类型说明
PROPAGATION_REQUIRED(默认)如果当前没有事务, 就新建一个事务, 如果已经存在一个事务中, 加入到这个事务中. 这是最常见的选择
PROPAGATION_REQUIRES_NEW新建事务, 如果当前存在事务, 把当前事务挂起, 利用新的事务处理方法
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作, 如果当前存在事务, 就把当前事务挂起

剩下几种基本不用

注解配置声明式事务
<!--启用注解形式声明式事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>

@Trasactional 是声明式事务核心注解

放在类上, 将声明式事务配置应用于当前类所有方法, 默认事务传播为REQUIRED

@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
public Employee findById(Integer eno) {
    return employeeDao.findById(eno);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值