Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程 | DefaultSqlSession的创建过程

文章详细阐述了Spring如何管理SqlSessionTemplate,以及在MyBatis中SqlSessionTemplate的创建和使用。SqlSessionTemplate是线程安全的,它在MapperProxy中被使用,代理SqlSession执行数据库操作。SqlSession的创建涉及SpringManagedTransactionFactory和Executor的创建,最终通过Executor执行JDBC操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 前言

  • 众所周知😏:MyBatis通过SqlSessionFactory 创建SqlSession去调用Executor执行器进行JDBC数据库操作
  • SqlSession在Mybatis中有DefaultSqlSession、SqlSessionManagger两种实现,其中SqlSessionManagger是线程安全的
  • SqlSessionTemplate是Mybatis为了接入Spring提供的Bean,也是SqlSession的实现,并且是线程安全的
  • 关于DefaultSqlSession为什么不是线程安全可以参考链接

1. Spring对SqlSessionTemplate的管理

1.1. SqlSessionTemplate的创建:
  • 在自动配置的时候会默认创建SqlSessionTemplate并放入IOC容器中,当然前提我们没有手动去配置这个bean
  • SqlSessionTemplate构造函数中会对SqlSession进行代理,也就是SqlSessionTemplate持有SqlSession的代理对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2. MapperProxy中sqlSession的来源:
@Service("sysUserService")
public class SysUserServiceImpl implements SysUserService {

    @Resource
    private SysUserMapper sysUserMapper;

    @Override
    public SysUser queryById(Long id) {
        return sysUserMapper.queryById(id);
    }
}

  • 上一篇文章中有介绍到,属性填充sysUserMapper时,会往IOC容器生成MapperFactoryBean,其类图如下
  • 就意味着,生成MapperFactoryBean也会属性填充sqlSessionFactory和sqlSessionTemplate

在这里插入图片描述

  • 所以从容器中的sqlSessionTemplate属性填充到MapperFactoryBean

在这里插入图片描述

  • 所以通过MapperFactoryBean的getObject创建代理对象时,获取的sqlSession就是sqlSessionTemplate

在这里插入图片描述

2. SqlSessionInterceptor中的getSqlSession

  • 上文知道mapper接口的调用最终会通过sqlSessionTemplate进行调用,而sqlSessionTemplate持有sqlSession的代理对象
  • 那么调用的时候就会触发代理类的invoke方法

在这里插入图片描述

2.1. getSqlSession
  • invoke通过getSqlSession方法拿到DefaultSqlSession实例
  • getSqlSession方法里面处理了sqlSession的线程安全问题(通过ThreadLocal实现)

在这里插入图片描述

2.2. sqlSession的创建:
  • 通过SqlSessionFactory(默认就是自动配置时创建的DefaultSqlSessionFactory)的openSession方法进行创建

在这里插入图片描述

2.2.1. SpringManagedTransactionFactory获取:
  • Mybatis整个Spring中,通过SpringManagedTransaction事务管理类来处理JDBC生命周期
  • SpringManagedTransaction由SpringManagedTransactionFactory进行创建
  • SpringManagedTransactionFactory在自动配置时,已经被封装到配置类里

在这里插入图片描述

2.2.2. SpringManagedTransaction创建:

在这里插入图片描述

2.2.3. Executor创建:

  SqlSession最后是通过执行器Executor执行JDBC操作的

  • 默认的executorType为null,所以会创建SimpleExecutor
  • 默认cacheEnabled为true,所以会创建CachingExecutor来装饰SimpleExecutor,在后续二级缓存中会用到

在这里插入图片描述

<think>嗯,用户想了解Spring Boot集成MyBatis源码执行路径。我得先回忆一下这两者的整合机制。首先,Spring Boot通过自动配置简化了MyBatis的配置,所以应该从自动配置类入手。 记得MyBatis的自动配置类是MybatisAutoConfiguration,这个类会在类路径下存在SqlSessionFactory、SqlSessionFactoryBean等条件满足时生效。接下来,自动配置会创建SqlSessionFactoryBean,这里可能会用到配置属性,比如mapperLocations或者typeAliasesPackage。 SqlSessionFactoryBean实现了FactoryBean接口,所以Spring容器在初始化时会调用getObject()方法创建SqlSessionFactory实例。这个工厂对象是MyBatis的核心,负责创建SqlSession。用户可能想知道SqlSession是怎么被创建的,以及如何与Spring的事务管理结合。 然后,Mapper接口的代理生成过程也很重要。MyBatis使用MapperFactoryBean或者MapperScannerConfigurer来扫描并注册Mapper接口。这里可能需要查看MapperScannerConfigurer是如何工作的,它会将Mapper接口生成代理对象,并注册到Spring容器中。 当执行Mapper方法时,代理对象会调用SqlSession的方法。比如,使用SqlSessionTemplate这个类,它是Spring管理的SqlSession实现,确保每次操作使用正确的SqlSession,并且参与Spring的事务管理。 具体执行SQL的过程,可能涉及到Executor组件,比如SimpleExecutor或者BatchExecutor,这取决于配置。然后通过StatementHandler处理SQL语句,ParameterHandler处理参数,ResultSetHandler处理结果集。 用户可能需要更详细的步骤,比如从调用Mapper方法开始,经过代理对象,到SqlSession,再到Executor执行SQL。需要整理这些关键类之间的调用链,可能还要提到拦截器(Plugins)如何介入执行过程。 另外,要确保提到MyBatis-Spring-Boot-Starter在其中的作用,比如自动配置如何被触发,如何读取application.properties中的配置。还有,事务管理是如何整合的,比如使用Spring的@Transactional注解时,MyBatis如何与Spring事务同步。 可能需要分步骤说明,从启动时的自动配置,到Bean的创建,再到Mapper代理的生成,最后到SQL执行的具体流程。同时,注意源码中的关键点,比如@MapperScan注解的作用,它是如何扫描并注册Mapper接口的。 需要确保用中文,并且按照用户要求的格式,避免使用Markdown,行内公式用$...$,独立公式用$$...$$,但这个问题可能不太涉及数学公式。结构要清晰,分步骤解释,帮助用户理解整个执行路径。</think>Spring Boot集成MyBatis源码执行路径可以分为以下关键步骤(以查询操作为例): 1. **自动配置入口** `MybatisAutoConfiguration`类通过`@EnableConfigurationProperties`注解加载`MybatisProperties`配置类,自动创建`SqlSessionFactory`和`SqlSessionTemplate`(核心控制权移交Spring2. **Mapper接口代理生成** - 通过`@MapperScan`或`MapperScannerConfigurer`扫描Mapper接口 - 使用`MapperFactoryBean`为每个Mapper接口生成JDK动态代理对象(核心类`MapperProxy`) 3. **方法调用入口** ```java UserMapper userMapper = applicationContext.getBean(UserMapper.class); User user = userMapper.selectById(1); // 触发代理逻辑 ``` 实际调用的是`MapperProxy.invoke()`方法 4. **SQL执行链路** `MapperProxy` -> `MapperMethod.execute()` -> `SqlSessionTemplate.selectOne()` (此处包含Spring事务同步管理的关键逻辑) 5. **SQL会话控制** `SqlSessionTemplate`通过`SqlSessionInterceptor`拦截器管理: - 获取会话:从`TransactionSynchronizationManager`获取与当前事务绑定的`SqlSession` - 新建会话:无事务时通过`SqlSessionFactory.openSession()` 6. **执行引擎流转** `DefaultSqlSession` -> `CachingExecutor`(二级缓存处理) -> `BaseExecutor`(一级缓存/事务) -> `SimpleExecutor/ReuseExecutor/BatchExecutor` 7. **SQL解析执行** `StatementHandler`(实现类`RoutingStatementHandler`): - 创建`PreparedStatement` - 参数处理:`ParameterHandler.setParameters()` - 执行查询:`PreparedStatement.execute()` - 结果映射:`ResultSetHandler.handleResultSets()` 8. **结果集映射** 通过`ResultMap`配置和`TypeHandler`完成: ```java while (resultSet.next()) { Object entity = createResultObject(...); applyPropertyMappings(...); // 属性映射 } ``` **关键设计亮点**: - 通过`SqlSessionTemplate`实现线程安全的SqlSession管理($每次操作获取新会话但共享连接$) - `@Transactional`注解通过Spring AOP与`TransactionSynchronizationManager`实现事务一致性 - 插件机制(Interceptor Chain)通过责任链模式实现功能扩展 建议调试时重点关注:`MapperProxy`、`MapperMethod`、`SqlSessionInterceptor`、`CachingExecutor`这四个核心类的方法执行链路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值