1、什么是缓存

Mybatis提供缓存,用于减轻数据压力,提高数据库性能。

2、Mybatis缓存分类

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

Mybatis的一级缓存

1、一级缓存的范围

 1. 一级缓存是SqlSession级别的缓存。

 2. 在操作数据库时需要构造SqlSession,在SqlSession中有一个HashMap结构的数据结构,用来存储一级缓存。

 3. 一级缓存是SqlSession级别的缓存,因此不同的SqlSession对象之间的缓存是互不影响的,每个SqlSession对象都有自己的缓存。

 4. Mybatis的一级缓存是默认开启的。

2、工作原理

说明:

 1. 当一次执行查询的时候,首先会去查询一级缓存,如果一级缓存中没有数据,然后才回去查询数据库,数据库返回后会将返回的数据保存到一级缓存之中。

 2. 第二次再去查询相同的数据时,就会直接从一级缓存中取数据,不再需要去查询数据库。

 3. 如果在两次查询之间执行了SqlSession的commit操作(执行插入、更新、删除),则会清空一级缓存,这样是为了防止读到脏数据。

3、一级缓存的测试

 1. mapper.xml文件

  <select id="findUser" parameterType="int" resultType="User">
SELECT * FROM User WHERE id = #{value}
</select> <select id="updateUser" parameterType="User" >
UPDATE User SET username=#{username} WHERE id = #{id}
</select>

 2. mapper接口文件

public User findUser(int id) throws Exception;
public User updateUser(User user) throws Exception;

 3. 测试代码

  public void testFi() throws Exception{
SqlSession session = sessionFactory.openSession();
Mapper mapper = session.getMapper(Mapper.class);
//第一次查询,会发送SQL语句,去数据库查询
User user = mapper.findUser(1);
System.out.println(user);
//执行修改的commit操作
user.setUsername("小明");
mapper.updateUser(user);
session.commit();
//第二次查询,如果没有执行commit操作,直接在缓存中取数据,不会发生sql语句查询数据库
//如果执行了commit操作,会发生sql语句查询数据库
User user1 = mapper.findUser(1);
System.out.println(user1); }

4、一级缓存的应用

 1. 在实际开发中,是将Mybatis和Spring进行整合开发,事务的控制放在service中。

 2. 一个service中会存在很多的方法去调用mapper方法。

 3. 如果执行两次service去调用同一个mapper方法,不会走一级缓存,因为第一次调用结束会清空一级缓存。

 4. 一个SqlSession方法结束时,会关闭SqlSession对象,关闭时会清空一级缓存。

Mybatis缓存(一)的更多相关文章

  1. mybatis缓存

    mybatis缓存http://www.cnblogs.com/QQParadise/articles/5109633.htmlhttp://www.mamicode.com/info-detail- ...

  2. Mybatis缓存处理机制

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  3. MyBatis缓存禁用失败

    问题:MyBatis缓存无法禁用,同一个session的select查询结果一样,但是数据库其实已改变. 尝试达到想要的目的: 1.msgmapper.xml里的select标签加上 <sele ...

  4. MyBatis入门学习教程-MyBatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了 package me.gacl.test; 2 import me.gacl.domain.User; import ...

  5. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  6. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  7. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  8. MyBatis——Mybatis缓存

    原文:http://www.cnblogs.com/xdp-gacl/p/4270403.html MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架 ...

  9. 【转】MyBatis学习总结(七)——Mybatis缓存

    [转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...

  10. 使用MyBatis缓存

    (1).为什么需要使用缓存:: MyBatis是一个持久层(数据库层)映射框架,在所有访问数据库的操作中,无疑数据查询是最耗费数据库资源的操作了,因为你一次可能需要查询成千上百万条记录(如果你不加限制 ...

随机推荐

  1. word2010多级列表编号为什么会变成黑块

    把光标放置在黑块的后面 在键盘上按左方向键,则黑块变灰色(为选中状态) 然后ctrl+shift+s, 出现窗口“apply styles" 点击"reapply", 搞 ...

  2. 实战iOS7之NSURLSession

    NSURLSession VS NSURLConnection NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有: * 根据每个S ...

  3. python的requests库详解

    快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其假设你已经安装了 Requests.如果还没有,去安装一节看看吧. 首先,确认一下: Requests 已安装 Req ...

  4. c#设计模式系列:状态模式(State pattern)

    引言 我们在编程的时候,有时候会遇到,一个对象的行为动作会由对象的状态来决定的,也就是对象的行为是由状态来决定,如果对象的状态很多,那么也会由很多不同的行为,这时候我们一班会 if –else if- ...

  5. 菜鸟的Xamarin.Forms前行之路——实现按钮的字体图标(可扩展)

    在实际的APP中,带有图标的按钮用到地方还是蛮多的,字体图标往往能更快更生动的传达信息,并且相对于背景图片,字体图标也有着绝对的优势,所以实现按钮的字体图标是值得尝试的. 实现方法:各平台自定义渲染按 ...

  6. pageadmin CMS Sql新建数据库和用户名教程

    用pageadmin网站制作如何Sql新建数据库和用户名 sql server软件安装完毕后,需要新建一个数据库用来作为网站的数据库. 1.打开sql管理界面,如图所示,找到数据库,右键单击数据库,选 ...

  7. hdu5693 D game&&hdu 5712 D++ game

    题目链接:5693 题目链接:5712 对于这个D game.注意消除之后两遍的序列是可以拼合到一起的!我们可以想到有区间DP的做法.我们设\(f[i][j]\)表示区间i,j可以被消除. 显然如果这 ...

  8. UI Automator Viewer的使用

    uiautomatorviewer是android SDK自带的工具.通过截屏并分析XML布局文件的方式,为用户提供控件信息查看服务.该工具位于SDK目录下的tools\bin子目录下.可以看到,它是 ...

  9. Python进程间通信之共享内存

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...

  10. CH的电影推荐

    1.推荐电影 张艺谋:一个都不能少 2.下载站点 TL95