使用myBatis访问数据库原理

本文介绍mybatis访问数据库的流程以及其插件原理。

一、myBatis的使用

1、mybatis配置文件如下

2、sql文件

3、访问数据库代码如下

二、下面是配置文件解析流程

构建DefaultSqlSessionFactory对象

new SqlSessionFactoryBuilder().build(reader);

使用XMLConfigBuilder进行配置文件解析

解析sql配置文件

XMLMapperBuilder解析sql文件

org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement

       构建以 namespace+”.”+sqlId 为key、MappedStatement为value的map。存储在Configuration对象的mappedStatements中。

创建dao代理工厂

MapperRegistry.addMapper将代理工厂存入configuration.mapperRegistry.knownMappers中(以class对象为key,代理工厂对象为value)

MapperProxyFactory代理工厂创建代理对象的方法

MapperProxy代理执行invoke方法

至此,通过解析配置文件,BaseBuilder.configuration对象中已经保存了sql信息、dao接口的代理信息。

三、下面是sql的执行过程

sessionFactory.openSession()
此方法获取sqlSession对象,包含了前面解析的配置信息以及Executor执行器。其中Executor的代理对象封装了插件逻辑

sqlSession.getMapper(IncomeRouterDao.class)
通过dao接口的class对象从knownMappers中获取其代理工厂并创建代理对象

MapperProxy.invoke()
通过代理对象的invoke方法执行sql

 

DefaultSqlSession.selectList()
查询单条/多条数据最终执行都是执行selectList方法
从configuration.mappedStatements获取到statement对象后,使用executor代理(默认SimpleExecutor+BaseWExecutor/开启二级缓存CachingExecutor)实际执行sql

CachingExecutor.query()
先从缓存获取,缓存没有从db查询。此缓存为mappedStatement(configuration.mappedStatements / namespace)级别的缓存,又称二级缓存。二级缓存为全局namespace级别缓存,不同sqlsession会话可共用。

 

BaseExecutor.query() 
未开启二级缓存/二级缓存未获取到,则从一级缓存或DB中查询。
一级缓存对象localCache是executor的成员变量。而从executor(SimpleExecutor)的创建过程可以看出,每次sessionFactory.openSession()都会new一个executor对象。因此每次openSession()都是使用新的一级缓存对象,即一级缓存是sqlsession级别的缓存。

SimpleExecutor.doQuery()
后续即是使用jdbc进行数据库查询,不再继续深入

四、总结

1、通过解析mybatis-config.xml及sqlMapper.xml文件,保存以namespace+sqlId为key、mappedStatement为value的Map(configuration.mappedStatements);保存以namespace的class对象为key、MapperProxyFactory代理工厂为value的Map(configuration.mapperRegistry.knownMappers)。

2、opensession()开启会话时创建实际执行的Executor代理对象,封装一级二级缓存、插件逻辑。

3、执行时通过dao接口(namespace)以及执行方法(sqlId)从knownMappers中拿到代理工厂创建代理对象执行sql语句。

4、开启二级缓存的情况下查询顺序为:二级缓存(namespace级别)-->一级缓存(sqlsession级别)-->数据库。

5、后续会继续补充mybatis的插件执行流程,待续。。

参考:聊聊MyBatis缓存机制 - 美团技术团队

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值