Mybatis框架总结

Mybatis主要可以分为四大组件Executor、StatementHandler、ParameterHandler、ResultHandler

第一阶段:使用动态代理获取xxxMapper
sqlSession.getMapper(xxxMapper.class)时会去Configuration下的mapperRegistry获取到对应的Mapper代理对象
里面是通过jdk动态代理来代理这个接口,最终返回的是一个代理对象

第二阶段:获取MapperMethod对象
调用getUserById(1L)时,由于调用的是UserMapper的代理对象,最终会调用invoke方法
在invoke方法中会识别是否调用的的object方法,是的话直接调用
不是则判断是否调用default方法,是的话直接调用对应方法
如果都不是则准备创建MapperMethod对象
MapperMethod对象会先从缓存中获取,如果没有则取创建并维护到methodCache缓存中
其中MapperMethod主要包含了SqlCommand和MethodSignature两个对象
SqlCommand保存了MapperStatement唯一标识id和sql命令类型,如select、update、delete
MethodSignature保存了方法的签名和元数据信息,比如返回的类型、入参等

 

第三阶段:根据sql类型调用对应方法
1.在获取到MapperMethod对象后,开始执行查询
2.查询会根据sqlCommand的类型进行调用不同方法,比如select、update、delete
3.在select中有executorForMany、executorForMap等,这里是查询一个对象
4.首先会将参数进行解析,最终格式为json格式,然后调用sqlSession.selectOne(command.getName,param)

第四阶段:查询前的缓存处理
在mybatis中有分一级缓存、二级缓存,所以在调用sqlSession.selectOne的时候会先查询
根据cacheKey,先在mapper二级缓存查询,没有则在sqlSession一级缓存中查询,如果有则从缓存中取,否则执行查询语句并维护到一二级缓存中

第五阶段:开始执行查询操作
在上一步中在一二级中都没有找到缓存,则会调用queryFromDatabase执行真正的查询操作
调用的是SimpleExecutor的doQuery()方法
利用Configuration构建一个StatementHandler(PreparedStatement)
调用StatementHandler.prepare()对sql预编译(占位符?)
然后根绝StatemnetHandler执行原生的jdbc查询,就是ps.execute();
 

第六阶段:将得到的结果集转为POJO
execute之后调用handlerResultSet对结果集进行处理
通过xml中配置的ResultMap或自动映射规则name->属性进行映射列和属性
遍历结果集,然后通过反射构建对象并将ResultSet中的值set到POJO对象中
最终得到一个POJO的一个集合,然后通过list.get(0)返回我们最终查询到的对象
 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值