您现在的位置是:首页 >技术杂谈 >Spring:Spring 整合 MyBatis 的具体过程网站首页技术杂谈
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
来代替。SqlSessionTemplate
是 MyBatis-Spring 的核心。作为 SqlSession
的一个实现,这意味着可以使用它无缝代替代码中已经在使用的 SqlSession
。 SqlSessionTemplate
是线程安全的,可以被多个 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. 总结
- 继承
SqlSessionDaoSupport
类后,可以调用getSqlSession()
方法得到一个SqlSessionTemplate
; - 进行的改变有:
- 实现类中,不需要定义
SqlSession
属性; - 注册实现类时,属性由
SqlSession
变为sqlSessionFactory
; - 通用配置文件中,不需要注册
sqlSessionTemplate
对象。
- 实现类中,不需要定义
四、事务
1. 概述
-
事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题;
-
MyBatis-Spring 借助了 Spring 中的
DataSourceTransactionManager
来实现事务管理,而不是给 MyBatis 创建一个新的专用事务管理器; -
在事务处理期间,一个单独的
SqlSession
对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚; -
事务配置好了以后,MyBatis-Spring 将会透明地管理事务,这样在 DAO 类中就不需要额外的代码了。
-
Spring 中事务管理的方式有两种:
- 【推荐】声明式事务:是 AOP 的一个应用,代码是横切入进去的,不影响原有代码;
- 编程式事务:需要在代码中进行事务的管理,会改变原有代码。
2. 没有事务时
没有事务时,如下图所示,如果想让方法中的代码出错时,进行回滚,则需要进行事务,接下来用声明式事务来实现。
结果
3. 声明式事务
在通用配置文件中实现声明式事务的步骤:
- 在头文件中,除了 aop、context 约束外,再导入 tx 约束;
- 配置声明式事务;
- 结合 AOP 实现事务的织入:
- 配置事务通知(也就是切面,Spring 提供的);
- 配置事务切入(设置切入点和执行环绕增加)。
这样通过设置后,在切入点处都会存在事务,测试
改正错误,执行成功
4. 总结
- 配置声明式事务时注意:
- 传入的
DataSource
可以是任何能够与 Spring 兼容的 JDBCDataSource
,包括连接池和通过 JNDI 查找获得的DataSource
; - 为事务管理器指定的
DataSource
必须和用来创建SqlSessionFactoryBean
的是同一个数据源,否则事务管理器无法工作。
- 传入的
- 配置事务通知时注意:
- 要指定给哪些方法配置事务:其中
name
必须与接口中的方法名一致,可以用通配符*
表示全部方法; - 要指定事务的传播特性
propagation
:默认为 REQUIRED。
- 要指定给哪些方法配置事务:其中
- 配置事务切入包括设置切入点和执行环绕增加;
- MyBatis 管理事务通过核心配置文件中的事务管理器,Spring 管理事务通过以上配置。
注意:
- MyBatis-Spring 官方文档:http://mybatis.org/spring/zh/index.html
- 使用数据库之前先在 IDEA 中连接上数据库。
- 注册 bean 就是在创建对象,
getBean
就是从容器中获取对象。 - 真正的实现类是编写 sql 语句的
UserMapper.xml
文件,而自己写的实现类相当于代替了原来的测试代码,最后还是 mapper 执行方法,执行的是UserMapper.xml
文件的方法。