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("-", "");
    }
}
相关推荐
一点程序9 分钟前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹11 分钟前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_9498095915 分钟前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
vx_BS8133044 分钟前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_9498683644 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
达文汐1 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
培风图南以星河揽胜1 小时前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划
启山智软2 小时前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋2 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怪兽源码2 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统