mybatis执行流程
2024-10-28 14:44:05 0 举报
mybatis执行流程
作者其他创作
大纲/内容
解析size
创建PerpetualCache类型的类对象
解析type属性
解析配置类之前:注册一些常用的别名
举例:这是一个缓存
二级缓存
SqlSessionFactoryBuilder#build
是
parsed = true
缓存防穿透(对缓存加锁)没有获取锁的线程进入同步等待对列
在这里如果有缓存节点则会创建缓存
多个插件如何创建代理和调用
默认是LRU
二级缓存查询
引用数目(默认是1024)需要根据对象大小和运行环境中可用内存资源来设置
<databaseIdProvider type=\"DB_VENDOR\"> <property name=\"SQL Server\" value=\"sqlserver\"/> <property name=\"DB2\" value=\"db2\"/> <property name=\"Oracle\" value=\"oracle\" /> <property name=\"MySql\" value=\"mysql\" /> </databaseIdProvider>解析到:org.apache.ibatis.session.Configuration#databaseId
如果开启缓存,则返回CachingExecutor然后调用所有的拦截器对象
mapperElement(root.evalNode(\"mappers\"))
到这一步还没有解析this.parsed = false
<properties resource=\"mybatis/db.properties\" />解析到org.apache.ibatis.parsing.XPathParser#variablesorg.apache.ibatis.session.Configuration#variables
通过反射修改MappedStatement中的sqlsource
解析完之后将缓存加入到Configuration
configuration.newExecutor
只读(默认是false)
new XMLConfigBuilder将xml文件解析成Configuration
缓存中保存了当前的命名空间
解析配置文件
Properties settings = settingsAsProperties(root.evalNode(\"settings\"));
反射获取LoggingCache构造器
将XML配置文件构建为Configuration配置类
二层包装secondCache:Cache:loggingCache
解析到org.apache.ibatis.session.Configuration#typeAliasRegistry.typeAliases 除了自定义的,还有内置的(内置的,在new configuration()时已经指定)
Yes
设置解析标志
如果类型不是PerpetualCache,则不会使用装饰器模式需要自己自定义
loadCustomVfs(settings);--->加载自定义的文件系统(基本没用过)
查询缓存
以上就是将配置类(重点是mapper的解析)解析成Configuration,然后封装给SqlSessionFactory的实例
最后包装进去的最新调用(装饰器模式+责任链模式)
CachingExecutor#query
解析我们的mybatis环境 <environments default=\"dev\"> <environment id=\"dev\"> <transactionManager type=\"JDBC\"/> <dataSource type=\"POOLED\"> <property name=\"driver\" value=\"${jdbc.driver}\"/> <property name=\"url\" value=\"${jdbc.url}\"/> <property name=\"username\" value=\"root\"/> <property name=\"password\" value=\"Zw726515\"/> </dataSource> </environment> <environment id=\"test\"> <transactionManager type=\"JDBC\"/> <dataSource type=\"POOLED\"> <property name=\"driver\" value=\"${jdbc.driver}\"/> <property name=\"url\" value=\"${jdbc.url}\"/> <property name=\"username\" value=\"root\"/> <property name=\"password\" value=\"123456\"/> </dataSource> </environment> </environments> 解析到:org.apache.ibatis.session.Configuration#environment 在集成spring情况下由 spring-mybatis提供数据源 和事务工厂
XMLMapperBuilder#parse()
插件
1
版本:mybatis-3.5.3
<typeHandlers> <typeHandler handler=\"org.mybatis.example.ExampleTypeHandler\"/> </typeHandlers>解析到:org.apache.ibatis.session.Configuration#typeHandlerRegistry.typeHandlerMap
databaseIdProviderElement(root.evalNode(\"databaseIdProvider\"));
Executor类型的拦截器
解析blocking
transactionFactory.newTransaction
No
4
以下是mybatis的二级缓存原理
propertiesElement(root.evalNode(\"properties\"));
解析readOnly
prepareStatement这一步拿到数据库连接也就是说StatementHandler的拦截器代理是在拿到数据库连接之前设置的
如何调用
configurationElement(parser.evalNode(\"/mapper\"))
解析mapper
创建LruCache类型的类对象
解析mybatis环境
默认不设置,仅仅在调用语句时刷新自定义设置:正整数,单位ms
解析插件
environmentsElement(root.evalNode(\"environments\"));
2
到这里配置文件已经解析成Configuration
这里是通过装饰器模式包装了Cache
如果是true:返回相同的对象,但是不能修改,性能高如果是false:返回对象的copy,可以修改,安全性高
ParameterHandlerResultSetHandler
MapperProxy#invoke
数据源 执行器
SqlSession session = sqlSessionFactory.openSession()
默认是PERPETUAL
pluginElement(root.evalNode(\"plugins\"));
thirdCache#getObject--->secondCache(delegate)#getObjectloggingCache(delegate)#getObjectcache1(delegate)#getObject
解析flushInterval刷新间隔
解析类型处理器节点
接下来分析两个方法1、parser.parse()2、build()
openSession()------>newExecutor
cache!=null
解析setting节点
typeAliasesElement(root.evalNode(\"typeAliases\"));
解析mybatis-config.xml
获取事务工厂,得到事务
解析数据库厂商
分页插件实例
创建sql执行器对象
mapperParser.parse()
3
缓存查询
具体可以配置哪些属性:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings
二级缓存结果为空
1、将方法对象封装成MapperMethod2、MapperMethod#execute
动态代理调用
loadCustomLogImpl(settings);指定日志的具体实现未指定时自动查找:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING解析到org.apache.ibatis.session.Configuration#logImpl
缓存过期策略:1、LRU: 最近最少使用,移除最长时间不被使用的对象2、FIFO: 先进先出,按对象进入缓存的顺序来移除他们3、SOFT:软引用,基于垃圾回收器状态和软引用规则移除对象4、WEAK:弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
解析别名
JDK动态代理
XMLConfigBuilder#parseConfiguration(parser.evalNode(\"/configuration\"))
三层包装thirdCache:Cache:secondCache
解析根节点也是解析的开始
查询数据库放入缓存
executor.query--->configuration.newStatementHandler-->prepareStatement
1、解析配置类2、解析mapper
流程分析完毕
解析eviction属性缓存过期策略
一层包装loggingCache:Cache:cache1
插件作用有:分页,读写分离....
缓存创建
解析properties节点
typeHandlerElement(root.evalNode(\"typeHandlers\"));
<mappers> <mapper resource=\"mybatis/mapper/EmployeeMapper.xml\"/> <mapper class=\"com.tuling.mapper.DeptMapper\"></mapper> <package name=\"com.tuling.mapper\
解析<cache ></cache>
为了统一:流程中只分析默认类型
开始
解析mapper.xml
获取SqlSession之后需要去执行我们的sql分两种方式执行sql
插件集成:为接口创建代理
parseConfiguration
XMLConfigBuilder#parse()
插件的解析注入
通过构造器实例化LoggingCache
装饰器模式,包装了一层事务缓存(事务控制,执行增删改时,清空缓存)
解析mapper就是解析sql
mybatis插件设置代理过程
提交sql给数据库
0 条评论
下一页