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("-", "");
    }
}
相关推荐
geNE GENT14 分钟前
Spring Boot管理用户数据
java·spring boot·后端
怒放吧德德17 分钟前
Spring Boot实战:Event事件机制解析与实战
java·spring boot·后端
wsx_iot37 分钟前
arthas使用
java·arthas
lifallen1 小时前
Flink Watermark 设计分析
java·大数据·flink
AKA__Zas1 小时前
初识 事务
java·开发语言·数据库·sql
kongba0071 小时前
2026年4月19日 kimi记忆备份
java·前端·数据库
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】01_说说ArrayList的底层原理/扩容规则
java·后端·面试·list
高斯林.神犇1 小时前
六、java配置类改造ioc
java·开发语言
zuowei28892 小时前
Spring BOOT 启动参数
java·spring boot·后端
张小洛2 小时前
Spring 常用类深度剖析(工具篇 04):CollectionUtils 与 Stream API 的对比与融合
java·后端·spring·spring工具类·spring utils·spring 类解析