mybatis一級快取
阿新 • • 發佈:2019-02-05
1.mybatis的一級快取屬於:session級別
原理:
1.mybatis執行查詢時,先去快取裡面看,如果快取裡面有資料那麼久從快取裡面來取資料,
2.如果沒有資料那就會發出sql語句,別且把查詢出來的結果集放入快取中。
舉例說明現象:
//同一個session,第一次執行查詢時發出sql,從資料庫中查詢 Person p1 = session.selectOne("com.sql.mapper.PersonMapper.selectPerson1ById", 1); System.out.println(p); Person p2 = session.selectOne("com.sql.mapper.PersonMapper.selectPerson1ById", 1); //第二次執行同一查詢,不發出sql,從一級快取中拿資料 System.out.println(p2);
說明:mybatis的一級快取實質就是一個map。
2.為什麼說mybatis的一級快取是session級別的?
因為如果同一查詢,但是在不同session中去執行,第二次還是會發出sql,從資料庫中查詢。
舉例如下:
//發出sql,從資料庫中查詢資料 SqlSession session1 = sqlSessionFactory.openSession(); Person p1 = session1.selectOne("com.sql.mapper.PersonMapper.selectPerson1ById", 1); //因為session不同,雖然是同一sql,但是還是會發出sql,從資料庫中查詢資料 SqlSession session2 = sqlSessionFactory.openSession(); Person p2 = session2.selectOne("com.sql.mapper.PersonMapper.selectPerson1ById", 1);
3.如果同一session,第一次查詢後,進行了插入,刪除,更新操作後,第二次查詢仍然會發出sql。
原因:mybatis在修改,刪除當前查詢出來的資料時,會把快取裡面的資料清掉。
舉例說明:
//第一次查詢,毫無疑問,發出sql Person1 p = session.selectOne("com.sql.mapper.Person1Mapper.selectPerson1ById", 1); p.setPersonId(1); p.setName("小劉"); //修改當前查詢出來的資料,會把快取裡面的資料清掉 session.update("com.sql.mapper.Person1Mapper.update", p); //執行完庫表變更必須要提交事務 session.commit(); //第二次查詢,但仍然會發出sql Person1 p1 = session.selectOne("com.sql.mapper.Person1Mapper.selectPerson1ById", 1);