• Spring JDBC与JdbcTemplate对象。
  • 声明式事务配置方式。
  • 声明式事务其中事务传播行文。

    1、Spring JDBC

  • Spring JDBC是Spring框架用于处理关系型数据库的模块。

  • Spring JDBC对JDBC API进行封装,极大简化了开发工作量JdbcTemplate是Spring JDBC核心类,提供数据CRUD方法。
  • 有MyBatis为什么还需要Spring JDBC?两者面向的对象不一样
    • MyBatis作为一个ORM框架,封装的程度较高(意味着执行的效率相对较低),适合中小企业进行软件的敏捷开发,方便程序员快速的完成与数据库的交互工作。
    • Spring JDBC只是对原始的JDBC的API进行了封装,一线大厂多使用像Spring JDBC这样轻量级的封装框架。结合自己企业的特点进行二次封装,执行效率相比较MyBatis是较高的,由于底层是Spring IOC容器,也不会像原生JDBC那样难以管理
    • Spring JDBC是介于ORM框架和原生JDBC的一个折中的选择
  • Spring JDBC的使用步骤

    • Maven工程引入Spring-JDBC
    • applicationContext.xml配置DataSource数据源
    • 在Dao中注入JdbcTemplate对象,实现数据CRUD

      2、JdbcTemplate实现增删改查

  • JdbcTempalte的数据查询方法 ```java package com.imooc.spring.jdbc.dao;

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

import javax.print.attribute.standard.JobName; import java.util.List; import java.util.Map;

public class EmployeeDao {

  1. private JdbcTemplate jdbcTemplate;
  2. public JdbcTemplate getJdbcTemplate() {
  3. return jdbcTemplate;
  4. }
  5. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  6. this.jdbcTemplate = jdbcTemplate;
  7. }
  8. public Employee findById(Integer eno) {
  9. /**
  10. * 进行指定的查询,将唯一返回的数据转换为指定的对象
  11. * new BeanPropertyRowMapper:将Bean的属性和每一行的列进行一一对应
  12. */
  13. String sql = "select * from employee where eno=?";
  14. /**
  15. * 查询单条数据
  16. */
  17. Employee employee = jdbcTemplate.queryForObject(sql, new Object[]{eno}, new BeanPropertyRowMapper<Employee>(Employee.class));
  18. return employee;
  19. }
  20. public List<Employee> findByDname(String dname) {
  21. String sql = "select * from employee where dname=?";
  22. /**
  23. * 查询复合数据,第一个参数是sql,第二个参数是占位符参数,第三个参数是转换的对象
  24. */
  25. List<Employee> list = jdbcTemplate.query(sql, new Object[]{dname}, new BeanPropertyRowMapper<Employee>(Employee.class));
  26. return list;
  27. }
  28. /**
  29. * queryForList,默认在没有实体类的情况下,也可以得到正确的结果,非常常见
  30. * @param dname
  31. * @return
  32. */
  33. public List<Map<String, Object>> findMapByDname(String dname) {

// String sql = “select eno as empno,salary as s from employee where dname=?”; String sql = “select from employee where dname=?”; /*

  1. * queryForList:将查询结果作为列表返回,同时默认将每一条记录按Map对象进行包裹
  2. * 不管有没有对应的实体属性,都将其放入到Map中,每一个map对应了一条记录
  3. */
  4. List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, new Object[]{dname});
  5. return maps;
  6. }

}

  1. - JdbcTemplate的数据写入操作(jdbcTempalte.update()泛指所有写入的操作)
  2. ```java
  3. /**
  4. * 新增
  5. * @param employee
  6. * @return
  7. */
  8. public Integer insert(Employee employee) {
  9. String sql = "insert into employee (eno,ename,salary,dname,hiredate) values (?,?,?,?,?)";
  10. int i = jdbcTemplate.update(sql, new Object[]{employee.getEno(), employee.getEname(), employee.getSalary(), employee.getDname(), employee.getHiredate()});
  11. return i;
  12. }
  13. public Integer update(Employee employee) {
  14. String sql = "UPDATE `employee` SET `ename` = ?, `salary` = ?, `dname` = ?, `hiredate` = ? WHERE `eno` = ?;\n";
  15. int i = jdbcTemplate.update(sql, new Object[]{employee.getEname(),employee.getSalary(),employee.getDname(),employee.getHiredate(),employee.getEno()});
  16. return i;
  17. }
  18. public Integer delete(Integer id) {
  19. String sql = "DELETE FROM employee where eno=?";
  20. int i = jdbcTemplate.update(sql, new Object[]{id});
  21. return i;
  22. }

3、Spring事务管理

  • 事务是一种可靠的、一致的方式,访问和操作数据库的程序单元(要么把事情做完,要么什么都不做,不要做一半)。
  • 事务依赖与数据库实现,MySql通过事务区作为数据缓冲地带
  • 在Spring中使用事务的方式有两种,一种名为编程式事务(使用程序代码手动控制,什么时候提交?什么时候回滚?transactionManager事务管理器),另一种名为声明式事务,

    3.1、编程式事务

  • 编程式事务是指通过代码手动提交回滚事务的事务控制方法

  • Spring JDBC通过TransactionManager事务管理器实现事务控制
  • 事务管理器提供commit/rollback方法进行事务的提交与回滚。

    3.2、声明式事务(环绕通知的一种典型情况)

  • 声明式事务指在不修改源代码的情况下通过配置形式自动实现事务控制,声明式事务的本质就是AOP环绕通知

  • 当目标方法执行成功时,自动提交事务
  • 当目标方法抛出运行时异常时,自动事务回滚。
  • 声明式事务的配置过程

    • 配置TransactionManager事务管理器(用于提交或者回滚事务)
    • 配置事务通知与事务属性
    • 为事务绑定PointCut切点

      3.3、事务传播行为

  • 事务传播行为是指多个拥有事务的方法在嵌套调用时的事务控制方法

  • XML:
  • 注解:@Transactional(propagation=Propagation.REQUIRED) | 事务传播类型 | 说明 | | —- | —- | | PROPAGATION_REQUIRED(默认)(90%) | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中,这是最常见的选择 | | PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行(有就用,没有就不用) | | PROPAGATION_REQUIRED_NEW(采用多事务的方式,将子方法运行在子事务中)子方法中的事务独立存在,独立处理 | 新建事务,如果当前存在事务,就把当前事务挂起(主事务在子事务执行时挂起,子事务执行完毕后,主事务就会恢复继续执行),和主事务无关。 | | PROPAGATION_NOT_SUPPORTED(用在查询的方法上,以非事务方式执行) | 以非事务方式执行,如果当前存在事务,就把当前事务挂起 | | PROPAGATION_MANDATORY | 使用当前事务,如果当前没有事务,就抛出异常 | | PROPAGATION_NAVER(几乎不用) | 以非事务方式执行,如果当前存在事务,就抛出异常 | | PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |

4、总结与回顾

  • Spring JDBC与JdbcTemplate对象
    • Spring JDBC是Spring框架用于处理关系型数据库的模块
    • Spring JDBC对JDBC API进行封装,极大简化开发工作量
    • JdbcTemplate是Spring JDBC核心类,提供数据CRUD方法
    • Spring JDBC 的使用
      • Maven工程引入依赖spring-jdbc
      • applicationContext.xml配置DataSource数据源,配置JdbcTemplate的Bean
      • 在Dao注入JdbcTemplate对象,实现数据CRUD
    • JDBCTemplate对象的查询方法
      • 查询单个对象的时候使用queryForObject()
      • 查询List转换为实体类对象的时使用query()方法
      • 无法进行实体对象映射的时候,可以利用queryForList、queryForSet完成数据查询,每一条记录都是一个Map对象
      • 数据的写入只有一个方法,update(),区别只是它们的SQL不一样而已。
  • 编程式事务与声明式事务
    • 编程式事务
      • 编程式事务是指通过代码手动提交回滚事务的事务控制方法。
      • Spring JDBC通过TransactionManager事务管理器实现事务控制。
      • 事务管理器提供commit/rollback方法进行事务的提交和回滚
    • 声明式事务
      • 声明式事务指在不修改源码的情况下通过配置形式自动实现事务控制,声明式事务本质就是AOP环绕通知。
      • 当目标方法执行成功时,自动提交事务。
      • 当目标方法抛出运行时异常时,自动事务回滚。
      • 配置过程
        • 配置TransactionManager事务管理器
        • 配置事务通知与事务属性
        • 为事务通知绑定PointCut
  • 声明式事务七种事务传播行为
    • 事务传播行为是指多个拥有事务的方法在嵌套调用是的事务控制方式
  • 基于注解进行声明式事务
    • 在XML中启用注解形式声明式事务<``tx``:annotation-driven ``transaction-manager``="transactionManager"``/>
    • 在类或者方法上加上@Transactional