mybatis结合spring-boot一起使用
- mybatis在spring-boot中使用,
减少代码的地方:
sqlSession的获取
sqlSession的管理:
try {
...
session.commit();
} catch(Exception e) {
e.printStackTrace();
session.rollback();
} finally {
session.close();
}
- 典型的开发方式:
dao/mapper
service
controller
- MyBatis-Spring-Boot-Starter will:
Autodetect an existing DataSource.
Will create and register an instance of a SqlSessionFactory passing that DataSource as an input using the SqlSessionFactoryBean.
Will create and register an instance of a SqlSessionTemplate got out of the SqlSessionFactory.
Autoscan your mappers, link them to the SqlSessionTemplate and register them to Spring context so they can be injected into your beans.
1⃣️ 自动检测已存在的 datasource
2⃣️ 用dataSource创建并注册一个SqlSessionFactoryBean实例
3⃣️ 创建并注册SqlSessionTemplate实例
public class SqlSessionTemplate implements SqlSession, DisposableBean {
看源码:sqlSessionTemplate中用了动态代理,sqlSession接口方法都被代理了,
针对每个sqlSession接口方法, 代理内部都会创建一个sqlSession实例,并由这个新实例接管接口方法的执行。
http://www.mybatis.org/spring/apidocs/org/mybatis/spring/SqlSessionTemplate.html
4⃣️ 自动扫描mappers: 被@Mapper注解
The MyBatis-Spring-Boot-Starter will search, by default, for mappers marked with the @Mapper annotation.
自定义扫描器:
关闭自动扫描:
- SqlSessionTemplate 和 Spring事务管理协同
http://www.mybatis.org/spring/apidocs/org/mybatis/spring/SqlSessionTemplate.html
线程安全,Spring管理,SqlSession与Spring事务管理一起工作,以确保使用的实际SqlSession是与当前Spring事务关联的那个。 此外,它还管理会话生命周期,包括根据Spring事务配置根据需要关闭,提交或回滚会话。
- spring事务管理+ sqlSession事务
http://www.mybatis.org/spring/transactions.html
使用MyBatis-Spring的主要原因之一是它允许MyBatis参与Spring事务。 MyBatis-Spring不是创建特定于MyBatis的新事务管理器,而是利用Spring中现有的DataSourceTransactionManager。
配置Spring事务管理器后,您可以像往常一样在Spring中配置事务。 支持@Transactional注释和AOP样式配置。 将创建单个SqlSession对象并在事务持续时间内使用。 当事务完成时,将适当地提交或回滚此会话。
http://www.mybatis.org/spring/sqlsession.html
With MyBatis-Spring you don't need to use SqlSessionFactory directly because your beans can be injected with a thread safe SqlSession that automatically commits, rollbacks and closes the session based on Spring's transaction configuration.
------- SqlSessionTemplate is the heart of MyBatis-Spring.
http://www.mybatis.org/spring/sqlsession.html
- sqlSessionTemplate:如何保证在一个spring事务中,调用多个mapper,多个mapper都用的是同一个sqlSession
底层用了一个Map集合存储了 事务id和sqlSession实例的映射:
key:value
spring-Transaction-id: sqlSession实例
一个sqlSession对应一个 Connection
而真正在做事的是 Connection: 开启事务、提交事务、回滚事务、关闭流
推断出: 一个spring事务对应一个sqlSession, 而不管事务中调用了哪些mapper和哪些mapper方法。