MyBatis的快取分為一級快取和二級快取,
先看一下MyBatis官方檔案給出的說明:
MyBatis 內置了一個強大的事務性查詢快取機制,它可以非常方便地配置和定制, 為了使它更加強大而且易于配置,我們對 MyBatis 3 中的快取實作進行了許多改進,
默認情況下,只啟用了本地的會話快取,它僅僅對一個會話中的資料進行快取, 要啟用全域的二級快取,只需要在你的 SQL 映射檔案中添加一行:
<cache/>
基本上就是這樣,這個簡單陳述句的效果如下:
- 映射陳述句檔案中的所有 select 陳述句的結果將會被快取,
- 映射陳述句檔案中的所有 insert、update 和 delete 陳述句會重繪快取,
- 快取會使用最近最少使用演算法(LRU, Least Recently Used)演算法來清除不需要的快取,
- 快取不會定時進行重繪(也就是說,沒有重繪間隔),
- 快取會保存串列或物件(無論查詢方法回傳哪種)的 1024 個參考,
- 快取會被視為讀/寫快取,這意味著獲取到的物件并不是共享的,可以安全地被呼叫者修改,而不干擾其他呼叫者或執行緒所做的潛在修改,
這里我們來學習一級快取,
一級快取也叫本地快取,是在一次SqlSession會話中產生的快取,在一次SqlSession會話中查詢到的資料存入快取中,再次執行相同的查詢就不需要再從資料庫獲取資料,而是直接從本地獲取,
下面我們用一個實體來說明:
UserMapper介面:
package com.jms.dao; import com.jms.pojo.User; public interface UserMapper { User getUserById(int id); }
UserMapper.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.jms.dao.UserMapper"> <select id="getUserById" parameterType="_int" resultType="User"> select * from mybaties.user where id=#{id} </select> </mapper>
測驗:
@Test public void getUserById() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(10001); System.out.println(user); System.out.println("========================================="); User user2 = userMapper.getUserById(10001); System.out.println(user2); sqlSession.close(); }
測驗結果:

可以看見只有第一次查詢進入了資料庫進行查詢,第二次獲取相同資料則沒有進入資料庫查詢,是因為它直接從快取中獲取了資料,
明白了一級快取的使用,那么什么情況下一級快取會失效呢?
1.不同的SqlSession,一級快取只在一次SqlSession中生效,不同的SqlSession中相同的查詢也無法從快取中獲取,
2.執行增刪改陳述句后,會重繪快取,增刪改有改變資料的可能,快取的重繪是必然的,
3.使用清除快取的命令
SqlSession.clearCache();
@Test public void getUserById() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(10001); System.out.println(user); sqlSession.clearCache(); System.out.println("========================================="); User user2 = userMapper.getUserById(10001); System.out.println(user2); sqlSession.close(); }

使用清除快取的陳述句后,即便查詢相同資料也需要再次查詢資料庫,
(本人僅作個人學習記錄用,如有紕漏敬請指正)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508935.html
標籤:其他
上一篇:java基礎練習題
