欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatisplus 配置二級(jí)緩存及實(shí)戰(zhàn)示例

 更新時(shí)間:2025年08月29日 11:28:28   作者:一葉飄零_sweeeet  
這篇文章主要介紹了mybatisplus 配置二級(jí)緩存及實(shí)戰(zhàn)示例,包含基礎(chǔ)配置、高級(jí)特征及實(shí)戰(zhàn)示例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

MyBatis-Plus(簡(jiǎn)稱 MP)作為 MyBatis 的增強(qiáng)工具,完全兼容 MyBatis 的二級(jí)緩存機(jī)制,同時(shí)提供了更便捷的配置方式。以下是基于 MyBatis-Plus 的二級(jí)緩存配置全指南,包含基礎(chǔ)配置、高級(jí)特性及實(shí)戰(zhàn)示例:

一、二級(jí)緩存核心依賴

確保項(xiàng)目中包含 MyBatis-Plus 及緩存相關(guān)依賴(以 Spring Boot 為例):

<!-- MyBatis-Plus核心依賴 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- 可選:Redis緩存(分布式環(huán)境必備) -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-redis</artifactId>
    <version>1.0.0-beta2</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、基礎(chǔ)配置(本地緩存)

適用于單機(jī)環(huán)境,使用 MyBatis 默認(rèn)的內(nèi)存緩存(PerpetualCache)。

2.1 全局開啟二級(jí)緩存

application.yml中開啟全局緩存開關(guān)(MyBatis 默認(rèn)開啟,建議顯式配置):

mybatis-plus:
  configuration:
    cache-enabled: true  # 全局啟用二級(jí)緩存(默認(rèn)為true)
  mapper-locations: classpath*:mapper/**/*.xml  # 指定Mapper.xml路徑

2.2 實(shí)體類實(shí)現(xiàn)序列化

二級(jí)緩存存儲(chǔ)對(duì)象需支持序列化(避免緩存失?。?/p>

package com.example.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class User implements Serializable {
    private static final long serialVersionUID = 1L;  // 必須添加序列化版本號(hào)
    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String email;
    private LocalDateTime createTime;
}

2.3 在 Mapper 中開啟二級(jí)緩存

有兩種方式配置 Mapper 級(jí)別的二級(jí)緩存,根據(jù)項(xiàng)目風(fēng)格選擇:

方式 1:XML 配置(推薦,支持更多緩存參數(shù))

在對(duì)應(yīng)的UserMapper.xml中添加<cache>標(biāo)簽:

<?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">
    <!-- 配置二級(jí)緩存 -->
    <cache 
        eviction="LRU"        <!-- 緩存淘汰策略:LRU(最近最少使用) -->
        flushInterval="60000" <!-- 自動(dòng)刷新間隔(60秒) -->
        size="1024"           <!-- 最大緩存對(duì)象數(shù) -->
        readOnly="false"/>    <!-- 非只讀(需序列化) -->
    <!-- MP自動(dòng)生成的SQL會(huì)自動(dòng)使用緩存,自定義SQL需顯式配置 -->
    <select id="selectById" resultType="com.example.entity.User">
        SELECT id, username, email, create_time AS createTime 
        FROM t_user WHERE id = #{id}
    </select>
</mapper>

方式 2:注解配置(簡(jiǎn)化配置,適合無 XML 場(chǎng)景)

在 Mapper 接口上使用@CacheNamespace注解:

package com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.cache.impl.PerpetualCache;
// 注解方式開啟二級(jí)緩存,默認(rèn)使用PerpetualCache
@CacheNamespace(
    eviction = LruCache.class,  // 淘汰策略:LRU
    flushInterval = 60000,      // 刷新間隔60秒
    size = 1024,                // 最大緩存數(shù)
    readWrite = true            // 讀寫模式(非只讀)
)
public interface UserMapper extends BaseMapper<User> {
    // 繼承BaseMapper的方法會(huì)自動(dòng)使用緩存
}

三、高級(jí)配置(分布式緩存,Redis 為例)

單機(jī)緩存無法滿足分布式環(huán)境需求,需集成 Redis 實(shí)現(xiàn)緩存共享。

3.1 配置 Redis 連接

創(chuàng)建redis.properties(src/main/resources/):

redis.host=localhost
redis.port=6379
redis.timeout=2000
redis.password=  # 無密碼則留空
redis.database=0
redis.default.expiration=1800000  # 緩存默認(rèn)過期時(shí)間(30分鐘)

3.2 配置 Mapper 使用 Redis 緩存

方式 1:XML 配置指定 Redis 緩存類型

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 使用Redis作為二級(jí)緩存 -->
    <cache type="org.mybatis.caches.redis.RedisCache">
        <property name="eviction" value="LRU"/>
        <property name="flushInterval" value="60000"/>
        <property name="size" value="1024"/>
    </cache>
</mapper>

方式 2:注解配置自定義 Redis 緩存

package com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.CacheNamespace;
import org.mybatis.caches.redis.RedisCache;
// 注解方式指定Redis緩存
@CacheNamespace(implementation = RedisCache.class)
public interface UserMapper extends BaseMapper<User> {
}

3.3 自定義 Redis 緩存(可選,優(yōu)化序列化)

默認(rèn) Redis 緩存使用 Java 序列化,性能較差,可自定義 JSON 序列化:

package com.example.cache;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.mybatis.caches.redis.RedisCache;
import java.util.concurrent.locks.ReadWriteLock;
public class JsonRedisCache extends RedisCache {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    public JsonRedisCache(String id) {
        super(id);
    }
    @Override
    public void putObject(Object key, Object value) {
        try {
            // 序列化為JSON字符串
            String jsonValue = OBJECT_MAPPER.writeValueAsString(value);
            super.putObject(key, jsonValue);
        } catch (Exception e) {
            throw new RuntimeException("緩存序列化失敗", e);
        }
    }
    @Override
    public Object getObject(Object key) {
        try {
            String jsonValue = (String) super.getObject(key);
            if (jsonValue != null) {
                // 反序列化為目標(biāo)對(duì)象(根據(jù)實(shí)際類型調(diào)整)
                return OBJECT_MAPPER.readValue(jsonValue, User.class);
            }
        } catch (Exception e) {
            throw new RuntimeException("緩存反序列化失敗", e);
        }
        return null;
    }
    // 禁用默認(rèn)鎖(Redis本身是單線程,無需額外鎖)
    @Override
    public ReadWriteLock getReadWriteLock() {
        return null;
    }
}

使用自定義緩存:

<cache type="com.example.cache.JsonRedisCache"/>

四、緩存細(xì)粒度控制

MyBatis-Plus 支持對(duì)單個(gè)方法配置緩存策略,覆蓋全局設(shè)置。

4.1 禁用特定查詢的緩存

<!-- XML方式:當(dāng)前查詢不使用二級(jí)緩存 -->
<select id="selectByUsername" resultType="User" useCache="false">
    SELECT * FROM t_user WHERE username = #{username}
</select>
// 注解方式:使用@Options禁用緩存
import org.apache.ibatis.annotations.Options;
public interface UserMapper extends BaseMapper<User> {
    @Options(useCache = false)
    User selectByUsername(String username);
}

4.2 強(qiáng)制刷新緩存

<!-- 執(zhí)行該查詢前清空緩存 -->
<select id="selectLatestUsers" resultType="User" flushCache="true">
    SELECT * FROM t_user ORDER BY create_time DESC LIMIT 10
</select>
// 注解方式強(qiáng)制刷新
@Options(flushCache = Options.FlushCachePolicy.TRUE)
List<User> selectLatestUsers();

五、驗(yàn)證二級(jí)緩存生效

編寫測(cè)試類驗(yàn)證緩存是否生效:

package com.example.test;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Objects;
@Slf4j
@SpringBootTest
public class MpCacheTest {
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    @Test
    public void testSecondLevelCache() {
        // 第一次查詢:緩存未命中,查數(shù)據(jù)庫
        try (SqlSession session1 = sqlSessionFactory.openSession()) {
            UserMapper mapper1 = session1.getMapper(UserMapper.class);
            User user1 = mapper1.selectOne(new QueryWrapper<User>().eq("id", 1L));
            log.info("第一次查詢結(jié)果:{}", user1);
        } // 會(huì)話關(guān)閉,數(shù)據(jù)存入二級(jí)緩存
        // 第二次查詢:命中二級(jí)緩存
        try (SqlSession session2 = sqlSessionFactory.openSession()) {
            UserMapper mapper2 = session2.getMapper(UserMapper.class);
            User user2 = mapper2.selectOne(new QueryWrapper<User>().eq("id", 1L));
            log.info("第二次查詢結(jié)果:{}", user2);
        }
    }
}

預(yù)期日志(第二次查詢無 SQL 輸出,證明命中緩存):

第一次查詢結(jié)果:User(id=1, username=test, ...)
==>  Preparing: SELECT ... FROM t_user WHERE (id = ?)
==> Parameters: 1(Long)
<==      Total: 1
第二次查詢結(jié)果:User(id=1, username=test, ...)  // 無SQL執(zhí)行,命中二級(jí)緩存

六、注意事項(xiàng)

  • BaseMapper 方法的緩存行為
    • MyBatis-Plus 自動(dòng)生成的 CRUD 方法(如selectById、updateById)會(huì)自動(dòng)遵循緩存配置,更新操作會(huì)觸發(fā)緩存清空。
  • 分頁插件與緩存
    • 使用Page分頁查詢時(shí),緩存鍵會(huì)包含分頁參數(shù)(pageNum、pageSize),確保不同分頁的結(jié)果正確緩存。
  • 多表關(guān)聯(lián)查詢
    • 若 Mapper 中包含多表關(guān)聯(lián)查詢,建議使用@CacheNamespaceRef關(guān)聯(lián)相關(guān) Mapper,確保更新任一表時(shí)同步清空緩存:
@CacheNamespaceRef(UserMapper.class)  // 共享UserMapper的緩存
public interface UserOrderMapper extends BaseMapper<UserOrder> {
}
  • 避免緩存超大結(jié)果集
    • 對(duì)返回大量數(shù)據(jù)的查詢(如selectList()無限制條件),建議禁用緩存(useCache=false),避免內(nèi)存溢出。

總結(jié)

MyBatis-Plus 配置二級(jí)緩存的核心是:

  1. 全局開啟cache-enabled: true
  2. 實(shí)體類實(shí)現(xiàn)Serializable
  3. 在 Mapper 中通過 XML 或注解配置<cache>/@CacheNamespace
  4. 分布式環(huán)境替換為 Redis 緩存

通過合理配置,可充分利用二級(jí)緩存減少數(shù)據(jù)庫訪問,同時(shí)需平衡緩存命中率與數(shù)據(jù)一致性,避免臟讀問題。

到此這篇關(guān)于mybatisplus 配置二級(jí)緩存的文章就介紹到這了,更多相關(guān)mybatisplus 二級(jí)緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java selenium教程環(huán)境搭建基于Maven

    java selenium教程環(huán)境搭建基于Maven

    本文主要介紹Java selenium 環(huán)境的安裝,這里介紹了基于Maven的環(huán)境搭建,有需要的小伙伴可以參考下
    2016-08-08
  • SpringBoot整合Apache Ignite的實(shí)現(xiàn)

    SpringBoot整合Apache Ignite的實(shí)現(xiàn)

    本文主要介紹了SpringBoot整合Apache Ignite的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Hibernate分頁的兩種實(shí)現(xiàn)方法

    Hibernate分頁的兩種實(shí)現(xiàn)方法

    這篇文章主要介紹了Hibernate分頁的兩種實(shí)現(xiàn)方法,結(jié)合實(shí)例形式講述了criteria分頁與hql分頁的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-03-03
  • 詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵

    詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵

    這篇文章主要介紹了詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵,有興趣的可以了解一下。
    2017-01-01
  • 你的Idea還有BUG嗎不妨試試另一個(gè)開發(fā)神器

    你的Idea還有BUG嗎不妨試試另一個(gè)開發(fā)神器

    Spring Tool Suite(STS)就是一個(gè)基于Eclipse的開發(fā)環(huán)境, 用于開發(fā)Spring應(yīng)用程序。本文給大家給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-12-12
  • Flink實(shí)現(xiàn)特定統(tǒng)計(jì)的歸約聚合reduce操作

    Flink實(shí)現(xiàn)特定統(tǒng)計(jì)的歸約聚合reduce操作

    這篇文章主要介紹了Flink實(shí)現(xiàn)特定統(tǒng)計(jì)的歸約聚合reduce操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • JAVA中方法的聲明及使用方式(繼承、多態(tài)、封裝)

    JAVA中方法的聲明及使用方式(繼承、多態(tài)、封裝)

    這篇文章主要介紹了JAVA中方法的聲明及使用方式(繼承、多態(tài)、封裝),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • JavaMe開發(fā)繪制可自動(dòng)換行文本

    JavaMe開發(fā)繪制可自動(dòng)換行文本

    JavaMe Graphics類中的drawString不支持文本換行,這樣繪制比較長(zhǎng)的字符串時(shí),文本被繪制在同一行,超過屏幕部分的字符串被截?cái)嗔?。如何使繪制的文本能自動(dòng)換行呢?
    2015-09-09
  • Spring IOC基于注解啟動(dòng)示例詳析

    Spring IOC基于注解啟動(dòng)示例詳析

    這篇文章主要給大家介紹了Spring IOC基于注解啟動(dòng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • hadoop的wordcount實(shí)例代碼

    hadoop的wordcount實(shí)例代碼

    這篇文章主要介紹了hadoop的wordcount實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論