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("-", "");
    }
}
相关推荐
李可以量化11 分钟前
Tornado 从了解到精通(一)下:异步与非阻塞 IO 核心原理
java·数据库·tornado
yurenpai(27届找实习中)12 分钟前
从销售订单推送 MES 看懂微服务调用(二):DTO 转换与 OpenFeign 调用
java·微服务·架构·服务调用
Patrick在香港18 分钟前
Python爬虫框架实战:优雅抓取香港政府公开API数据的通用方案
java·开发语言·爬虫·python·ai编程·数据可视化·可用性测试
hey_sml28 分钟前
MySQL常用操作速记:从字符集到游标全解析
java·开发语言·mysql
掉鱼的猫31 分钟前
Solon AOT & Native:三段式编译,从 Java 到原生可执行文件
java·云原生
Java内核笔记35 分钟前
容错能力进入 spring-core:Spring Boot 4 原生重试机制全解析
java·后端
未秃头的程序猿40 分钟前
虚拟线程上线一周后翻车了——pinning问题排查实录
java·后端·架构
wuminyu43 分钟前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
带刺的坐椅1 小时前
Solon AOT & Native:三段式编译,从 Java 到原生可执行文件
java·aot·solon·native
程序员良辰1 小时前
【TongWeb8】使用 Crontab 定时重启和检测 TongWeb 服务
java·中间件·tomcat