0. 官方文档
1. 完整配置文件示例
1 | <?xml version="1.0" encoding="UTF-8"?> |
2. 构建SqlSessionFactory
2.1 Mybatis的核心组件
类 | 功能 | 生命周期 |
---|---|---|
SqlSessionFactoryBuilder | 根据配置生成SqlSessionFactory | 方法内 |
SqlSessionFactory | 生成SqlSession | Mybatis应用整个生命周期 |
SqlSession | 获取Mapper接口,执行SQL语句 | 一个事务 |
SQL Mapper | 配置SQL语句和对象映射规则 | 方法内 |
2.2 时序图
2.3 核心代码
- SqlSessionFactoryBuilder
1 | public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { |
- DefaultSqlSessionFactory
1 | public class DefaultSqlSessionFactory implements SqlSessionFactory { |
- XMLConfigBuilder
1 | public Configuration parse() { |
3. 映射器的内部组成
3.1 映射器的三个组成部分
MappedStatement:保存映射器的一个节点
SqlSource:提供BoundSql,它是MappedStatement的一个属性
BoundSql:建立SQL和参数
3.2 BoundSql
BoundSql提供三个主要的属性:parameterMappings,parameterObject和sql
parameterObject为参数本身
如果传递的是POJO或Map,那么这个parameterObject就是传入的POJO或Map
如果传递多个参数且没有使用@Param注解,那么Mybatis就会把parameterObject变为一个Map<String, Object>对象,其键值关系按顺序规划,形如:{“1”: param1, “2”: param2}
如果使用了@Param注解,Mybatis会按注解参数建立Map<String, Object>对象
parameterMappings是一个List,每一个元素都是ParameterMapping的对象,用于描述参数
sql属性保存映射器SQL
4. Mapper代理
4.1 时序图
4.2 核心代码
- MapperRegistry
1 | public <T> T getMapper(Class<T> type, SqlSession sqlSession) { |
- MapperProxyFactory
1 | protected T newInstance(MapperProxy<T> mapperProxy) { |
5. SQL执行
5.1 SqlSession下的四大对象
- Executor:由它来调度StatementHandler,ParameterHandler和ResultHandler来执行对应的SQL
- StatementHandler:使数据库的Statement执行操作,在四大对象中处于核心地位,起到承上启下的作用
- ParameterHandler:处理SQL参数
- ResultHandler:进行最后数据集(ResultSet)的封装
5.2 Executor
Mybatis中有三种Executor,由setting元素的defaultExecutorType设置
- SIMPLE:默认
- REUSE:执行器重用预处理语句
- BATCH:重用语句和批量更新
org.apache.ibatis.session.Configuration#newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
1 | public Executor newExecutor(Transaction transaction, ExecutorType executorType) { |
interceptorChain.pluginAll(executor)通过配置的插件生成Executor的代理,改变Executor的行为。
5.3 StatementHandler
StatementHandler处理数据库会话
- org.apache.ibatis.session.Configuration#newStatementHandler
1 | public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { |
RoutingStatementHandler通过适配模式找到对应的StatementHandler
- org.apache.ibatis.executor.statement.RoutingStatementHandler#RoutingStatementHandler
1 | public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { |
5.4 时序图(以一次多记录查询为例)
5.5 核心代码
- MapperProxy
1 |
|
- MapperMethod
1 | public Object execute(SqlSession sqlSession, Object[] args) { |
- DefaultSqlSession
1 |
|
- BaseExecutor
1 |
|
- SimpleExecutor
1 |
|
- BaseStatementHandler
1 |
|
- PreparedStatementHandler
1 |
|
- DefaultParameterHandler
1 |
|
- DefaultResultSetHandler
1 |
|
6. 示例代码
- TestMybatis
1 | import data.User; |
- User
1 | package data; |
- UserMapper
1 | package mapper; |
- UserMapper.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
- mybatis-config.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |