MyBatis Plus 中常用的插件列表

一、MyBatis Plus 官方插件列表

  1. 核心插件(InnerInterceptor 实现类)

    (1)分页插件

    java 复制代码
    PaginationInnerInterceptor

    (2)乐观锁插件

    java 复制代码
    OptimisticLockerInnerInterceptor

    (3)防止全表更新与删除插件

    java 复制代码
    BlockAttackInnerInterceptor

    (4)SQL 性能规范插件

    java 复制代码
    IllegalSQLInnerInterceptor

    (5)动态表名插件

    java 复制代码
    DynamicTableNameInnerInterceptor

    (6)多租户插件

    java 复制代码
    TenantLineInnerInterceptor

    (7)数据权限插件

    java 复制代码
    DataPermissionInterceptor  // 已废弃,推荐使用 TenantLineInnerInterceptor 或自定义

    (8)字段加解密插件

    java 复制代码
    EncryptorInnerInterceptor  // v3.5.0+ 版本提供

    (9)关联查询插件(已废弃)

    java 复制代码
    innerInterceptor(new JsqlParserCountOptimize())
  2. 其他重要插件和组件

    (10)SQL 注入器(不是插件,但功能类似)

    java 复制代码
    ISqlInjector
    • LogicSqlInjector - 逻辑删除注入器
    • DefaultSqlInjector - 默认注入器
    • 可自定义实现,用于注入自定义方法

    (11)主键生成器

    java 复制代码
    IdentifierGenerator
    • DefaultIdentifierGenerator - 默认(雪花算法)
    • CustomIdGenerator - 自定义
    • UUID - UUID 生成器

    (12)ID 类型处理器

    java 复制代码
    IdType

    控制主键生成策略

    (13)元对象处理器

    java 复制代码
    MetaObjectHandler

    用于自动填充字段(如 create_time, update_time)

    (14)性能分析插件(已废弃,推荐使用 p6spy)

    java 复制代码
    PerformanceInterceptor  // 已废弃

完整配置示例(包含所有可用插件)

java 复制代码
@Configuration
public class MybatisPlusConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        
        // 1. 多租户插件(必须最先添加)
        interceptor.addInnerInterceptor(tenantLineInnerInterceptor());
        
        // 2. 动态表名插件
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor());
        
        // 3. 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        
        // 4. 乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        
        // 5. 字段加解密插件(v3.5.0+)
        // interceptor.addInnerInterceptor(new EncryptorInnerInterceptor());
        
        // 6. 防止全表更新与删除插件
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        
        // 7. SQL 性能规范插件
        interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor());
        
        return interceptor;
    }
    
    // 多租户配置
    @Bean
    public TenantLineInnerInterceptor tenantLineInnerInterceptor() {
        return new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                return new LongValue(1L); // 实际应从上下文获取
            }
            
            @Override
            public String getTenantIdColumn() {
                return "tenant_id";
            }
            
            @Override
            public boolean ignoreTable(String tableName) {
                return "sys_config".equals(tableName); // 忽略系统配置表
            }
        });
    }
    
    // 动态表名配置
    @Bean
    public DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {
        DynamicTableNameInnerInterceptor interceptor = new DynamicTableNameInnerInterceptor();
        Map<String, TableNameHandler> handlerMap = new HashMap<>();
        handlerMap.put("order", (sql, tableName) -> {
            // 动态表名逻辑
            return tableName + "_2024";
        });
        interceptor.setTableNameHandlerMap(handlerMap);
        return interceptor;
    }
    
    // 自动填充处理器
    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new MetaObjectHandler() {
            @Override
            public void insertFill(MetaObject metaObject) {
                this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
                this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
            }
            
            @Override
            public void updateFill(MetaObject metaObject) {
                this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
            }
        };
    }
    
    // 自定义主键生成器
    @Bean
    public IdentifierGenerator idGenerator() {
        return new CustomIdGenerator();
    }
    
    // 自定义 SQL 注入器
    @Bean
    public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
        return plusProperties -> plusProperties.getGlobalConfig().setSqlInjector(new MySqlInjector());
    }
}

// 自定义 ID 生成器
class CustomIdGenerator implements IdentifierGenerator {
    @Override
    public Number nextId(Object entity) {
        // 返回自定义 ID
        return SnowFlakeUtil.nextId();
    }
    
    @Override
    public String nextUUID(Object entity) {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
}
相关推荐
Boilermaker19922 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维3 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_993 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子3 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34163 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
恋爱绝缘体14 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wszy18094 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
wszy18094 小时前
顶部标题栏的设计与实现:让用户知道自己在哪
java·python·react native·harmonyos
程序员小假5 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
资生算法程序员_畅想家_剑魔5 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin