一、MybatisPlus 配置 插入配置的 租户
MyTenantLineHandler
@Configuration @MapperScan("com.jie.**.mapper") @EnableTransactionManagement public class MybatisPlusConfig { /** * druid注入 * @return dataSource */ @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource dataSource() { return DruidDataSourceBuilder.create().build(); } /** * 配置事物管理器 * @return DataSourceTransactionManager */ @Bean(name="transactionManager") public DataSourceTransactionManager transactionManager(){ return new DataSourceTransactionManager(dataSource()); } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 租户插件 interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new MyTenantLineHandler())); // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 乐观锁插件 interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); // 阻断插件 interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); return interceptor; } /** * 乐观锁 */ @Bean public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { return new OptimisticLockerInnerInterceptor(); } /** * 防止全表更新与删除 */ @Bean public BlockAttackInnerInterceptor blockAttackInnerInterceptor() { return new BlockAttackInnerInterceptor(); } }
二、多租户处理器
@Slf4j @Component public class MyTenantLineHandler implements TenantLineHandler { /** * 排除过滤的表 */ private static final String[] TABLE_FILTER = {"jie_menu","jie_tenant_package","jie_tenant","jie_dict","jie_dict_data","jie_area"}; /** * 排除过滤的表前缀 */ private static final String[] TABLE_PRE = {"t", "gen"}; @Override public Expression getTenantId() { // 取出当前请求的服务商ID,通过解析器注入到SQL中。 Long tenantId = SecurityUtils.getTenantId(); if (tenantId == null) { return new NullValue(); } return new LongValue(tenantId); } /** * 跳过不需要加多租户的表 */ @Override public boolean ignoreTable(String tableName) { String prefix = StringUtils.substringBefore(tableName, "_"); if (Arrays.asList(TABLE_FILTER).contains(tableName) || Arrays.asList(TABLE_PRE).contains(prefix)) { return true; } return false; } }
三、mybatis plus 字段默认值处理类
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); this.setFieldValByName("createdTime", new Date(), metaObject); this.setFieldValByName("deleted", false, metaObject); this.setFieldValByName("version", 1L, metaObject); Object createUser = this.getFieldValByName("createdBy", metaObject); if (createUser == null) { if(SecurityUtils.isLogin()) { this.setFieldValByName("createdBy",SecurityUtils.getUserId(),metaObject); } } } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.setFieldValByName("updatedTime", new Date(), metaObject); this.setFieldValByName("version", 2L, metaObject); Object createUser = this.getFieldValByName("updatedBy", metaObject); if (createUser == null) { if(SecurityUtils.isLogin()) { this.setFieldValByName("updatedBy",SecurityUtils.getUserId(),metaObject); } } } }