Spring:Spring 整合 MyBatis 的具体过程

文章目录

  • Spring:Day 04
  • 整合 MyBatis
  • 一、配置环境
    • 1. 导入依赖
    • 2. 准备一个数据库
  • 二、用 Spring 整合 MyBatis
    • 1. 编写通用配置文件
    • 2. 编写实现类
    • 3. 编写 Spring 配置文件
    • 4. 测试
    • 5. 分析总结
  • 三、拓展
    • 1. 实现
    • 2. 总结
  • 四、事务
    • 1. 概述
    • 2. 没有事务时
    • 3. 声明式事务
    • 4. 总结
  • 注意:

Spring:Day 04

整合 MyBatis

MyBatis 使用的代码整理:点此进入。

本文 Spring-MyBatis 中使用的代码整理:点此进入。

MyBatis-Spring 官方文档:点此进入。

Spring:Spring 整合 MyBatis 的具体过程_第1张图片

一、配置环境

1. 导入依赖

需要导入的依赖如下


<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>8.0.16version>
dependency>


<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.5.7version>
dependency>


<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-webmvcartifactId>
    <version>5.3.18version>
dependency>


<dependency>
    <groupId>org.aspectjgroupId>
    <artifactId>aspectjweaverartifactId>
    <version>1.9.6version>
dependency>


<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-jdbcartifactId>
    <version>5.3.23version>
dependency>


<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatis-springartifactId>
    <version>2.0.6version>
dependency>


<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.12version>
dependency>


<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
    <version>1.18.24version>
dependency>

2. 准备一个数据库

Spring:Spring 整合 MyBatis 的具体过程_第2张图片


二、用 Spring 整合 MyBatis

1. 编写通用配置文件

引入外部配置文件

需要注册的 bean

  • dataSource 对象:DriverManagerDataSource 类创建;
  • sqlSessionFactory 对象:SqlSessionFactoryBean 类创建;
  • sqlSessionTemplate 对象:SqlSessionTemplate 类创建。

<context:property-placeholder ignore-unresolvable="true" location="classpath:db.properties"/>


<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${drive}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
bean>


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath:com/Sun3285/dao/*.xml"/>
bean>


<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    
    <constructor-arg index="0" ref="sqlSessionFactory"/>
bean>

Spring:Spring 整合 MyBatis 的具体过程_第3张图片

2. 编写实现类

实现类实现接口,重写了业务方法,有两个作用

  • 创建 mapper 对象;
  • 通过 mapper 对象执行方法。

通过实现类中方法的返回值可以看到,是 mapper 又执行了方法,可以理解为这个实现类相当于加了一层,把之前测试类的代码封装了。

在原来,我们的所有操作,都使用 SqlSession 来执行;在现在,用 sqlSessionTemplate 来代替。SqlSessionTemplateMyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替代码中已经在使用的 SqlSessionSqlSessionTemplate线程安全的,可以被多个 DAO 或映射器所共享使用。

Spring:Spring 整合 MyBatis 的具体过程_第4张图片

3. 编写 Spring 配置文件

导入通用配置文件、注册实现类对象到容器中

Spring:Spring 整合 MyBatis 的具体过程_第5张图片

4. 测试

Spring:Spring 整合 MyBatis 的具体过程_第6张图片

出现错误一

Spring:Spring 整合 MyBatis 的具体过程_第7张图片

错误一的改正方法:修改外部配置文件中的键,改为 jdbc.xxx

Spring:Spring 整合 MyBatis 的具体过程_第8张图片

出现错误二

Spring:Spring 整合 MyBatis 的具体过程_第9张图片

错误二的改正方法:在 Spring 通用配置文件中注册 mapper 时,将通配符 * 修改为具体的 xml 文件,或者将 classpath 改为 classpath*,这样路径中再使用通配符就不报错了。

改正错误后,最终运行成功

Spring:Spring 整合 MyBatis 的具体过程_第10张图片

5. 分析总结

用 Spring 整合 MyBatis 过程中,用 Spring 配置文件注册 bean 代替了原先所有的创建对象,也可以通过绑定 MyBatis 来代替 MyBatis 核心配置文件中的各种配置,但是一般会在 MyBatis 配置文件中留下设置和别名管理

  • Spring 配置文件注册 dataSource 管理数据源,代替了原先:MyBatis 核心配置文件中配置环境管理数据源

Spring:Spring 整合 MyBatis 的具体过程_第11张图片

  • 绑定 MyBatis 后,可以在 Spring 配置文件中进行各种配置,代替了原先:MyBatis 核心配置文件中的各种配置,如注册 mapper

Spring:Spring 整合 MyBatis 的具体过程_第12张图片

  • 注册 sqlSessionFactory 对象,代替了原先:在工具类中创建 sqlSessionFactory 对象

Spring:Spring 整合 MyBatis 的具体过程_第13张图片

  • 注册 sqlSessionTemplate 对象,代替了原先:在测试类中创建 sqlSession 对象

Spring:Spring 整合 MyBatis 的具体过程_第14张图片

  • 注册自定义实现类对象,该实现类中封装了方法,代替了原先:在测试类中创建 mapper 对象,用 mapper 对象执行方法

Spring:Spring 整合 MyBatis 的具体过程_第15张图片


三、拓展

在编写实现类时,可以继承 SqlSessionDaoSupport 类。

作用:可以用来提供 SqlSession:通过调用 getSqlSession() 方法得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法。

Spring:Spring 整合 MyBatis 的具体过程_第16张图片

1. 实现

编写实现类

Spring:Spring 整合 MyBatis 的具体过程_第17张图片

注册 bean

Spring:Spring 整合 MyBatis 的具体过程_第18张图片

测试

Spring:Spring 整合 MyBatis 的具体过程_第19张图片

2. 总结

  1. 继承 SqlSessionDaoSupport 类后,可以调用 getSqlSession() 方法得到一个 SqlSessionTemplate
  2. 进行的改变有:
    • 实现类中,不需要定义 SqlSession 属性;
    • 注册实现类时,属性由 SqlSession 变为 sqlSessionFactory
    • 通用配置文件中,不需要注册 sqlSessionTemplate 对象。

四、事务

1. 概述

  1. 事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题;

  2. MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理,而不是给 MyBatis 创建一个新的专用事务管理器;

  3. 在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚

  4. 事务配置好了以后,MyBatis-Spring 将会透明地管理事务,这样在 DAO 类中就不需要额外的代码了。

  5. Spring 中事务管理的方式有两种:

    • 推荐声明式事务:是 AOP 的一个应用,代码是横切入进去的,不影响原有代码
    • 编程式事务:需要在代码中进行事务的管理,会改变原有代码

2. 没有事务时

没有事务时,如下图所示,如果想让方法中的代码出错时,进行回滚,则需要进行事务,接下来用声明式事务来实现。

Spring:Spring 整合 MyBatis 的具体过程_第20张图片

结果

Spring:Spring 整合 MyBatis 的具体过程_第21张图片

3. 声明式事务

通用配置文件中实现声明式事务的步骤

  • 头文件中,除了 aop、context 约束外,再导入 tx 约束;
  • 配置声明式事务
  • 结合 AOP 实现事务的织入
    • 配置事务通知(也就是切面,Spring 提供的);
    • 配置事务切入(设置切入点和执行环绕增加)。

Spring:Spring 整合 MyBatis 的具体过程_第22张图片

Spring:Spring 整合 MyBatis 的具体过程_第23张图片

这样通过设置后,在切入点处都会存在事务,测试

Spring:Spring 整合 MyBatis 的具体过程_第24张图片

改正错误,执行成功

Spring:Spring 整合 MyBatis 的具体过程_第25张图片

4. 总结

  1. 配置声明式事务时注意
    • 传入的 DataSource 可以是任何能够与 Spring 兼容的 JDBC DataSource,包括连接池和通过 JNDI 查找获得的 DataSource
    • 为事务管理器指定的 DataSource 必须和用来创建 SqlSessionFactoryBean 的是同一个数据源,否则事务管理器无法工作。
  2. 配置事务通知时注意
    • 要指定给哪些方法配置事务:其中 name 必须与接口中的方法名一致,可以用通配符 * 表示全部方法
    • 要指定事务的传播特性 propagation默认为 REQUIRED
  3. 配置事务切入包括设置切入点执行环绕增加
  4. MyBatis 管理事务通过核心配置文件中的事务管理器,Spring 管理事务通过以上配置。

Spring:Spring 整合 MyBatis 的具体过程_第26张图片


注意:

  1. MyBatis-Spring 官方文档:http://mybatis.org/spring/zh/index.html
  2. 使用数据库之前先在 IDEA 中连接上数据库。
  3. 注册 bean 就是在创建对象getBean 就是从容器中获取对象
  4. 真正的实现类是编写 sql 语句的 UserMapper.xml 文件,而自己写的实现类相当于代替了原来的测试代码,最后还是 mapper 执行方法,执行的是 UserMapper.xml 文件的方法。

你可能感兴趣的:(#,Spring,spring,mybatis,java,事务,后端)