正如大多數(shù)持久化框架一樣锭沟,MyBatis提供了對(duì)一級(jí)緩存和二級(jí)緩存的支持致燥。
1蹭沛、一級(jí)緩存
????一級(jí)緩存作用范圍是sqlSession域內(nèi)辽剧,當(dāng)sqlSession flush或者close之后送淆,該sqlSession中所有的cache就會(huì)被清空,一般是自動(dòng)開(kāi)啟的怕轿。
????下面我們以一個(gè)查詢所有用戶為例(添加驅(qū)動(dòng)的jar包偷崩、創(chuàng)建MyBatis的核心配置文件mybatis-config.xml以及l(fā)og4j我們就省略了,大家可以按照之前的教程自行配置)
????1.1撤卢、創(chuàng)建User實(shí)體類(lèi)
package com.fan.entity;
public class User {
private Integer id;
private String name;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
????1.2环凿、創(chuàng)建UserDao接口類(lèi)
package com.fan.dao;
import com.fan.entity.User;
import java.util.List;
public interface UserDao {
//查詢所有用戶
public List<User> findAllUser();
}
????1.3、添加mapper文件
<mapper namespace="com.fan.dao.UserDao">
<select id="findAllUser" resultType="com.fan.entity.User">
select * from users
</select>
</mapper>
????1.4放吩、添加測(cè)試類(lèi)
import com.fan.dao.UserDao;
import com.fan.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
Reader resourceAsReader=null;
SqlSession sqlSession=null;
try {
resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSession = new SqlSessionFactoryBuilder().build(resourceAsReader).openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> allUser = mapper.findAllUser();
for (User user:allUser) {
System.out.println(user.getName());
}
System.out.println("---------------------------------------------");
UserDao mapper1 = sqlSession.getMapper(UserDao.class);
List<User> allUser1 = mapper1.findAllUser();
for (User user1:allUser) {
System.out.println(user1.getName());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
if(resourceAsReader!=null){
try {
resourceAsReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
????測(cè)試結(jié)果如下圖所示(只調(diào)用了一次查詢語(yǔ)句):
測(cè)試結(jié)果
????1.5智听、一級(jí)緩存失效情況
????1、查詢不同的東西
????2渡紫、增刪改操作到推,可能會(huì)改變?cè)瓉?lái)的數(shù)據(jù),所以必定會(huì)刷新緩存惕澎!
????3莉测、查詢不同的Mapper.xml
????4、手動(dòng)清理緩存
2唧喉、二級(jí)緩存
????定義:
??????二級(jí)緩存也叫全局緩存捣卤,一級(jí)緩存作用域太低了,所以誕生了二級(jí)緩存八孝。
??????基于namespace級(jí)別緩存董朝,一個(gè)名稱空間,對(duì)應(yīng)一個(gè)二級(jí)緩存干跛。
??????工作機(jī)制:
????????1子姜、一個(gè)會(huì)話查詢一條數(shù)據(jù),這個(gè)數(shù)據(jù)就會(huì)被放在當(dāng)前會(huì)話的一級(jí)緩存中楼入。
????????2哥捕、如果當(dāng)前會(huì)話關(guān)閉了,這個(gè)會(huì)話對(duì)應(yīng)一級(jí)緩存就沒(méi)了嘉熊;但是我們想要的是遥赚,會(huì)話關(guān)閉了,一級(jí)緩存中的數(shù)據(jù)被保存到二級(jí)緩存中阐肤。
????????3凫佛、新的會(huì)話查詢信息,就可以從二級(jí)緩存中獲取內(nèi)容。
????????4御蒲、不同的mapper查出數(shù)據(jù)會(huì)放在自己對(duì)應(yīng)的緩存中衣赶。
????2.1、在映射文件mapper設(shè)置緩存
<mapper namespace="接口路徑">
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true">
</cache>
</mapper>
說(shuō)明:
???? eviction: 二級(jí)緩存中厚满,緩存的對(duì)象從緩存中移除的策略(上面FIFO的回收策略為先進(jìn)先出)
????flushInterval: 刷新緩存的事件間隔
????size: 緩存對(duì)象的個(gè)數(shù)
????readOnly: 是否是只讀的
????2.2府瞄、創(chuàng)建User實(shí)體類(lèi)
package com.fan.entity;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String name;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
????2.3、創(chuàng)建UserDao接口類(lèi)
package com.fan.dao;
import com.fan.entity.User;
import java.util.List;
public interface UserDao {
//查詢所有用戶
public List<User> findAllUser();
}
????2.4碘箍、mapper文件中加入緩存cache的配置如下
<mapper namespace="com.fan.dao.UserDao">
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true">
</cache>
<select id="findAllUser" resultType="com.fan.entity.User">
select * from users
</select>
</mapper>
????2.5遵馆、測(cè)試類(lèi)
import com.fan.dao.UserDao;
import com.fan.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
public class Test1 {
public static void main(String[] args) throws IOException {
Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsReader);
SqlSession sqlSession1 = factory.openSession();
UserDao mapper = sqlSession1.getMapper(UserDao.class);
List<User> allUser = mapper.findAllUser();
for (User user:allUser) {
System.out.println(user.getName());
}
sqlSession1.close();
System.out.println("---------------------------------------------");
SqlSession sqlSession2 = factory.openSession();
UserDao mapper1 = sqlSession2.getMapper(UserDao.class);
List<User> allUser1 = mapper1.findAllUser();
for (User user1:allUser1) {
System.out.println(user1.getName());
sqlSession2.close();
}
}
}
????測(cè)試結(jié)果如下:
測(cè)試結(jié)果