您现在的位置是:首页 >技术杂谈 >Spring:Spring 整合 MyBatis 的具体过程网站首页技术杂谈

Spring:Spring 整合 MyBatis 的具体过程

Sun 3285 2024-06-20 06:51:33
简介Spring:Spring 整合 MyBatis 的具体过程

Spring:Day 04

整合 MyBatis

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

MyBatis-Spring 官方文档点此进入

一、配置环境

1. 导入依赖

需要导入的依赖如下

<!-- mysql 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.18</version>
</dependency>

<!-- aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>

<!-- spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.23</version>
</dependency>

<!-- mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

<!-- junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

2. 准备一个数据库


二、用 Spring 整合 MyBatis

1. 编写通用配置文件

引入外部配置文件

需要注册的 bean

  • dataSource 对象:DriverManagerDataSource 类创建;
  • sqlSessionFactory 对象:SqlSessionFactoryBean 类创建;
  • sqlSessionTemplate 对象:SqlSessionTemplate 类创建。
<!-- 外部配置文件 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:db.properties"/>

<!-- 注册 dataSource -->
<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>

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

<!-- 注册 sqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <!-- 只能用构造器注入,因为类没有 set 方法 -->
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

2. 编写实现类

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

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

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

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

3. 编写 Spring 配置文件

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

4. 测试

出现错误一

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

出现错误二

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

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

5. 分析总结

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

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

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

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

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

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


三、拓展

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

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

1. 实现

编写实现类

注册 bean

测试

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. 没有事务时

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

结果

3. 声明式事务

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

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

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

改正错误,执行成功

4. 总结

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


注意:

  1. MyBatis-Spring 官方文档:http://mybatis.org/spring/zh/index.html
  2. 使用数据库之前先在 IDEA 中连接上数据库。
  3. 注册 bean 就是在创建对象getBean 就是从容器中获取对象
  4. 真正的实现类是编写 sql 语句的 UserMapper.xml 文件,而自己写的实现类相当于代替了原来的测试代码,最后还是 mapper 执行方法,执行的是 UserMapper.xml 文件的方法。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。