首页 > 其他分享 >Mybatis的二级缓存

Mybatis的二级缓存

时间:2024-11-30 12:12:02浏览次数:8  
标签:UserMapper SqlSession 二级缓存 session Mybatis import public

以根据用户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

相关文章

  • Mybatis 支持延迟加载的详细内容
    延迟加载的概念深入延迟加载是一种在处理复杂对象关系时非常有用的策略。在企业级应用开发中,数据库中的表之间往往存在着各种关联关系,如一对多(一个用户有多个订单)、多对多(一个学生可以选多门课程,一门课程可以被多个学生选)等。在传统的查询方式中,如果查询主对象(如用户),同时把与......
  • JavaEE进阶-----mybatis操作数据库(新手教程)
    文章目录1.创建项目2.mysql相关操作3.安装插件4.工程创建4.1Bean文件夹4.2Dao文件夹4.3xml文件内容解读4.4配置文件4.5测试文件1.创建项目我们创建项目的时候需要注意下面的这个内容:1)maven项目;2)选择配置:我们之前使用的这个lombok和这个web还是要继续选择的;与之前......
  • 技术框架对MyBatis的入门学习
    MyBatis快速入门在回顾JDBC时,我们已经创建有Maven工程,而且在pom.xml中也已经导入mysql依赖包,这里就直接在原有工程上搭建MyBatis环境,以及使用MyBatis来实现JDBC查询user的操作流程。MyBatis环境搭建首先,在Maven项目的pom.xml中添加MyBatis的依赖jar包<!--导入mybat......
  • Mybatis
    文章目录Mybatis1.介绍2.使用MyBatis的开发步骤3.MyBatis的核心对象4.系统核心配置文件(mybatis.xml)Mybatis1.介绍MyBatis前身是iBatis,本是Apache的一个开源的项目半自动化的ORM实现(ORM框架)DAO层动态SQL实体类和SQL语句之间建立映射关系持久化是程序数据......
  • 在数据库字段命名格式和实体类属性命名格式不一致的情况下,通过配置 MyBatis 的通用 Ma
    MyBatis的通用Mapper支持使用@Column注解进行字段映射,但需要满足以下条件:项目中已集成MyBatis的通用Mapper(例如Mapper插件)。在通用Mapper的配置中启用了@Column注解支持。通用Mapper会根据实体类中字段的@Column注解值来映射数据库表的列名。使用@Colum......
  • 在数据库字段命名格式和实体类属性命名格式不一致的情况下,通过配置 MyBatis 的通用 Ma
    如果在MyBatis的通用Mapper中结合Example模式查询时,未自动使用实体类中@Column注解定义的字段映射,可能的原因是配置或使用方式上存在一些问题。以下是解决方案和注意事项:原因分析通用Mapper的@Column支持:通用Mapper支持通过@Column注解映射字段和数据库列,但......
  • Z2400034Java+MySQL+spring boot+mybatis学习资源共享平台系统代码 文档分享
    学习资源共享平台的设计与实现1.项目背景与概述2.系统角色与功能3.技术选型与架构系统特点与不足4.运行环境5.系统界面截图6.源码获取1.项目背景与概述本系统是一个基于SpringBoot和MyBatis的学习资源共享平台,旨在为用户提供一个便捷、高效、安全的资源共享与学......
  • SpringBoot集成MyBatis-Plus实现多数据源操作
    添加依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version></parent><dependencies>......
  • mybatis
    java是最全面成熟的语言,它的思想可以扩展到以后学习的任何编程语言1,mybatis持久层,解决jdbc的繁琐,--1,dome创建maven项目,导入org.mybatisjar包.1,配置mybatis-config.xml配置文件<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybat......
  • 面试官:说一下 MyBatis 的 3 种分页方式?
    分页是我们在开发中绕不过去的一个坎!当你的数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,提升了速度和效率!也减轻了前端渲染的压力!注意:由于java允许的最大整数为2147483647,所以limit能使用的最大整数也是2147483647,一次性取......