以根据用户id查询用户为例。
二级缓存开启:1. 先配置全局二级缓存,2. UserMapper.xml文件中的sql语句上开启二级缓存。两者缺一不可。
首先,我们假设已经有一个MyBatis的全局配置文件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">
<configuration>
<!-- 启用二级缓存的全局开关 -->
<settings>
<setting name="cacheEnabled" value="true"/>
<!-- 其他设置 -->
</settings>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
<!-- 其他Mapper -->
</mappers>
</configuration>
接下来,我们有一个Mapper XML文件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">
<mapper namespace="com.example.mapper.UserMapper">
<!-- 启用当前 Mapper 的二级缓存 -->
<cache/>
<!-- 查询用户 -->
<select id="selectUserById" resultType="com.example.domain.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
然后,我们有一个对应的Java接口UserMapper.java:
package com.example.mapper;
import com.example.domain.User;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
// 这里通常会有@Select注解或其他Mapper注解,但在这个例子中我们已经在XML中定义了SQL
User selectUserById(int id);
}
以及一个User类User.java,它表示数据库中的用户表:
package com.example.domain;
public class User {
private int id;
private String name;
private String email;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
最后,我们有一个简单的Java应用程序,它使用MyBatis来查询用户,并演示二级缓存的工作:
package com.example;
import com.example.domain.User;
import com.example.mapper.UserMapper;
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;
public class MyBatisExample {
public static void main(String[] args) {
String resource = "mybatis-config.xml";
Reader reader;
SqlSession session = null;
try {
reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 打开第一个SqlSession
session = sqlSessionFactory.openSession();
try (SqlSession session1 = session) {
UserMapper mapper = session1.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1);
System.out.println("User 1: " + user1.getName());
}
// 打开第二个SqlSession(注意这里不是同一个SqlSession对象)
session = sqlSessionFactory.openSession();
try (SqlSession session2 = session) {
UserMapper mapper = session2.getMapper(UserMapper.class);
User user2 = mapper.selectUserById(1);
System.out.println("User 2: " + user2.getName());
}
// 注意到这里没有提交或关闭SqlSession,但在实际应用中应该适当管理SqlSession的生命周期
// 在这个例子中,由于我们启用了二级缓存,并且两次查询是相同的,所以第二次查询应该会从缓存中获取结果
} catch (IOException e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
}
在这个例子中,我们有两个不同的SqlSession对象,但它们都映射到同一个UserMapper接口。由于我们在UserMapper.xml中启用了二级缓存,并且两次查询都是相同的(即查询ID为1的用户),因此第二次查询应该会从缓存中获取结果,而不是再次执行SQL查询。这可以通过观察控制台输出来验证,如果两次查询的输出是相同的,并且没有看到SQL查询日志(这取决于你的MyBatis配置和日志级别),那么这就表明二级缓存正在工作。
标签:UserMapper,SqlSession,二级缓存,session,Mybatis,import,public From: https://www.cnblogs.com/yiwangshi/p/18578251