本文介绍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将代理工厂存入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/开启二级缓存CachingExecutor)实际执行sql
CachingExecutor.query() 先从缓存获取,缓存没有从db查询。此缓存为mappedStatement(configuration.mappedStatements)级别的缓存,又称二级缓存。此缓存为全局缓存,不同sqlsession会话可共用。



