MyBatis入門之一級快取

2021-10-03 13:25:18 字數 1603 閱讀 8527

mybatis的一級快取作用域是sqlsession的,所以,對於同乙個sqlsession,相同的查詢,只有在第一次查詢的時候才會到資料庫查詢,其餘都是從快取中拿。但是,如果兩次查詢之間,發生了資料更新(包括增、刪、改)操作,則會清除快取。mybatis預設是開啟一級快取的。此外,如果:

(1)關閉sqlsession,因為是sqlsession作用域的,則快取當然也就沒有了

(2)呼叫sqlsession的clearcache()方法,則可以手動清除快取

由於示例**與之前的部落格:  mybatis入門之介面繫結與crud例項    基本相同,所以不貼重複的**了

不同的地方就是mybatis-config.xml配置資訊,多了列印sql的配置,測試類肯定也是不同的。

mybatis-config.xml檔案新增的內容:

1.測試一級快取作用域是sqlsession的

public class firstlevelcache 

}

檢視控制台輸出結果:

可以看到,第二次查詢,並沒有發出查詢的sql語句,說明第二次查詢沒有到資料庫拿資料,那只能是從快取中拿資料了。

但是,如果是2個不同的sqlsession,情況又會怎樣了?我們改一下測試類:

(1)新增部分

//第二個會話,為了說明一級快取是session級別的

sqlsession sqlsession2 = factory.opensession();

(3)完整**

public class firstlevelcache 

}

再次,檢視結果:

可以發現,兩次查詢都發出了sql語句,並沒有使用快取,這就說明了2個sqlsession的快取是不能共享的。

2.快取失效

如果2次查詢之間,發生了資料的更新操作,那麼,即使是同乙個sqlsession,快取也不復存在,主要是為了避免髒資料,保證快取中資料是最新的。測試**如下:

public class firstlevelcache 

}

主要是增加了更新資料的操作:

//1.執行了更新操作,會清除快取

system.out.println("兩次查詢之間執行更新操作");

user.setusername("張三2");

sqlsession.commit();

測試結果:

同樣會查詢2次資料庫,沒有用到快取。

此外,如果呼叫下面這個方法,就會手動清除快取。

sqlsession.clearcache();

MyBatis之一級快取及其一級快取失效

定義 一級快取 本地快取 與資料庫同一次會話 sqlsession 期間查詢到的資料會放在本地快取中,如果以後要獲取相同的資料直接從快取中獲取,不會再次向資料庫查詢資料 乙個sqlsession擁有乙個一級快取 mybatis一直開啟一級快取,不同的sqlsession級別的快取,資料不可以共用 一...

mybatis一級快取

autowired private sqlsessionfactory sqlsessionfactory autowired test transactional public void test selectall.size log.info 第2次查詢 selectall2.size 同乙個s...

MyBatis 一級快取

本地快取作用域預設為該sqlsession。當session flush或 close後,該session中的所有cache將清空。同一次會話期間,只要查詢過的資料都會儲存在當前sqlsession的乙個map中 key hashcode 查詢sql的id 編寫的sql語句 引數 1.不同的sqls...