mybatis-初探源码
mybatis入门流程
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonDao mapper = sqlSession.getMapper(PersonDao.class);
List<PersonEntity> personEntityList = mapper.queryAll();
personEntityList.forEach(System.out::println);
1.通过 SqlSessionFactoryBuilder 对象 , 基于 配置文件(mybatis-config.xml) 构建
SqlSessionFactory
2.通过 SqlSessionFactory 连接工厂 创建 SqlSession 对象
3.通过 SqlSession 对象过去 Mapper 接口
mapper接口 --> mapper.xml 的 namespace
mapper接口方法- —> mapper.xml 的 id
sqlsession 执行 sql 语句 , 并处理接口
4.执行方法 对应的 sql 语句 , 处理结果
mybatis源码自己第一次梳理
梳理出关键的几个类
- SqlSessionFactoryBuilder
构建 SqlSessionFacotry
- XMLConfigBuilder
通过配置文件生成配置类 Configuration
package org.apache.ibatis.session.Configuration
- KnowMappers
加载的 mapper 接口
key : 对应 mapper 接口全类名
- MapperMethod
封装了 Mapper接口中,对应方法的信息,以及对应 sql 语句的信息
excute方法 : 执行正真的 sql 语句
对应sql的crud , INSERT , UPDATE , DELETE , SELECT
- Excutor
@SuppressWarnings("unchecked")
@Override
public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
/*xxx: 检测当前的 Executor 是否已经关闭 */
if (closed) {
throw new ExecutorException("Executor was closed.");
}
if (queryStack == 0 && ms.isFlushCacheRequired()) {
/*xxx: 非嵌套查询,且 <select> 节点配置的 flushCache 属性为 true ,则会清空一级缓存*/
/*xxx: flushCache 配置项 是影响 一级缓存 结果对象存活时长的一个方面*/
clearLocalCache();
}
List<E> list;
try {
/*xxx: 增加查询层数*/
queryStack++;
list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
if (list != null) {
/*xxx: 针对存储过程调用的处理, 在一级缓存命中时,获取缓存中保存的 输出类型参数, 并设置到用户传入的实参中*/
handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
} else {
/*xxx: 其中会调用 doQuery完成数据库查询,并得到映射后的处理对象*/
list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
}
} finally {
/*xxx: 当前查询完成,查询层数减少*/
queryStack--;
}
if (queryStack == 0) {
/*xxx: 延迟加载的相关内容*/
for (DeferredLoad deferredLoad : deferredLoads) {
deferredLoad.load();
}
// issue #601
/*xxx: 加载完成后,清空 deferredLoads 集合*/
deferredLoads.clear();
if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {
// issue #482
/*xxx: 根据localCacheScope 配置 决定是否清空一级缓存*/
/*xxx: localCacheScope配置 是 影响一级缓存中 结果对象 存活时长的 第二个方面*/
clearLocalCache();
}
}
return list;
}
query 方法参数的含义
ms : 表示映射配置文件中定义的 sql 节点
parameterObject : 查询的参数 , 和动态sql相关
resultHandler: 处理结果集
key:二级缓存 (一般不使用mybatis二级缓存)
boundSql: 该对象的 sql 属性值是需要执行的 sql 语句
mybatis的架构设计
总结方法论
抓住关键点最重要
配置
mapper接口
mapper.xml
StatementHandler
excutor 执行器
tis的架构设计
[外链图片转存中…(img-pTr5z3P1-1654482327614)]
总结方法论
抓住关键点最重要
配置
mapper接口
mapper.xml
StatementHandler
excutor 执行器
ResultHandler