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注册器,维护着ClassMapperProxyFactory 的对应关系,提供getMapperyaddMapper的方法。

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;//是否是原始值

 

 

 

 

 

 

 

 

 

posted @ 2021-03-11 18:02  majingyun  阅读(87)  评论(0编辑  收藏  举报