简介
类
- org.apache.ibatis.session
Configuration
全局配置类SqlSession
数据库连接Session接口DefaultSqlSession
包含部分方法如下- insert 基于update实现
- update
- select
- delete
- commit
- rollback
- SqlSessionFactory 从流中读取mapper并初始化
- SqlSessionFactoryBuilder 参考下文org.apache.ibatis.builder,主要是创建SqlSessionFactory
- SqlSessionManager 实现了 SqlSessionFactory 和 SqlSession
- builder
XMLMapperBuilder
编译xml类型mapper,保存到ConfigurationMapperAnnotationBuilder
编译注解类型mapper,保存到Configuration
- executor
BaseExecutor
抽象类SimpleExecutor
BaseStatementHandler
抽象的Statement处理器,有以下3中不同类型的执行器SimpleStatementHandler
PreparedStatementHandler
CallableStatementHandler
- reflection
Reflector
获取实体的Get/Set方法(会和字段类型做对应)并缓存
入口
1 | String resource = "mybatis-config.xml"; |
- 关于SqlSessionFactory的初始化(会读取配置文件)
- 手动实现
- 通过 mybatis 原生API创建 SqlSessionFactory:
new SqlSessionFactoryBuilder().build()
(配置文件中需要配置数据源) - 基于 mybatis-spring 提供的 SqlSessionFactory 创建bean (数据源由spring提供)
- 通过@Bean定义返回
new org.mybatis.spring.SqlSessionFactoryBean();
在执行getObject()返回对象时,会执行其buildSqlSessionFactory方法进行构建 - 此时需要自己设置 Interceptor、DatabaseIdProvider 等属性
- 还需定义一个 SqlSessionTemplate 的bean
- 通过@Bean定义返回
- 通过 mybatis 原生API创建 SqlSessionFactory:
- 通过 mybatis-spring-boot-starter 的自动装配
- 在 MybatisAutoConfiguration#sqlSessionFactory 中定义的 SqlSessionFactoryBean
- 且包含了@ConditionalOnMissingBean注解,即优先使用自定义的
- 基于mybatis-plus的自动装配(mybatis-plus-boot-starter)
- 在 MybatisPlusAutoConfiguration#sqlSessionFactory 中定义的 MybatisSqlSessionFactoryBean
- 且包含了@ConditionalOnMissingBean,即优先使用自定义的
- 如果使用mybatis-plus, 则无需引入mybatis-spring-boot-starter; 如果引入两个,得看new SqlSessionFactory是谁的,从而决定执行MapperProxy还是MybatisMapperProxy代理对象
- 手动实现
mybatis
sql-xml文件解析
- mybatis + mybatis-spring-boot-starter 类似 mybatis-plus 的初始化
- mybatis-plus会在初始化自身时进行sql xml文件扫描并解析,参考mybatis-plus初始化
1 | // 每个sql xml文件会实例化一个 XMLMapperBuilder 进行解析 |
SQL语句执行流程
1 | public class DefaultSqlSession implements SqlSession { |
- SimpleExecutor
1 |
|
- Configuration
1 | public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { |
插件机制
- MyBatis 将插件单独分离出一个模块,位于 org.apache.ibatis.plugin 包中,在该模块中主要使用了两种设计模式:代理模式和责任链模式
- MyBatis 插件模块中最核心的接口就是 Interceptor 接口
1 | public interface Interceptor { |
- 代理对象
1 | public class Plugin implements InvocationHandler { |
- 组装责任链
1 | // 在Configuration对象中实例化 |
相关类
- MappedStatement 映射对象
- 枚举
- SqlCommandType: INSERT/UPDATE/DELETE/SELECT…
- StatementType: STATEMENT/PREPARED/CALLABLE
- ResultSetType: DEFAULT/FORWARD_ONLY/SCROLL_INSENSITIVE/SCROLL_SENSITIVE
mybatis-spring-boot-autoconfigure(mybatis-spring-boot-starter)
1 | // ... |
mybatis-spring
- mybatis可以脱离spring运行,如果整合spring则需要增加
mybatis-spring
依赖。原本入口可如上文手动定义,接入spring之后,通过定义@MapperScan
即可自动扫描mapper注册成bean @MapperScan
- 使用:一般在springboot主类(或任何配置类)上注解
@MapperScan({"cn.aezo.**.mapper"})
表明需要扫码的包 - 原理参考下文源码截取
- 主要由于@MapperScan注解上有一行
@Import({MapperScannerRegistrar.class})
,从而以MapperScannerRegistrar
为入口对mybatis进行初始化 - 而MapperScannerRegistrar实现了
ImportBeanDefinitionRegistrar
接口从而通过registerBeanDefinitions方法注册Bean。参考spring.md#@Import给容器导入一个组件
- 主要由于@MapperScan注解上有一行
- 使用:一般在springboot主类(或任何配置类)上注解
SqlSessionFactoryBean
实现接口InitializingBean
作用是spring初始化的时候会执行(实现了InitializingBean接口的afterPropertiesSet方法)ApplicationListener
作用是在spring容器执行的各个阶段进行监听,为了容器刷新的时候,更新sqlSessionFactory,可参考onApplicationEvent方法实现FactoryBean
表示这个类是一个工厂bean,通常是为了给返回的类进行加工处理的,而且获取类返回的是通过getObj返回的
mybatis-spring源码
1 | // 1.MapperScan注解中通过 @Import({MapperScannerRegistrar.class}) 进行bean注册 |
- SqlSessionTemplate
1 | public class SqlSessionTemplate implements SqlSession, DisposableBean { |
mybatis-plus
mybatis-plus初始化
mybatis-plus-boot-starter
mybatis-plus-boot-starter
模块下的spring.factories
1 | # Auto Configure |
MybatisPlusAutoConfiguration.java
- springboot自动初始化此类
1 |
|
MybatisSqlSessionFactoryBean
- MybatisSqlSessionFactoryBean (构建SqlSessionFactory)
1 | public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> { |
XMLMapperBuilder
- org.apache.ibatis.builder.xml.XMLMapperBuilder
- 解析mapper xml,并将mapper接口通过MybatisMapperProxy包装并注册到MybatisMapperRegistry中
- 见上文sql-xml文件解析
MybatisMapperRegistry
1 | // com.baomidou.mybatisplus.core |
MybatisConfiguration
1 | public class MybatisConfiguration extends Configuration { |
查询流程
1 | // testMapper基于mybatis-plus定义,**在spring-ioc实例化时注入的是 MybatisMapperProxy 代理对象** |