1. 缓存机制
1.1概述
MyBatis 包含一个强大的查询缓存特性,可以方便地配置和定制。缓存可极大提升查询效率。
MyBatis系统中默认定义了一级缓存和二级缓存,是一个HashMap,能保存查询出的一些数据
- 默认情况下,只有一级缓存(SqlSession/线程 级别的缓存,也称为本地缓存)开启。
- 二级缓存需要手动开启和配置,他是基于namespace级别的缓存(全局范围的)。
- 为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
1.2 一级缓存
机制
只要是之前查询过的数据,MyBatis 就会保存在一个缓存中(Map),下次获取直接从缓存中拿;
一级缓存失效的几种情况
① 不同的SqlSession对应不同的一级缓存
② 同一个SqlSession但是查询条件不同
③ 同一个SqlSession两次查询期间执行了任何一次增删改操作(会清空缓存)
④ 同一个SqlSession两次查询期间手动清空了缓存
sqlSession.clearCache();
1.3 二级缓存
二级缓存(second level cache),全局作用域缓存
二级缓存默认不开启,需要手动配置
MyBatis提供二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口
二级缓存在 SqlSession 关闭或提交之后才会生效
使用步骤
①全局配置文件中开启二级缓存
<setting name="cacheEnabled" value="true"/>
②需要使用二级缓存的映射文件<mapper>
处使用cache配置缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
③注意:POJO需要实现Serializable
接口
注意事项
① 不会出现一级缓存和二级缓存中有同一个数据。
- 二级缓存中:一级缓存关闭了就有了
- 一级缓存中:二级缓存中没有此数据,就会看一级缓存,一级缓存没有去查数据库;数据库的查询后的结果放在一级缓存中了;
② 任何时候都是先看二级缓存,再看一级缓存,如果大家都没有就去查询数据库(二一库)
③ 每一个dao有其自己的二级缓存
1.4 缓存有关的设置
1.5 第三方缓存整合
2.MBG-逆向工程
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--
MyBatis3Simple:基础版CRUD
MyBatis3:复杂版CRUD
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- jdbcConnection:指导连接到哪个数据库 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis_0325"
userId="root"
password="123456">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- javaModelGenerator:生成pojo
targetPackage:生成的pojo放在哪个包
targetProject:放在哪个工程下
-->
<javaModelGenerator targetPackage="com.atguigu.bean"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--sqlMapGenerator:sql映射文件生成器;指定xml生成的地方 -->
<sqlMapGenerator targetPackage="com.atguigu.dao"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- javaClientGenerator:dao接口生成的地方 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.atguigu.dao"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--
table:指定要逆向生成哪个数据表
tableName="t_cat":表名
domainObjectName="":这个表对应的对象名
-->
<table tableName="t_cat" domainObjectName="Cat"></table>
<table tableName="t_employee" domainObjectName="Employee"></table>
<table tableName="t_teacher" domainObjectName="Teacher"></table>
</context>
</generatorConfiguration>