Mybatis框架分析(读源码)

  • 层次结构

 

基础架构层大体一共可以分为三层,分别是基础支撑层,数据处理层,接口层。

基础支撑层:负责最基本的基础功能支撑,包括连接管理,失误管理,配置加载,缓存处理。这些都是共用的东西,将他们抽取出来最为最基础的组件,为上层数据处理层提供最基础的支撑。

数据处理层:负责具体的SQL查找,SQL解析,SQL执行,和执行结果的映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库,接口层一接收到请求就会调用数据处理层来完成具体的数据处理。

  • 源码解析

注:绿色字体的文本是类名,蓝色字体的文本是方法/属性名

Configuration类,是框架的核心配置类,保存了包括映射器、别名、映射方法等信息
  1. 框架如何初始化?
SqlSessionFactoryBuilder.build(InputStream inputStream, String environment,Properties properties)
XMLConfigBuilder.parseConfiguration(XNode root)解析核心配置,赋值给configuration对象
XMLConfigBuilder.settingsElement(Properties props)
XMLConfigBuilder.typeAliasesElement(XNode parent)
XMLConfigBuilder.environmentsElement(XNode context)
XMLConfigBuilder.mapperElement(XNode parent)
Configuration.addMappers(String packageName)
MapperRegistry.addMappers(String packageName)
MapperRegistry.addMappers(String packageName, Class<?> superType)扫描dao包,把mapper接口添加到注册表对象
MapperRegistry.addMapper(Class<T> type)
 
 
 

  1. 如何映射数据类型?
Configuration.typeHandlerRegistry属性
TypeHandlerRegistry.<init>()注册各种java->数据库的类型处理器
Configuration.typeAliasRegistry属性
TypeAliasRegistry.<init>()注册各种基本类型的别名
 

  1. 如何创建SqlSession?
DefaultSqlSessionFactory.openSession()
DefaultSqlSessionFactory.openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)创建Executor执行器,是Mybatis内的核心对象,负责执行SQL语句(总负责人)
Mybatis默认用的是Simple执行器这个实现类
1.缓存如何起作用?

一级缓存:又叫本地缓存,为SqlSession/Statement级别(localCacheScope控制)。默认打开。
二级缓存:又叫全局缓存,为Mapper级别。第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。默认打开,但需要XML<cache> 标签配合。【缓存命中率】
 
BaseExecutor.update(MappedStatement ms, Object parameter)Mybatis的一级缓存,内部用的是HashMap
BaseExecutor.query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)查询之前先去缓存找,找不到就去查数据库,查到就顺便放入缓存
 
CachingExecutor.update(MappedStatement ms, Object parameterObject)
CachingExecutor.query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)查询之前先去缓存找,找不到就去查数据库,查到就顺便放入缓存
 
BaseExecutor使用localCache,在相同Session中查询同一条数据时,只有第一次会真正从数据库中查询,后续的查询都会直接从Session内的缓存中获取。而且,我们从上述相关源码中知道,只要SqlSession存在,该缓存是永远存在,不会失效。
 
mybatis缓存是本地缓存,也就是说可能造成A机器修改了,但是B机器还是用缓存的脏数据问题,因此在分布式/集群项目架构中使用不多。
  1. 如何执行insert/update/delete?
DefaultSqlSession.update(String statement, Object parameter)
BaseExecutor.update(MappedStatement ms, Object parameter)
SimpleExecutor.doUpdate(MappedStatement ms, Object parameter)
StatementHandler.update(Statement statement)
 
  1. 如何执行查询?
BaseExecutor.query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)
BaseExecutor.queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)
SimpleExecutor.doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)
StatementHandler.query(Statement statement, ResultHandler resultHandler)
PreparedStatementHandler.query(Statement statement, ResultHandler resultHandler)
 

                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值