mybatis-plus 多租户
package com.ruoyi.framework.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import com.ruoyi.common.extension.MpSqlInjector; import lombok.AllArgsConstructor; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; @AllArgsConstructor @EnableTransactionManagement(proxyTargetClass = true) @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { // manager_id = 1088248166370832385 // 获取租户 ID 值表达式,只支持单个 ID 值 @Override public Expression getTenantId() { // return new LongValue(1088248166370832385L); return new LongValue(1L); } // 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件, // 这里设置 role表不需要该条件 @Override public boolean ignoreTable(String tableName) { // if ("role".equals(tableName)) { // return true; // } // return false; if (tableName.substring(0, 2).equals("at")) return false; return true; } @Override public String getTenantIdColumn() { return "tenantid"; } })); // interceptor.addInnerInterceptor(tenantLineInnerInterceptor()); // 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add // PaginationInnerInterceptor // 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false // 分页插件 // interceptor.addInnerInterceptor(paginationInnerInterceptor()); // 乐观锁插件 interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); // 阻断插件 interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); return interceptor; } @SuppressWarnings("deprecation") @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setUseDeprecatedExecutor(Boolean.FALSE); } @Bean public MpSqlInjector easySqlInjector() { return new MpSqlInjector(); } /** * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html */ public PaginationInnerInterceptor paginationInnerInterceptor() { PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); // 设置数据库类型为mysql paginationInnerInterceptor.setDbType(DbType.MYSQL); // 设置最大单页限制数量,默认 500 条,-1 不受限制 paginationInnerInterceptor.setMaxLimit(-1L); return paginationInnerInterceptor; } /** * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html */ public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { return new OptimisticLockerInnerInterceptor(); } /** * 如果是对全表的删除或更新操作,就会终止该操作 * https://baomidou.com/guide/interceptor-block-attack.html */ public BlockAttackInnerInterceptor blockAttackInnerInterceptor() { return new BlockAttackInnerInterceptor(); } /** * sql性能规范插件(垃圾SQL拦截) 如有需要可以启用 */ // public IllegalSQLInnerInterceptor illegalSQLInnerInterceptor() { // return new IllegalSQLInnerInterceptor(); // } /** * 自定义主键策略 https://baomidou.com/guide/id-generator.html */ // @Bean // public IdentifierGenerator idGenerator() { // return new CustomIdGenerator(); // } /** * 元对象字段填充控制器 https://baomidou.com/guide/auto-fill-metainfo.html */ // @Bean // public MetaObjectHandler metaObjectHandler() { // return new MyMetaObjectHandler(); // } /** * sql注入器配置 https://baomidou.com/guide/sql-injector.html */ // @Bean // public ISqlInjector sqlInjector() { // return new DefaultSqlInjector(); // } /** * TenantLineInnerInterceptor 多租户插件 本项目已经实现完整的多租户功能,但应用不广泛,基本框架中删除 */ // @Bean // public TenantLineInnerInterceptor tenantLineInnerInterceptor() // { // return new TenantLineInnerInterceptor(new TenantLineHandler() // { // /** // * 获取租户ID // * @return // */ // @Override // public Expression getTenantId() // { // String tenant = TenantContextHolder.getTenantId(); // if (tenant != null) // { // return new StringValue(TenantContextHolder.getTenantId()); // } // return new StringValue("99999"); // } // // /** // * 获取多租户的字段名 // * @return String // */ // @Override // public String getTenantIdColumn() // { // return tenantProperties.getColumn(); // } // // /** // * 过滤不需要根据租户隔离的表 // * 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件 // * @param tableName 表名 // */ // @Override // public boolean ignoreTable(String tableName) // { // return tenantProperties.getIgnores().stream().anyMatch((t) -> // t.equalsIgnoreCase(tableName)); // } // }); // } }
package com.ruoyi.framework.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import com.ruoyi.common.extension.MpSqlInjector; import lombok.AllArgsConstructor; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; @AllArgsConstructor @EnableTransactionManagement(proxyTargetClass = true) @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { // manager_id = 1088248166370832385 // 获取租户 ID 值表达式,只支持单个 ID 值 @Override public Expression getTenantId() { // return new LongValue(1088248166370832385L); return new LongValue(1L); } // 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件, // 这里设置 role表不需要该条件 @Override public boolean ignoreTable(String tableName) { // if ("role".equals(tableName)) { // return true; // } // return false; if (tableName.substring(0, 2).equals("at")) return false; return true; } @Override public String getTenantIdColumn() { return "tenantid"; } })); // interceptor.addInnerInterceptor(tenantLineInnerInterceptor()); // 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add // PaginationInnerInterceptor // 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false // 分页插件 // interceptor.addInnerInterceptor(paginationInnerInterceptor()); // 乐观锁插件 interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); // 阻断插件 interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); return interceptor; } @SuppressWarnings("deprecation") @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setUseDeprecatedExecutor(Boolean.FALSE); } @Bean public MpSqlInjector easySqlInjector() { return new MpSqlInjector(); } /** * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html */ public PaginationInnerInterceptor paginationInnerInterceptor() { PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); // 设置数据库类型为mysql paginationInnerInterceptor.setDbType(DbType.MYSQL); // 设置最大单页限制数量,默认 500 条,-1 不受限制 paginationInnerInterceptor.setMaxLimit(-1L); return paginationInnerInterceptor; } /** * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html */ public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { return new OptimisticLockerInnerInterceptor(); } /** * 如果是对全表的删除或更新操作,就会终止该操作 * https://baomidou.com/guide/interceptor-block-attack.html */ public BlockAttackInnerInterceptor blockAttackInnerInterceptor() { return new BlockAttackInnerInterceptor(); } /** * sql性能规范插件(垃圾SQL拦截) 如有需要可以启用 */ // public IllegalSQLInnerInterceptor illegalSQLInnerInterceptor() { // return new IllegalSQLInnerInterceptor(); // } /** * 自定义主键策略 https://baomidou.com/guide/id-generator.html */ // @Bean // public IdentifierGenerator idGenerator() { // return new CustomIdGenerator(); // } /** * 元对象字段填充控制器 https://baomidou.com/guide/auto-fill-metainfo.html */ // @Bean // public MetaObjectHandler metaObjectHandler() { // return new MyMetaObjectHandler(); // } /** * sql注入器配置 https://baomidou.com/guide/sql-injector.html */ // @Bean // public ISqlInjector sqlInjector() { // return new DefaultSqlInjector(); // } /** * TenantLineInnerInterceptor 多租户插件 本项目已经实现完整的多租户功能,但应用不广泛,基本框架中删除 */ // @Bean // public TenantLineInnerInterceptor tenantLineInnerInterceptor() // { // return new TenantLineInnerInterceptor(new TenantLineHandler() // { // /** // * 获取租户ID // * @return // */ // @Override // public Expression getTenantId() // { // String tenant = TenantContextHolder.getTenantId(); // if (tenant != null) // { // return new StringValue(TenantContextHolder.getTenantId()); // } // return new StringValue("99999"); // } // // /** // * 获取多租户的字段名 // * @return String // */ // @Override // public String getTenantIdColumn() // { // return tenantProperties.getColumn(); // } // // /** // * 过滤不需要根据租户隔离的表 // * 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件 // * @param tableName 表名 // */ // @Override // public boolean ignoreTable(String tableName) // { // return tenantProperties.getIgnores().stream().anyMatch((t) -> // t.equalsIgnoreCase(tableName)); // } // }); // } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人