標籤: mybatisjava
[TOC]mysql
本文主要講mybatis的一級緩存,一級緩存是SqlSession級別的緩存。git
mybatis提供查詢緩存,用於減輕數據壓力,提升數據庫性能。github
mybaits提供一級緩存,和二級緩存。spring
一級緩存是SqlSession級別的緩存。在操做數據庫時須要構造sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。不一樣的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。sql
二級緩存是mapper級別的緩存,多個SqlSession去操做同一個Mapper的sql語句,多個SqlSession能夠共用二級緩存,二級緩存是跨SqlSession的。數據庫
爲何要用緩存?緩存
若是緩存中有數據就不用從數據庫中獲取,大大提升系統性能。session
第一次發起查詢用戶id爲1的用戶信息,先去找緩存中是否有id爲1的用戶信息,若是沒有,從數據庫查詢用戶信息。獲得用戶信息,將用戶信息存儲到一級緩存中。數據結構
若是sqlSession去執行commit操做(執行插入、更新、刪除),清空SqlSession中的一級緩存,這樣作的目的爲了讓緩存中存儲的是最新的信息,避免髒讀。
第二次發起查詢用戶id爲1的用戶信息,先去找緩存中是否有id爲1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。
mybatis默認支持一級緩存,不須要在配置文件去配置。
按照上邊一級緩存原理步驟去測試。
測試代碼
// 一級緩存測試 @Test public void testCache1() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession();// 建立代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 下邊查詢使用一個SqlSession // 第一次發起請求,查詢id爲1的用戶 User user1 = userMapper.findUserById(1); System.out.println(user1); // 若是sqlSession去執行commit操做(執行插入、更新、刪除),清空SqlSession中的一級緩存,這樣作的目的爲了讓緩存中存儲的是最新的信息,避免髒讀。 // 更新user1的信息 // user1.setUsername("測試用戶22"); // userMapper.updateUser(user1); // //執行commit操做去清空緩存 // sqlSession.commit(); // 第二次發起請求,查詢id爲1的用戶 User user2 = userMapper.findUserById(1); System.out.println(user2); sqlSession.close(); }
1.不執行更新操做,輸出:
DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 110771485. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d] DEBUG [main] - ==> Preparing: SELECT * FROM user WHERE id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, sex=2, birthday=null, address=null] User [id=1, username=王五, sex=2, birthday=null, address=null] DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d] DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d] DEBUG [main] - Returned connection 110771485 to pool.
2.取消測試代碼中更新的的註釋,輸出:
DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 110771485. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d] DEBUG [main] - ==> Preparing: SELECT * FROM user WHERE id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, sex=2, birthday=null, address=null] DEBUG [main] - ==> Preparing: update user set username=?,birthday=?,sex=?,address=? where id=? DEBUG [main] - ==> Parameters: 測試用戶22(String), null, 2(String), null, 1(Integer) DEBUG [main] - <== Updates: 1 DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d] DEBUG [main] - ==> Preparing: SELECT * FROM user WHERE id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=測試用戶22, sex=2, birthday=null, address=null] DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d] DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d] DEBUG [main] - Returned connection 110771485 to pool.
正式開發,是將mybatis和spring進行整合開發,事務控制在service中。
一個service方法中包括 不少mapper方法調用。
service{ //開始執行時,開啓事務,建立SqlSession對象 //第一次調用mapper的方法findUserById(1) //第二次調用mapper的方法findUserById(1),從一級緩存中取數據 //方法結束,sqlSession關閉 }
若是是執行兩次service調用查詢相同的用戶信息,不走一級緩存,由於session方法結束,sqlSession就關閉,一級緩存就清空。