Mybatis(缓存)

什么是缓存

  缓存就是将已经查询过的记录放在内存的缓冲区或文件上,这样如果再次查询,可以通过配置的策略,命中已经查询过的记录,从而提高查询的效率。

  Mybatis 的缓存分为一级缓存和二级缓存。

一级缓存

  一级缓存就是会话级别的缓存,就是同一个会话,如果已经查询过的数据会保存一份在内存中,如果会话没有关闭,再次调用同样的方法查询,不会再查询数据库,,而是直接从缓存中取出之前查询的数据.。一级缓存默认是打开的,而且是关闭不了的。一下代码,调用了 5 次 findAll 方法,但执行只查询了一次数据库。说明默认一级缓存是打开的。

 

如何清空一级缓存

  1.关闭会话.close()
  2.进行了操作(增删改),提交了 commit();
  3.手工清除缓存 clearCache() 一下代码,手工清除了一次缓存,操作数据一次,所以会查询三次数据库

  @Test
  public void findAll(){
  try {
  SqlSession session = DbUtils.getSession();
  StudentMapper studentMapper =
  session.getMapper(StudentMapper.class);
  List<Student> list = studentMapper.findAll();
  //清除一级缓存
  session.clearCache();
  List<Student> list1 = studentMapper.findAll();
  //操作数据库,一级缓存会清除
  studentMapper.deleteByIds(3);
  List<Student> list2 = studentMapper.findAll();
  List<Student> list3 = studentMapper.findAll();
  List<Student> list4 = studentMapper.findAll();
  for(Student s:list4){
  System.out.print("姓名:"+s.getSname());
  System.out.print(",年龄:"+s.getAge());
  System.out.println(",生日:"+s.getBirthday());
  }
  session.commit();
  session.close();
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }

二级缓存

  所谓二级缓存其实就是文件级别的缓存。 有效范围就是同一个映射文件,即使关闭会话都不会清空的缓存!

  内置二级缓存的配置
  1.在映射文件增加一个二级缓存的配置

  2.二级缓存需要将Java 的对象序列化到本地。实体类要增加一个序列化接口Serializable所谓的序列化(串行化),就是将对象变成一个流格式。这样对象就可以完成保存到本         地或者网络传递!

  public class Student implements Serializable {
  private Integer sid;
  private Integer aid;
  private String sname;
  private String sex;
  private Date birthday;
  private Integer age;

  public String getSname() {
  return sname;
  }
  public void setSname(String sname) {
  this.sname = sname;
  }
  public Integer getSid() {
  return sid;
  }
  public void setSid(Integer sid) {
  this.sid = sid;
  }
  public Integer getAid() {
  return aid;
  }
  public void setAid(Integer aid) {
  this.aid = aid;
  }
  public String getSex() {
  return sex;
  }
  public void setSex(String sex) {
  this.sex = sex;
  }
  public Date getBirthday() {
  return birthday;
  }
  public void setBirthday(Date birthday) {
  this.birthday = birthday;
  }
  public Integer getAge() {
  return age;
  }
  public void setAge(Integer age) {
  this.age = age;
  }
  }

 

  3.新版本已经默认支持开启二级缓存。

 Mybatis默认提供的缓存是基于map实现的内存缓存,可以满足基本使用,当数据量大的时候可以借助一些缓存框架或Redis缓存来协助保存Mybatis的二级缓存数据。

posted on 2019-04-25 20:33  Eminem。  阅读(107)  评论(0编辑  收藏  举报