MyBatis中容許使用緩存,分爲一級緩存和二級緩存,下面看下MyBatis中如何配置緩存。sql
ps:下面代碼省略主配置文件和sql映射文件,直接給出測試方法。數據庫
public class MyBatisTest { // 獲取SqlSessionFactory對象 private SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } /** * 兩級緩存: * 一級緩存:(本地緩存), 在SqlSession上的緩存, 一級緩存一直開啓;sqlSession級別的一個Map * 1. 與數據庫同一次會話期間查詢到的數據會放在本地緩存中,之後若是須要獲取相同的數據,沒有必要在查詢數據庫 * * 2. 一級緩存失效的狀況(沒有使用到當前一級緩存的狀況,效果就是,還須要再向數據庫發出查詢) * 1. sqlSession不一樣 * 2. sqlSession相同,查詢條件不一樣(當前緩存中尚未這個數據) * 3. sqlSession相同,兩次查詢之間執行了增刪改操做(此次增刪改可能對當前數據有影響) * 4. sqlSession相同,手動清除了一級緩存(緩存清空) * * 二級緩存:(全局緩存), 在SqlSessionFactory上的緩存,基於namespace級別的緩存,一個namespace對應一個二級緩存 * 1. 工做機制: * 一、一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中; * 二、若是會話關閉,一級緩存中的數據會被保存到二級緩存中,新的會話查詢信息,就能夠參照二級緩存中的內容; * 三、不一樣namespace查出的數據會放在本身對應的map(緩存)中 * * 2. 使用: * 一、開啓全局二級緩存設置: * 二、去mapper.xml中進行配置 * 三、咱們的POJO須要實現序列化接口 * * 3. 效果: * 數據會從二級緩存中獲取;只有會話提交或關閉後,一級緩存中的數據纔會轉移到二級緩存中 * * @throws IOException */ //測試二級緩存 @Test public void testSecondLevelCache() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); SqlSession openSession2 = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class); Employee emp01 = mapper.getEmployeeById(3); System.out.println(emp01); openSession.close(); //第二次查詢是從二級緩存中拿到的數據,並無發送新的sql Employee emp02 = mapper2.getEmployeeById(3); System.out.println(emp02); System.out.println(emp01 == emp02); } finally { openSession2.close(); } } //測試一級緩存 @Test public void testFirstLevelCache() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee emp01 = mapper.getEmployeeById(3); System.out.println(emp01); Employee emp02 = mapper.getEmployeeById(3); System.out.println(emp02); System.out.println(emp01 == emp02); } finally { openSession.close(); } } }
敲重點:二級緩存的配置
一、 在主配置文件中開啓二級緩存總開關
二、sql映射文件中開啓二級緩存
三、POJO實現序列化接口
緩存