文章目录
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);
}