Mybatis的二级缓存

以根据用户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配置和日志级别),那么这就表明二级缓存正在工作。

本文作者:是橙子呐

本文链接:https://www.cnblogs.com/yiwangshi/p/18578251

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   是橙子呐  阅读(23)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.