1. 程式人生 > >mybatis一級快取

mybatis一級快取

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);