千家信息网

什么是MyBatis缓存

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"什么是MyBatis缓存",在日常操作中,相信很多人在什么是MyBatis缓存问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"什么是MyBatis缓存"
千家信息网最后更新 2026年11月01日什么是MyBatis缓存

这篇文章主要介绍"什么是MyBatis缓存",在日常操作中,相信很多人在什么是MyBatis缓存问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"什么是MyBatis缓存"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

  什么是Mybatis缓存?

  使用缓存可以减少Java Application与数据库的交互次数,从而提升程序的运行效率。比如,查询id=1的user对象,第一次查询出来之后,会自动将该对象保存到缓存中。下一次查询该对象时,就可以直接从缓存中获取,不需要发送SQL查询数据库了。

  Mybatis缓存分类

  一级缓存:SqlSession级别,默认开启,且不能关闭。

  mybatis的一级缓存是SqlSession级别的缓存,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据,不同的SqlSession之间缓存数据区域(HashMap)是互相不影响的。

  一级缓存的作用域是SqlSession范围的,当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存)中,第二次查询时会从缓存中获取数据,不再去底层进行数据库查询,从而提高了查询效率。需要注意的是:如果SqlSession执行了DML操作(insert、update、delete),并执行commit()操作,mybatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存数据中存储的是最新的信息,避免出现脏读现象。

  当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了,Mybatis默认开启一级缓存,不需要进行任何配置。

  二级缓存:Mapper级别,默认关闭,可以开启。

  二级缓存是Mapper级别的缓存,使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储,相比一级缓存SqlSession,二级缓存的范围更大,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

  二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的SqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

  Mybatis默认关闭二级缓存,可以在setting全局参数中配置开启二级缓存。

  下面我们通过代码来学习如何使用MyBatis缓存。

  首先来演示一级缓存,以查询Student对象为例。

  /**

  * @ClassName Student

  * @Description

  * @Author lzq

  * @Date 2019/7/26 13:53

  * @Version 1.0

  **/

  public class Student {

  private int SID;

  private String Sname;

  private String Ssex;

  private int Age;

  public int getSID() {

  return SID;

  }

  public void setSID(int SID) {

  this.SID = SID;

  }

  public String getSname() {

  return Sname;

  }

  public void setSname(String sname) {

  Sname = sname;

  }

  public String getSsex() {

  return Ssex;

  }

  public void setSsex(String ssex) {

  Ssex = ssex;

  }

  public int getAge() {

  return Age;

  }

  public void setAge(int age) {

  Age = age;

  }

  @Override

  public String toString() {

  return "[id"+SID+" 名字"+Sname+" 性别"+Ssex+" 年龄"+Age+"]";

  }

  }

  StudentMapper接口:

  import org.apache.ibatis.annotations.*;

  public interface StudentMapper {

  public Student getStudentById(int id);

  }

  mybatis-config.xml:

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

  StudentMapper.xml:

  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  select * from student where SID = #{id}

  测试代码:

  **

  * @ClassName Test

  * @Description

  * @Author lzq

  * @Date 2019/7/26 13:53

  * @Version 1.0

  **/

  public class Test {

  public static void main(String[] args) throws IOException {

  String resource = "mybatis-config.xml";

  //读取配置文件

  InputStream asStream = Resources.getResourceAsStream(resource);

  //创建sqlSessionFactory

  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);

  //创建sqlSession

  SqlSession sqlSession = sqlSessionFactory.openSession();

  //通过动态代理产生StudentMapper对象

  StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

  //查询id为1的元组

  Student student = mapper.getStudentById(1);

  System.out.println(student);

  Student student1 = mapper.getStudentById(1);

  System.out.println(student1);

  }

  }

  可以看到结果,执行了一次SQL语句,查询出两个对象,第一个对象是通过SQL查询的,并保存到缓存中,第二个对象是直接从缓存中获取的。

  我们说过一级缓存是SqlSession级别的,所以SqlSession一旦关闭,缓存也就不复存在了,修改代码,再次测试。

  测试代码:无锡妇科医院 http://www.bhnnk120.com/

  **

  * @ClassName Test

  * @Description

  * @Author lzq

  * @Date 2019/7/26 13:53

  * @Version 1.0

  **/

  public class Test {

  public static void main(String[] args) throws IOException {

  String resource = "mybatis-config.xml";

  //读取配置文件

  InputStream asStream = Resources.getResourceAsStream(resource);

  //创建sqlSessionFactory

  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);

  //创建sqlSession

  SqlSession sqlSession = sqlSessionFactory.openSession();

  //通过动态代理产生StudentMapper对象

  StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

  //查询id为2的元组

  Student student = mapper.getStudentById(1);

  System.out.println(student);

  sqlSession.close(); //关闭原有的sqlSession

  sqlSession = sqlSessionFactory.openSession(); //创建一个新的

  mapper = sqlSession.getMapper(StudentMapper.class);

  Student student1 = mapper.getStudentById(1);

  System.out.println(student1);

  }

  }

  可以看到,执行了两次SQL。

  在关闭SqlSession,一级缓存失效的情况下,可以启用二级缓存,实现提升效率的要求。

  MyBatis可以使用自带的二级缓存,也可以使用第三方的ehcache二级缓存。

  自带二级缓存

  mybatis-config.xml配置开启二级缓存

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

  在StudentMapper.xml配置中开启二级缓存:

  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  select * from student where SID = #{id}

  Student类实现Serializable接口:

  import java.io.Serializable;

  /**

  * @ClassName Student

  * @Description

  * @Author lzq

  * @Date 2019/7/26 13:53

  * @Version 1.0

  **/

  public class Student implements Serializable{

  private int SID;

  private String Sname;

  private String Ssex;

  private int Age;

  public int getSID() {

  return SID;

  }

  public void setSID(int SID) {

  this.SID = SID;

  }

  public String getSname() {

  return Sname;

  }

  public void setSname(String sname) {

  Sname = sname;

  }

  public String getSsex() {

  return Ssex;

  }

  public void setSsex(String ssex) {

  Ssex = ssex;

  }

  public int getAge() {

  return Age;

  }

  public void setAge(int age) {

  Age = age;

  }

  @Override

  public String toString() {

  return "[id"+SID+" 名字"+Sname+" 性别"+Ssex+" 年龄"+Age+"]";

  }

  }

  测试代码依旧是上一次用的那个:

  可以看到,执行了一次SQL,查询出两个对象,cache命中率为0.5;

到此,关于"什么是MyBatis缓存"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

缓存 查询 数据 对象 数据库 配置 代码 级别 语句 学习 相同 效率 测试 多个 第一次 存储 不同 两个 作用 内存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 中关村互联网 科技集团 湖南永感互联网科技有限公司 为想互联网科技怎么样 工业互联网科技新基建 互联网科技与金融科技 互联网科技公司发展 合肥互联网科技公司 互联网 的科技创新 哈尔滨新华互联网科技 成都仁贤领冠互联网科技有限公司 卫星互联网科技股票 常德市电业局互联网科技部 赶超互联网科技 微信多开 互联网金融科技名词解释 互联网领先科技宣传片 互联网科技融合创新 互联网风格科技公司名称 亚光科技低轨卫星互联网 互联网科技创新方面的资料 互联网科技公司华为 北京互联网科技公司 艾特科技互联网 深圳齐家互联网科技 新华互联网科技2019 青岛科技大学互联网大赛研究生 知域互联网科技有限公司大骗子 江苏苏星互联网科技有限公司 互联网科技创新创业项目 广州全民伙伴互联网科技有限公司
0