MyBatis源码
MyBites源码
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
Person person = personMapper.getWithoutComplex(2l);
第一阶段:生成动态代理
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
MapperRegistry ,mapper注册器,维护着Class与MapperProxyFactory 的对应关系,提供getMappery和addMapper的方法。
MapperProxyFactory 用于生成MapperProxy的工厂类
final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
第二阶段:获得MapperMethod对象
SqlCommand 实例MapperStateMent对象
第三阶段:根据SQL指令跳转执行语句
采用命令模式选择对应的SQL执行语句。
实际上还是通过sqlSession对象,去运行对象的sql
第四阶段:查询前的缓存处理
步骤一:获得BoundSql
步骤二:生成一二级缓存key
步骤三:开始执行查询操作
第五阶段:执行DB查询操作
DB查询阶段分为四部分:第一部分:进行预编译;第二部分:把具体的值放进去;第三部分:执行查询;第四阶段:把具体的值放到缓存里进行维护。
MyBatis四大组件
Executor
StatementHandler
语句处理器
ParameterHandler
参数处理器
ResultSetHandler
查询结果处理器
第六阶段:针对ResultSet 结果集转换为 POJO
整体处理流程如下:
/** 首先:获得执行后的结果集,并封装到ResultSetWrapper */
ResultSetWrapper rsw = getFirstResultSet(stmt);
从MappedStatement 获得resultMap集合
处理流程如下:
handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, List<Object> multipleResults, ResultMapping parentMapping)
handleRowValues(rsw, resultMap, resultHandler, rowBounds, null);
将数据库操作结果保存到pojo,调用getRowValue();
private static class UnMappedColumnAutoMapping {
private final String column;//列名称
private final String property;//POJO的属性名
private final TypeHandler<?> typeHandler;
private final boolean primitive;//是否是原始值