Mybatis源码
2022-06-07 20:57:50 11 举报
AI智能生成
Mybatis源码
作者其他创作
大纲/内容
缓存
一级缓存
一级缓存默认会启用,想要关闭一级缓存可以在select标签上配置flushCache=“true”
一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询时, MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map对象中。如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当 Map 缓存对象中己经存在该键值时,则会返回缓存中的对象;
任何的 INSERT 、UPDATE 、 DELETE 操作都会清空一级缓存;
二级缓存
二级缓存存在于 SqlSessionFactory 的生命周期中,可以理解为跨sqlSession;缓存是以namespace为单位的,不同namespace下的操作互不影响。
setting参数 cacheEnabled,这个参数是二级缓存的全局开关,默认值是 true,如果把这个参数设置为 false,即使有后面的二级缓存配置,也不会生效;
使用二级缓存容易出现脏读,建议避免使用二级缓存,在业务层使用可控制的缓存代替更好;
组成部分
1.SqlSessionFactoryBuilder
读取配置信息创建SqlSessionFactory,建造者模式,方法级别生命周期;
读取配置信息创建SqlSessionFactory,建造者模式,方法级别生命周期;
2.SqlSessionFactory:创建Sqlsession,工厂单例模式,存在于程序的整个生命周期;
3.SqlSession:代表一次数据库连接,一般通过调用Mapper访问数据库,也可以直接发送SQL执行, ;线程不安全,要保证线程独享(方法级);
4.SQL Mapper:由一个Java接口和XML文件组成,包含了要执行的SQL语句和结果集映射规则。方法级别生命周期;
源码
1.日志模块
子主题
1.这里使用适配器设计模式,整合三方log,三方log没有统一标准日志输出api
2.打印日志的地方
ConnectionLogger:通过代理Connection,做增强提供日志打印功能
PreparedStatementLogger 这里同理代理设计模式
ResultSetLogge 同理
3.核心功能
1.整合三方日志比如logj,sl4j等,通过统一的顶层接口log进行日志交互
2.整合mybatis,创建数据库连接,创建prepareStatement等动态代理对象,
在操作sql的一些关键步骤上打印log便于开发查找问题
在操作sql的一些关键步骤上打印log便于开发查找问题
2.数据源模块分析
常见的数据源组件都实现了javax.sql.DataSource接口
工厂的设计模式
组成模块
DataSource:数据源接口,JDBC 标准规范之一,定义了获取获取Connection 的方法;
UnPooledDataSource:不带连接池的数据源,获取连接的方式和手动通过JDBC 获取连接的方式是一样的
PooledDataSource:带连接池的数据源,提高连接资源的复用性,避免频繁创建、关闭连接资源带来的开销
DataSourceFactory:工厂接口,定义了创建Datasource 的方法
UnpooledDataSourceFactory:工厂接口的实现类之一,用于创建UnpooledDataSource(不带连接池的数据源);
PooledDataSourceFactory:工厂接口的实现类之一,用于创建PooledDataSource(带连接池的数据源)
3.缓存模块分析
4.反射模块分析
5.核心流程
1.初始化阶段(读取XML配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化的工作)
时序图
1.XMLConfigBuilder
解析mybatis-config.xml
2.XMLMapperBuilder
解析*.mapper.java
3.XMLStatementBuilder
解析*.mapper.xml
2.代理阶段(封装iBatis的编程模型,使用mapper接口开发的初始化工作)
3.数据读写阶段(通过SqlSession完成SQL的解析,参数的映射、SQL的执行、结果的解析过程)
7.Executor(mybatis 操作数据库实际上还是依靠这个来进行数据库操作)
BaseExecutor
simpleExecutor
batchExecutor
ReuseExecutor
closedExecutor
CacheingExecutor
MapperBuilderAssistant
Configuration
Mybatis启动初始化的核心就是将所有xml配置文件信息加载到Configuration对象中
Configuration是单例的,生命周期是应用级的
Mybatis启动初始化的核心就是将所有xml配置文件信息加载到Configuration对象中
Configuration是单例的,生命周期是应用级的
组成部分
1.MapperRegistry
mapper接口动态代理工厂类的注册中心。在MyBatis中,通过mapperProxy实现InvocationHandler接口
MapperProxyFactory用于生成动态代理的实例对象
MapperProxyFactory用于生成动态代理的实例对象
2.resultMaps
用于解析mapper.xml文件中的resultMap节点,使用ResultMapping来封装id,result等子元素
3.mappedStatements
用于存储mapper.xml文件中的select、insert、update和delete节点,同时还包含了这些节点的很多重要属性
4.SqlSource
用于创建BoundSql,mapper.xml文件中的sql语句会被解析成BoundSql对象,
经过解析BoundSql包含的语句最终仅仅包含?占位符,可以直接提交给数据库执行
经过解析BoundSql包含的语句最终仅仅包含?占位符,可以直接提交给数据库执行
0 条评论
下一页