与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" />可关闭二级缓存,一级缓存可用。

一、一级缓存

  1. package com.pjf.mybatis;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import org.junit.Test;
  9.  
  10. import com.pjf.mybatis.dao.HotelMapper;
  11. import com.pjf.mybatis.po.Hotel;
  12.  
  13. public class TestHotel {
  14.  
  15. public SqlSessionFactory sqlSessionFactory() throws IOException {
  16. String resource = "mybatis_config.xml";
  17. InputStream is = Resources.getResourceAsStream(resource);
  18. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
  19. return sessionFactory;
  20. }
  21. /*
  22. * Mybatis缓存机制
  23. * 一级缓存:(本地缓存)SqlSession级别的缓存,默认一直开启的
  24. * 与数据库同一次会话期间的数据会放到本地缓存中
  25. * 以后如果需要相同的数据,直接从缓存中拿,不再查询数据库
  26. * 一级缓存的失效情况(需要重新发送sql)
  27. * 1、sqlSession不同
  28. * 2、sqlSession相同,查询条件不同
  29. * 3、sqlSession相同,查询条件相同,但两次查询之间执行了增删改操作
  30. * 4、sqlSession相同,查询条件相同,手动清除了缓存clearCache()
  31. */
  32.  
  33. @Test
  34. public void testMybatisCache() throws IOException {
  35.  
  36. SqlSessionFactory sessionFactory = sqlSessionFactory();
  37. SqlSession session = sessionFactory.openSession(true);
  38. HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
  39. Hotel hotel = hotelMapper.getHotel(1001);
  40. System.out.println(hotel);
  41. //第二次查询,条件一致
  42. Hotel hotel2 = hotelMapper.getHotel(1001);
  43. System.out.println(hotel2);
  44. session.close();
  45. }
  46. }

一级缓存在以下四种情况下会失效

  1. 1sqlSession不同
  2. 2sqlSession相同,查询条件不同
  3. 3sqlSession相同,查询条件相同,但两次查询之间执行了增删改操作
  4. 4sqlSession相同,查询条件相同,手动清除了缓存clearCache()

二、二级缓存

修改HotalMapper.xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.pjf.mybatis.dao.HotelMapper">
  4. <!-- cache 缓存开启
  5. eviction 缓存回售策略
  6. LRU 最近最少使用的,移除最长时间不被使用的(默认)
  7. FIFO 先进先出
  8. SOFT 软引用
  9. WEAK 弱引用
  10. flushInterval 缓存刷新间隔
  11. 缓存清空时间,默认不清空,设置毫秒值
  12. readOnly 缓存是否只读
  13. true mybatis只从缓存中毒数据,不会修改数据
  14. false mybatis认为缓存中的数据会被修改,会用序列化和反序列化技术克隆一份给用户,安全,速度慢
  15. size 缓存存放多少元素
  16. type 指定自定义缓存的全类名
  17. -->
  18. <cache eviction="LRU" flushInterval="60000" readOnly="false" size="1024" ></cache>
  19.  
  20. <resultMap type="com.pjf.mybatis.po.Hotel" id="myHotel">
  21. <id column="id" property="id" jdbcType="INTEGER" />
  22. <result column="hotel_name" property="hotelName" jdbcType="VARCHAR" />
  23. <result column="hotel_address" property="hotelAddress"jdbcType="VARCHAR" />
  24. <result column="price" property="price" jdbcType="INTEGER" />
  25. </resultMap>
  26.  
  27. <select id="getHotel" resultMap="myHotel">
  28. select*
  29. from hotel where id =#{id}
  30. </select>
  31. </mapper>

测试类

  1. package com.pjf.mybatis;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import org.junit.Test;
  9.  
  10. import com.pjf.mybatis.dao.HotelMapper;
  11. import com.pjf.mybatis.po.Hotel;
  12.  
  13. public class TestHotel {
  14.  
  15. public SqlSessionFactory sqlSessionFactory() throws IOException {
  16. String resource = "mybatis_config.xml";
  17. InputStream is = Resources.getResourceAsStream(resource);
  18. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
  19. return sessionFactory;
  20. }
  21. /*
  22. * 二级缓存:基于namespace级别的缓存,一个namespace对应一个二级缓存
  23. * 工作机制:
  24. * 1、一个会话查询一个数据,这个数据会被保存到当前会话的一级缓存中
  25. * 2、如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话消息,就可以查询二级缓存
  26. * 3、不同namespace查出来的数据,会被放在自己对应的缓存中
  27. * 使用:
  28. * 1、开启全局二级缓存配置 <setting name="cacheEnabled" value="true" />
  29. * 2、去mapper.xml配置使用二级缓存 <cache></cache>
  30. * 3、pojo需要实现序列化接口
  31. */
  32. @Test
  33. public void testMybatisCache() throws IOException {
  34.  
  35. SqlSessionFactory sessionFactory = sqlSessionFactory();
  36. SqlSession session = sessionFactory.openSession(true);
  37. HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
  38. Hotel hotel = hotelMapper.getHotel(1001);
  39. System.out.println(hotel);
  40. //关闭第一次会话
  41. session.close();
  42. //第二次查询
  43. SqlSession session2 = sessionFactory.openSession(true);
  44. HotelMapper hotelMapper2 =session2.getMapper(HotelMapper.class);
  45. Hotel hotel2 = hotelMapper2.getHotel(1001);
  46. System.out.println(hotel2);
  47. session2.close();
  48. }
  49. }

二级缓存使用的时候主要有三步:

  1. 1、开启全局二级缓存配置 <setting name="cacheEnabled" value="true" />
  2. 2、去mapper.xml配置使用二级缓存 <cache></cache>
  3. 3pojo需要实现序列化接口

mybatis学习(十)——缓存介绍的更多相关文章

  1. MyBatis学习--查询缓存

    简介 以前在使用Hibernate的时候知道其有一级缓存和二级缓存,限制ORM框架的发展都是互相吸收其他框架的优点,在Hibernate中也有一级缓存和二级缓存,用于减轻数据压力,提高数据库性能. m ...

  2. mybatis学习 十一 缓存

    1. 应用程序和数据库交互的过程是一个相对比较耗时的过程2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率3. MyBatis 中默认 SqlSession 缓存(一级缓存)开启 同 ...

  3. Mybatis学习笔记-缓存

    简介 什么是缓存 **将一次查询的结果暂存至内存,后续查询只需查询缓存** 为什么使用缓存 **减少与数据库的交互次数,减少系统开销,提高系统效率** 什么样的数据能使用缓存 **经常查询且不常修改的 ...

  4. mybatis学习 十二 多表查询

    Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...

  5. mybatis学习 十 动态 SQL

    1.  根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...

  6. mybatis学习 十六 auto_mapping实现连表查询

    只能使用多表联合查询方式. 要求:查询出的列别和属性名相同. 点字符  "."  在 SQL 是关键字符,两侧添加反单引号(Tab键上的一个字符) <select id=&q ...

  7. mybatis学习 十五 resultMap标签 一对多

    多次查询,非联合查询版本 <resultMap type="teacher" id="techMap"> <id column="i ...

  8. mybatis学习 十四 resultMap标签 一对一(联合查询)

    1.使用 resultMap 实现关联单个对象(联合查询方式) <resultMap type="Student" id="stuMap1"> &l ...

  9. Mybatis学习笔记导航

    Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...

随机推荐

  1. self & this 上下文

    对象:指向对象的首地址: 函数:代表了函数运行的主要上下文: 内部:在类的内部使用. self Within the body of a class method, self refers to th ...

  2. Trie入门讲解

    我们常常用Trie(也叫前缀树)来保存字符串集合.如下图所示就是一个Trie. 上图表示的字符串集合为$\{a,to,tea,ted,ten,i,in,inn \}$,每个单词的结束位置对应一个“单词 ...

  3. C#动态数组ArrayList

    在C#中,如果需要数组的长度和元素的个数随着程序的运行不断改变,就可以使用ArrayList类,该类是一个可以动态增减成员的数组. 一.ArrayList类的常用属性和方法 1. ArrayList类 ...

  4. UIViewController 的 edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets属性

    1.有时你命名设置了某控件的y坐标为0,确总是被导航栏遮挡住,如下: UILabel *label = [[UILabel alloc] init];    label.text = @"请 ...

  5. python class 巩固

    class 类定义 语法格式如下: class ClassName: <statement-1> ... <statement-N> 类属性与方法 属性 操作属性 getatt ...

  6. CentOS7下systemd

    配置文件: /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/ /run/systemd/system:系统执行过程中所产生的服务脚本, ...

  7. java上传附件,批量下载附件(一)

    上传附件代码:借助commons-fileupload-1.2.jar package com.str; import java.io.BufferedInputStream;import java. ...

  8. Python之路-时间模块

    time模块 import time 时间戳(time.time())--结构化时间(time.localtime)--字符串时间(time.strftime) import time print(t ...

  9. unix cc编译过程

    1.编译并链接一个完全包含与一个源文件的C程序:                cc program.c     这条命令产生一个称为a.out的可执行程序.中间会产生一个名为program.o的目标 ...

  10. excel日期格式取年份

    具体思路:先将日期格式更改为常规格式,再取常规格式的前4位数字 例如:A1==1981/12/22 第一步B1=TEXT(A1,"emd") 第二步C1=LEFT(B1,4) 结束