Mybatis的框架原理:
Mybatis的一级、二级缓存:
(1)一级缓存: 又叫基本缓存,基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
(2)二级缓存:又叫全局缓存,与一级缓存其机制相同,默认也是采用 PerpetualCache,可以自定义存储源,如Ehcache。默认不打开二级缓存,可在它的映射文件中配置 ;
(3)缓存数据更新机制:当一级缓存Session 或者 二级缓存Namespaces的进行了增、删、改操作后,该作用域下所以查询中的缓存讲会clear掉并重新更新(没有更新的称为“脏数据”);
如果是A计算机进行了增、删、改操作后,B计算机还在使用脏数据的问题,这里就需要用到Redis,能够在高并发场景下为应用提供高效的数据访问能力。
Mybatis全局配置文件:
全局配置文件的类容和顺序
Properties(属性)
Settings(全局参数设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境信息集合)
environment(单个环境信息)
transactionManager(事物)
dataSource(数据源)
mappers(映射器)
常见配置详解
properties标签:
<!--配置mybatis的环境信息-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
<environment id="prod">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>
解析配置文件:
private void parseConfiguration(XNode root) {
try {
// 解析<properties>节点
propertiesElement(root.evalNode("properties"));
// 解析<settings>节点
Properties settings = settingsAsProperties(root.evalNode("settings"));
loadCustomVfs(settings);
// 解析<typeAliases>节点
typeAliasesElement(root.evalNode("typeAliases"));
// 解析<plugins>节点
pluginElement(root.evalNode("plugins"));
// 解析<objectFactory>节点
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
// 解析<reflectorFactory>节点
reflectorFactoryElement(root.evalNode("reflectorFactory"));
settingsElement(settings);
// 解析<environments>节点
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
// 解析<mappers>节点
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
待续。。。