代碼:
User.java
package com.bean;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String name;
private String sex;
private Integer age;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String name, String sex, Integer age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
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;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
FKSqlSessionFactory.java
package com.factory;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class FKSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory = null;
// 初始化建立SqlSessionFactory對象
static{
try {
// 讀取mybatis-config.xml檔案
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
// 擷取SqlSession對象的靜态方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
// 擷取SqlSessionFactory的靜态方法
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
UserMapper.java
package com.mapper;
import java.util.List;
import com.bean.User;
public interface UserMapper {
// 根據id查詢User
User selectUserById(Integer id);
// 查詢所有User
List<User> selectAllUser();
// 根據id删除User
void deleteUserById(Integer id);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace指使用者自定義的命名空間。 -->
<mapper namespace="com.mapper.UserMapper">
<!-- 開啟二級緩存
回收政策為先進先出
自動重新整理時間60s
最多緩存512個引用對象
隻讀
-->
<cache eviction="LRU" flushInterval="600000" size="512" readOnly="true"/>
<!-- 根據id查詢User -->
<!-- useCache="false" 禁用二級緩存的寫法 -->
<select id="selectUserById" parameterType="int" resultType="com.bean.User">
select * from tb_user3 where id = #{id}
</select>
<!-- 查詢所有User -->
<select id="selectAllUser" resultType="com.bean.User">
select * from tb_user3
</select>
<!-- 根據id删除User -->
<delete id="deleteUserById" parameterType="int" >
delete from tb_user3 where id = #{id}
</delete>
</mapper>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- XML 配置檔案包含對 MyBatis 系統的核心設定 -->
<configuration>
<properties resource="db.properties"/>
<!-- 指定 MyBatis 所用日志的具體實作 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
<!-- 開啟二級緩存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 設定别名 -->
<typeAliases>
<typeAlias alias="user" type="com.bean.User"/>
</typeAliases>
<environments default="mysql">
<!-- 環境配置,即連接配接的資料庫。 -->
<environment id="mysql">
<!-- 指定事務管理類型,type="JDBC"指直接簡單使用了JDBC的送出和復原設定 -->
<transactionManager type="JDBC"/>
<!-- dataSource指資料源配置,POOLED是JDBC連接配接對象的資料源連接配接池的實作。 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mappers告訴了MyBatis去哪裡找持久化類的映射檔案 -->
<mappers>
<mapper resource="com/mapper/UserMapper.xml"/>
</mappers>
</configuration>
TestTwoLevelCache.java
package com.test;
import org.apache.ibatis.session.SqlSession;
import com.bean.User;
import com.factory.FKSqlSessionFactory;
import com.mapper.UserMapper;
public class TestTwoLevelCache {
public static void main(String[] args) {
// TODO Auto-generated method stub
TestTwoLevelCache test = new TestTwoLevelCache();
//test.testCache1();
test.testCache2();
}
public void testCache1 (){
// 使用工廠類獲得SqlSession對象
SqlSession session=FKSqlSessionFactory.getSqlSession();
// 獲得UserMapping對象
UserMapper um = session.getMapper(UserMapper.class);
// 查詢id為1的User對象,會執行select語句
User user = um.selectUserById(1);
System.out.println(user);
// 執行delete操作
um.deleteUserById(5);
session.commit();
// 再次查詢id為1的User對象,因為DML操作會清空SqlSession緩存,是以會再次執行select語句
User user2 = um.selectUserById(1);
System.out.println(user2);
session.close();
}
public void testCache2 (){
// 使用工廠類獲得SqlSession對象
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 獲得UserMapping對象
UserMapper um = session.getMapper(UserMapper.class);
// 查詢id為1的User對象,會執行select語句
User user = um.selectUserById(1);
System.out.println(user);
// 關閉一級緩存
session.close();
// 再次通路,需要再次擷取一級緩存,然後才能查找資料,否則會抛出異常
session = FKSqlSessionFactory.getSqlSession();
// 再次獲得UserMapping對象
um = session.getMapper(UserMapper.class);
// 再次通路,因為現在使用的是一個新的SqlSession對象,是以會再次執行select語句
User user2 = um.selectUserById(1);
System.out.println(user2);
// 關閉SqlSession對象
session.close();
}
}
截圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVPnhkWww2MYVnVYVGcGdUY1x2RiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jM3UDNxUzM5ETOyMDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
總結:使用緩存可以最大程度地減輕資料查詢的壓力,提高資料庫性能。