(二)MyBatis延迟加载,一级缓存,二级缓存
延迟加载配置:
什么时候用延迟加载?比如现在有班级和学生表,一对多关系,你可能只需要班级的信息,而不需要该班级学生的信息,这时候可以进行配置,让查询时先查询到班级的信息,在之后需要学生信息时候,再进行查询,避免不必要的查询。
需要进行如下配置:这里以一对多为例,其他关系类似:
PersonMapping.xml
<select id="selectPersonByClassId" resultMap="class_person_map" parameterType="int">
select * from class where classId=#{id}
</select>
<resultMap id="class_person_map" type="class">
<id column="classId" property="classId"/>
<result property="number" column="number"/>
<collection property="persons" ofType="person" select="mappers.ClassMapper.queryPersonByClassId" column="classId">
</collection>
</resultMap>
注意我们的映射,只映射了班级id和班级Number两个信息,并没有映射学生信息,而是通过<cllection>来配置的,标签属性
select:当需要persons属性时,执行select值所对应的id的sql语句进行查询(mappers.ClassMapper,xml)
column:执行sql语句时传入的参数
mappers.ClassMapper.xml
当需要班级学生信息时,会通过select属性来寻找到指定id的sql语句查询,如下
<select id="queryPersonByClassId" parameterType="int" resultType="Person">
select * from person where classId=#{classid}
</select>
之后设置断点调试可以看到只有调用了Class.getPersons()方法才会执行查询学生的sql语句。
一级缓存:
当通过一个SqlSession对象查询到一个数据时,MyBatis会将该数据放入该sqlsession当中,当下一次再次查询该数据时,会从该sqlsession直接取得该数据,不需要再与数据库交互查询,自动开启。不过注意第二次查询必须也是在同一个SQLSESSION之下进行的。
二级缓存:
myBatis内置的:
接上面,通过一个SQLSession对象查询到了一个数据,不仅会放入一级缓存,还会放入二级缓存当中。当你下一次通过另一个不同的SQLSEssion对象查询相同的数据时,会从二级缓存当中进行获取,不过查询时SQLSession必来自同一个mapper.class。
总的来说两句话:一级缓存同一个sqlsession,二级缓存同一个mapper.class初始化的,即同一个namespace,是否进入缓存就是依据这个判断的。
开启配置方式:
config.xml:
<setting name="cacheEnabled" value="true"/>
mapper,xml
<cache/>
另外二级缓存是将数据进行序列化的,所以必要要让开启二级缓存的对象继承序列化接口才行。序列化就是将数据从内存放入到硬盘之中。
即给mapper.xml对应的指定class 加上
implements Serializable
而且如果当前mapper对应的class继承了其他类或者里面有级联属性,其他类或者级联属性也必须要序列化。
相当于序列化三个:本类,父类,级联属性
一级缓存二级缓存的缓存时机:
一级缓存只要查询了就放入一级缓存当中,相当于是实时的,
二级缓存是在一个sqlsession.close()之后才会将该sqlsession所查询到的放入到二级缓存当中。
示例:
//加载配置信息
Reader reader = Resources.getResourceAsReader("config.xml");
//connection
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//第一个sqlsession
SqlSession sqlSession = sessionFactory.openSession();
PersonMapping personMapping = sqlSession.getMapper(PersonMapping.class);
personMapping.selectPersonById();
System.out.println("---");
sqlSession.close();
//第二个sqlsession
SqlSession sqlSession2 = sessionFactory.openSession();
PersonMapping personMapping2 = sqlSession2.getMapper(PersonMapping.class);
personMapping2.selectPersonById();
sqlSession2.close();
执行后,查看日志可以看到只执行了一条sql语句,PersonMapping.class共享同一个二级缓存
清理缓存:commit()会清除缓存(一级二级都是的),另外注意这个commit()不能是查询自身的commit,即这个commit所属于的sqlsession对象必须是执行了增删改的sqlsession。
(二)MyBatis延迟加载,一级缓存,二级缓存的更多相关文章
- Mybatis 的一级、二级缓存?
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 C ...
- Mybatis 的一级、二级缓存?
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 C ...
- mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache
1.1 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 s ...
- 【mybatis源码学习】mybtias一级,二级缓存
转载:https://www.cnblogs.com/ysocean/p/7342498.html mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSessi ...
- Mybatis一级、二级缓存
Mybatis一级.二级缓存 一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...
- MyBatis(七):MyBatis缓存详解(一级缓存/二级缓存)
一级缓存 MyBatis一级缓存上SqlSession缓存,即在统一SqlSession中,在不执行增删改操作提交事务的前提下,对同一条数据进行多次查询时,第一次查询从数据库中查询,完成后会存入缓 ...
- mybatis 使用redis实现二级缓存(spring boot)
mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...
- Hibernate 再接触 一级缓存 二级缓存 查询缓存
缓存 就是把本来应该放在硬盘里的东西放在内存里 将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的 (适合经常访问,数据量有限,改动不大) 很多的se ...
- hibernate的获取session的两方法比较,和通过id获取对象的比较,一级缓存二级缓存
opensession与currentsession的联系与区别 在同一个线程中opensession的session是不一样的,而currentsession获取的session是一样的,这就保证了 ...
随机推荐
- git:rebase的原理
git:rebase的原理 前提: 在最近的项目中,我碰到这样一个情况:第一版app上线之后,团队紧接着进行第二版本的开发,由于团队成员对git使用不熟悉,所以开发的每一次提交都是往远端master分 ...
- mysql oracle sql获取树 父级 子级 及自己
select * from ( select t.*,d.TABLE_NAME,d.QUERY_SQL,d.data_control_col,d.id table_id,d.where_sql fro ...
- Idea 注册方式,亲测可用
参考:https://www.cnblogs.com/aacoutlook/p/9036299.html 2018年3月 <License server>方式不能使用了,只好尝试<A ...
- Fabric1.4:运行 first-network 网络
说明:运行 first-network 网络,必须先安装好 fabric1.4 的预置环境,fabric1.4 的安装可以参考此博文:https://www.cnblogs.com/zongmin/p ...
- Django框架初体验
前言 从今天开始学习测试开发知识,并会把每一次学习的过程和成果记录到博客,由于我也没怎么接触过python相关的开发框架,所以前期应该是艰难的,但是我相信努力就会有收获,如果你和我一样是个小白,那我们 ...
- 前端笔记6-js2
1.break 和continue用法 break结束本次循环,如果想结束外层循环,可以通过这个label来指定要结束的循环. continue可以用来跳过当次循环,如果想跳过外次循环,也可以通过这个 ...
- OA系统、ERP系统、CRM系统的区别和联系有哪些?企业该如何使用?
我们经常听到很多企业会花重金购买适合企业的ERP.OA和CRM系统,使得公司的管理运营更加高效有序,节省公司运营成本,带来更大的经济效益,但实际上很多人员都不太理解他们之间的区别和联系是什么,到底该如 ...
- java中implements和extends的区别
1,extends是继承某个类的,可以使用某个类的方法,也可以重写父类的方法. 2,implements是用于实现类接口,可以实现一个或多个类的接口,接口的方法一般为空的,所以必须重写这一个或多个的方 ...
- GoldenGate DB11gr2配置手册
GoldenGate DB11gr2配置手册 源端数据库配置 1.1源端数据库打开Archive Log: SQL>shutdown immediate; SQL>startup moun ...
- 龙芯2f 8089D 笔记本 Debian 系统安装配置
版权声明:原创文章,未经博主允许不得转载 正文主要讲述安装社区版Debian6镜像(也有7和8,方法大同小异) 最后简单介绍了网络安装原版Debian 小记 非网络安装,没网也没事,再也不用担心网速度 ...