mybatis学习(十)——缓存介绍
与Hibernate一样,MyBatis 也提供了一级缓存和二级缓存的支持。
1、一级缓存:(本地缓存)SqlSession级别的缓存,默认一直开启的 ,
与数据库同一次会话期间的数据会放到本地缓存中,以后如果需要相同的数据,直接从缓存中拿,不再查询数据库。
当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
当进行增删改之后,该Session中的所有 Cache 就将清空。
2、二级缓存:基于namespace级别的缓存,一个namespace对应一个二级缓存
可自定义存储源,如 Ehcache。
当 Session flush 或 close 之后,二级缓存仍然可用。
当进行增删改之后,该namespace的所有 Cache 就将清空。
<setting name="cacheEnabled" value="false" />可关闭二级缓存,一级缓存可用。
一、一级缓存
- package com.pjf.mybatis;
- import java.io.IOException;
- import java.io.InputStream;import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.Test;
- import com.pjf.mybatis.dao.HotelMapper;
- import com.pjf.mybatis.po.Hotel;
- public class TestHotel {
- public SqlSessionFactory sqlSessionFactory() throws IOException {
- String resource = "mybatis_config.xml";
- InputStream is = Resources.getResourceAsStream(resource);
- SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
- return sessionFactory;
- }
- /*
- * Mybatis缓存机制
- * 一级缓存:(本地缓存)SqlSession级别的缓存,默认一直开启的
- * 与数据库同一次会话期间的数据会放到本地缓存中
- * 以后如果需要相同的数据,直接从缓存中拿,不再查询数据库
- * 一级缓存的失效情况(需要重新发送sql)
- * 1、sqlSession不同
- * 2、sqlSession相同,查询条件不同
- * 3、sqlSession相同,查询条件相同,但两次查询之间执行了增删改操作
- * 4、sqlSession相同,查询条件相同,手动清除了缓存clearCache()
- */
- @Test
- public void testMybatisCache() throws IOException {
- SqlSessionFactory sessionFactory = sqlSessionFactory();
- SqlSession session = sessionFactory.openSession(true);
- HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
- Hotel hotel = hotelMapper.getHotel(1001);
- System.out.println(hotel);
- //第二次查询,条件一致
- Hotel hotel2 = hotelMapper.getHotel(1001);
- System.out.println(hotel2);
- session.close();
- }
- }
一级缓存在以下四种情况下会失效
- 1、sqlSession不同
- 2、sqlSession相同,查询条件不同
- 3、sqlSession相同,查询条件相同,但两次查询之间执行了增删改操作
- 4、sqlSession相同,查询条件相同,手动清除了缓存clearCache()
二、二级缓存
修改HotalMapper.xml文件
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="com.pjf.mybatis.dao.HotelMapper">
- <!-- cache 缓存开启
- eviction 缓存回售策略
- LRU 最近最少使用的,移除最长时间不被使用的(默认)
- FIFO 先进先出
- SOFT 软引用
- WEAK 弱引用
- flushInterval 缓存刷新间隔
- 缓存清空时间,默认不清空,设置毫秒值
- readOnly 缓存是否只读
- true mybatis只从缓存中毒数据,不会修改数据
- false mybatis认为缓存中的数据会被修改,会用序列化和反序列化技术克隆一份给用户,安全,速度慢
- size 缓存存放多少元素
- type 指定自定义缓存的全类名
- -->
- <cache eviction="LRU" flushInterval="60000" readOnly="false" size="1024" ></cache>
- <resultMap type="com.pjf.mybatis.po.Hotel" id="myHotel">
- <id column="id" property="id" jdbcType="INTEGER" />
- <result column="hotel_name" property="hotelName" jdbcType="VARCHAR" />
- <result column="hotel_address" property="hotelAddress"jdbcType="VARCHAR" />
- <result column="price" property="price" jdbcType="INTEGER" />
- </resultMap>
- <select id="getHotel" resultMap="myHotel">
- select*
- from hotel where id =#{id}
- </select>
- </mapper>
测试类
- package com.pjf.mybatis;
- import java.io.IOException;
- import java.io.InputStream;import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.Test;
- import com.pjf.mybatis.dao.HotelMapper;
- import com.pjf.mybatis.po.Hotel;
- public class TestHotel {
- public SqlSessionFactory sqlSessionFactory() throws IOException {
- String resource = "mybatis_config.xml";
- InputStream is = Resources.getResourceAsStream(resource);
- SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
- return sessionFactory;
- }
- /*
- * 二级缓存:基于namespace级别的缓存,一个namespace对应一个二级缓存
- * 工作机制:
- * 1、一个会话查询一个数据,这个数据会被保存到当前会话的一级缓存中
- * 2、如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话消息,就可以查询二级缓存
- * 3、不同namespace查出来的数据,会被放在自己对应的缓存中
- * 使用:
- * 1、开启全局二级缓存配置 <setting name="cacheEnabled" value="true" />
- * 2、去mapper.xml配置使用二级缓存 <cache></cache>
- * 3、pojo需要实现序列化接口
- */
- @Test
- public void testMybatisCache() throws IOException {
- SqlSessionFactory sessionFactory = sqlSessionFactory();
- SqlSession session = sessionFactory.openSession(true);
- HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
- Hotel hotel = hotelMapper.getHotel(1001);
- System.out.println(hotel);
- //关闭第一次会话
- session.close();
- //第二次查询
- SqlSession session2 = sessionFactory.openSession(true);
- HotelMapper hotelMapper2 =session2.getMapper(HotelMapper.class);
- Hotel hotel2 = hotelMapper2.getHotel(1001);
- System.out.println(hotel2);
- session2.close();
- }
- }
二级缓存使用的时候主要有三步:
- 1、开启全局二级缓存配置 <setting name="cacheEnabled" value="true" />
- 2、去mapper.xml配置使用二级缓存 <cache></cache>
- 3、pojo需要实现序列化接口
mybatis学习(十)——缓存介绍的更多相关文章
- MyBatis学习--查询缓存
简介 以前在使用Hibernate的时候知道其有一级缓存和二级缓存,限制ORM框架的发展都是互相吸收其他框架的优点,在Hibernate中也有一级缓存和二级缓存,用于减轻数据压力,提高数据库性能. m ...
- mybatis学习 十一 缓存
1. 应用程序和数据库交互的过程是一个相对比较耗时的过程2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率3. MyBatis 中默认 SqlSession 缓存(一级缓存)开启 同 ...
- Mybatis学习笔记-缓存
简介 什么是缓存 **将一次查询的结果暂存至内存,后续查询只需查询缓存** 为什么使用缓存 **减少与数据库的交互次数,减少系统开销,提高系统效率** 什么样的数据能使用缓存 **经常查询且不常修改的 ...
- mybatis学习 十二 多表查询
Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...
- mybatis学习 十 动态 SQL
1. 根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...
- mybatis学习 十六 auto_mapping实现连表查询
只能使用多表联合查询方式. 要求:查询出的列别和属性名相同. 点字符 "." 在 SQL 是关键字符,两侧添加反单引号(Tab键上的一个字符) <select id=&q ...
- mybatis学习 十五 resultMap标签 一对多
多次查询,非联合查询版本 <resultMap type="teacher" id="techMap"> <id column="i ...
- mybatis学习 十四 resultMap标签 一对一(联合查询)
1.使用 resultMap 实现关联单个对象(联合查询方式) <resultMap type="Student" id="stuMap1"> &l ...
- Mybatis学习笔记导航
Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...
随机推荐
- self & this 上下文
对象:指向对象的首地址: 函数:代表了函数运行的主要上下文: 内部:在类的内部使用. self Within the body of a class method, self refers to th ...
- Trie入门讲解
我们常常用Trie(也叫前缀树)来保存字符串集合.如下图所示就是一个Trie. 上图表示的字符串集合为$\{a,to,tea,ted,ten,i,in,inn \}$,每个单词的结束位置对应一个“单词 ...
- C#动态数组ArrayList
在C#中,如果需要数组的长度和元素的个数随着程序的运行不断改变,就可以使用ArrayList类,该类是一个可以动态增减成员的数组. 一.ArrayList类的常用属性和方法 1. ArrayList类 ...
- UIViewController 的 edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets属性
1.有时你命名设置了某控件的y坐标为0,确总是被导航栏遮挡住,如下: UILabel *label = [[UILabel alloc] init]; label.text = @"请 ...
- python class 巩固
class 类定义 语法格式如下: class ClassName: <statement-1> ... <statement-N> 类属性与方法 属性 操作属性 getatt ...
- CentOS7下systemd
配置文件: /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/ /run/systemd/system:系统执行过程中所产生的服务脚本, ...
- java上传附件,批量下载附件(一)
上传附件代码:借助commons-fileupload-1.2.jar package com.str; import java.io.BufferedInputStream;import java. ...
- Python之路-时间模块
time模块 import time 时间戳(time.time())--结构化时间(time.localtime)--字符串时间(time.strftime) import time print(t ...
- unix cc编译过程
1.编译并链接一个完全包含与一个源文件的C程序: cc program.c 这条命令产生一个称为a.out的可执行程序.中间会产生一个名为program.o的目标 ...
- excel日期格式取年份
具体思路:先将日期格式更改为常规格式,再取常规格式的前4位数字 例如:A1==1981/12/22 第一步B1=TEXT(A1,"emd") 第二步C1=LEFT(B1,4) 结束