本文章介紹實作:
一級快取:
是指SqlSession,一級快取的作用域是一個SqlSession,Mybatis默認開啟一級快取,
在同一個SqlSession中,執行相同的查詢SQL,第一次會去查詢資料庫,并寫到快取中;第二次直接從快取中取,當執行SQL時兩次查詢中間發生了增刪改操作,則SqlSession的快取清空,
二級快取:
是指mapper映射檔案,二級快取的作用域是同一個namespace下的mapper映射檔案內容,多個SqlSession共享,Mybatis需要手動設定啟動二級快取,
在同一個namespace下的mapper檔案中,執行相同的查詢SQL,第一次會去查詢資料庫,并寫到快取中;第二次直接從快取中取,當執行SQL時兩次查詢中間發生了增刪改操作,則二級快取清空,
一.一級快取的生命周期:
1.MyBatis開啟一個會話時,創建SqlSession物件,Excutor物件,PerpetualCache物件,
2.會話結束時或SqlSession呼叫close()方法,釋放創建的3個物件,
3.SqlSession呼叫clearCache()方法否,會清空全部一級快取當物件仍然存在,可重復使用,
4.SqlSession執行修改洗掉添加操作時,會清空PerpetualCache物件,
二.二級快取的過期時間:
1.二級快取有過期時間,并不是key-value的過期時間,而是這個cache的過期時間,是flushInterval,意味著整個清空快取cache,所以不需要后臺執行緒去定時檢測,
2.每當存取資料的時候,都有檢測一下cache的生命時間,默認是1小時,如果這個cache存活了一個小時,那么將整個清空一下,
注意:
由于二級快取的資料不一定都是存盤到記憶體中,它的存盤介質多種多樣,所以需要給快取的物件執行序列化,
如果該類存在父類,那么父類也要實作序列化,
一級快取實作:
搭建MyBatis環境:
1.db.properties
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/(資料庫) 3 jdbc.username=root 4 jdbc.password=123456
2.mybatis-config.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!--加載資料庫組態檔--> 7 <properties resource="db.properties"/> 8 <settings> 9 <!--列印執行程序,由于一級快取是自動開啟的,不需要手動開啟--> 10 <setting name="logImpl" value="STDOUT_LOGGING"/> 11 </settings> 12 <!--給ccom.Charon.enty包下所有的物體類指定別名--> 13 <typeAliases> 14 <package name="com.Charon.enty"/> 15 </typeAliases> 16 17 <!-- 資料庫連接環境的配置 --> 18 <environments default="development"> 19 <environment id="development"> 20 <!-- 事務管理器JDBC --> 21 <transactionManager type="JDBC" /> 22 <!-- 資料源--> 23 <dataSource type="POOLED"> 24 <property name="driver" value="${jdbc.driver}"/> 25 <property name="url" value="${jdbc.url}" /> 26 <property name="username" value="${jdbc.username}" /> 27 <property name="password" value="${jdbc.password}" /> 28 </dataSource> 29 </environment> 30 </environments> 31 <mappers> 32 <!--必須全包名,不然找不到--> 33 <mapper resource="com/Charon/dao/userMapper.xml"></mapper> 34 </mappers> 35 </configuration>
3.userMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.Charon.dao.UserMapper"> 6 <select id="findUserAll" resultType="user"> 7 SELECT 8 id id, 9 username username, 10 userpwd userpassword 11 FROM 12 user 13 </select> 14 </mapper>
4.介面UserMapper
1 package com.Charon.dao; 2 3 import com.Charon.enty.User; 4 5 import java.util.List; 6 7 /** 8 * @Description TODO 9 * @Author Charon <[email protected]> 10 * @create 2020-10-27-21:44 11 * @Version 1.0.0 12 */ 13 public interface UserMapper { 14 //查詢資料庫用戶資訊 15 List<User> findUserAll(); 16 }
5.物體類User
** * @Description TODO 用戶物體類 * @Author Charon <[email protected]> * @create 2020-10-27-21:37 * @Version 1.0.0 */ public class User { private Integer id; private String username; private String userpassword; //getter ,serter方法省略 }
6.工具類
1 package com.Charon.utile; 2 3 import org.apache.ibatis.io.Resources; 4 import org.apache.ibatis.session.SqlSession; 5 import org.apache.ibatis.session.SqlSessionFactory; 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 7 8 import java.io.IOException; 9 import java.io.InputStream; 10 import java.io.Reader; 11 12 /** 13 * @Description TODO 代理工廠類 14 * @Author Charon <[email protected]> 15 * @create 2020-10-21-8:59 16 * @Version 1.0.0 17 */ 18 public class MyBatisUtil { 19 20 private final static SqlSessionFactory sqlSessionFactory; 21 22 static { 23 String resource="mybatis-config.xml"; 24 Reader reader =null; 25 try { 26 reader = Resources.getResourceAsReader(resource); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } 30 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 31 } 32 33 /** 34 * 獲取SqlSessionFactory 35 * @return SqlSessionFactory 36 */ 37 public static SqlSessionFactory getSqlSessionFactory(){ 38 return sqlSessionFactory; 39 } 40 41 /** 42 * 獲取SqlSession 43 * @return SqlSession 44 */ 45 public static SqlSession getSqlSession(){ 46 return sqlSessionFactory.openSession(); 47 } 48 49 /** 50 * 關閉SqlSession 51 */ 52 public static void closeSession(SqlSession sqlSession){ 53 if (sqlSession!=null) 54 sqlSession.close(); 55 } 56 }
7.測驗,這里呼叫了兩次查詢
@Test public void test() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //第一次查詢 List<User> userAll = mapper.findUserAll(); for (int i = 0; i < userAll.size(); i++) { User user = userAll.get(i); System.out.println(user); } // 第二次查詢 List<User> userAlls = mapper.findUserAll(); for (int i = 0; i < userAlls.size(); i++) { User user = userAlls.get(i); System.out.println(user); } }
8.結果,通過運行結果可以看出當前程式只呼叫了一次sql

9.屏蔽一級快取
在userMapper.xml查詢添加一個條件
flushCache=true

10.屏蔽一級快取后,展示效果

二級快取實作
1.在mybatis-config.xml中設定

2.介面UserMapper
1 package com.Charon.dao; 2 3 import com.Charon.enty.User; 4 5 import java.util.List; 6 7 /** 8 * @Description TODO 9 * @Author Charon <[email protected]> 10 * @create 2020-10-27-21:44 11 * @Version 1.0.0 12 */ 13 public interface UserMapper { 14 //查詢資料庫用戶資訊 15 List<User> findUserAll(); 16 17 void updateUser(User user); 18 }
4.userMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.Charon.dao.UserMapper"> 6 <!--flushCache=true:屏蔽一級快取--> 7 <select id="findUserAll" resultType="user"> 8 SELECT 9 id id, 10 username username, 11 userpwd userpassword 12 FROM 13 user 14 </select> 15 <update id="updateUser" parameterType="user" flushCache="true"> 16 UPDATE user SET username=#{username},userpwd=#{userpassword} WHERE id=#{id} 17 </update> 18 <!--開啟本mapper的namespance下的二級快取(默認的)--> 19 <cache></cache> 20 </mapper>
5.物體類實作Serializable介面
package com.Charon.enty; import java.io.Serializable; /** * @Description TODO 用戶物體類 * @Author Charon <[email protected]> * @create 2020-10-27-21:37 * @Version 1.0.0 */ public class User implements Serializable{ private Integer id; private String username; private String userpassword; //忽略getter setter方法 }
6.測驗

7.先把sqlSession注釋掉,查看一下二級快取

8.解注SqlSession3查看二級快取

其他配置(useCache和flushCache):
1.MyBatis還可以配置userCache和flushCache等配置項,
2.useCache是用來設定是否禁用二級快取的,在userMapper.xml中設定useCache=false可以禁用當前select陳述句的二級快取
,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級快取,
使用演示:
<select id="findUserAll" resultType="user" useCache="false"> |
3.flushCache:
這種情況是針對每次查詢都需要最新的資料sql,要設定成useCache=false,禁用二級快取,直接從資料庫中獲取,
在mapper的同一個namespace中,如果有其它insert、update、delete操作資料后需要重繪快取,如果不執行重繪快取會出現臟讀,
設定statement配置中的flushCache=”true” 屬性,默認情況下為true,
即重繪快取,如果改成false則不會重繪,使用快取時如果手動修改資料庫表中的查詢資料會出現臟讀,
<update id="updateUser" parameterType="user" flushCache="true">
|
一般下執行完commit操作都需要重繪快取,flushCache=true表示重繪快取,這樣可以避免資料庫臟讀,所以我們不用設定,默認即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/194398.html
標籤:Java
