期望效果:在xml里面寫sql時自動追加deleted邏輯刪除字段。比如SELECT count(0) FROM aaa。 執行時最終為 SELECT count(0) FROM aaa WHERE deleted = '0'
實現代碼如下:
@Bean
public TenantLineInnerInterceptor tenantLineInnerInterceptor(com.broker.framework.tenant.config.TenantProperties properties, MybatisPlusInterceptor interceptor) { TenantLineInnerInterceptor inner2 = new TenantLineInnerInterceptor(new LogicDeleteDatabaseInterceptor(properties)); MyBatisUtils.addInterceptor(interceptor, inner2, 0); return inner2; }
public class LogicDeleteDatabaseInterceptor implements TenantLineHandler { private final Set<String> ignoreTables = new HashSet<>(); //忽略表,如果不需要,可以去除掉 public LogicDeleteDatabaseInterceptor(TenantProperties properties) { // 不同 DB 下,大小寫的習慣不同,所以需要都添加進去 properties.getIgnoreTables().forEach(table -> { ignoreTables.add(table.toLowerCase()); ignoreTables.add(table.toUpperCase()); }); // 在 OracleKeyGenerator 中,生成主鍵時,會查詢這個表,查詢這個表后,會自動拼接 TENANT_ID 導致報錯 ignoreTables.add("DUAL"); } @Override public Expression getTenantId() { return new LongValue(0); } @Override public boolean ignoreTable(String tableName) { return false; // // 全局忽略多租戶 || 忽略多租戶的表 ,如果有特殊表沒有deleted字段,可以增加忽略配置 // return TenantContextHolder.isIgnore() // || CollUtil.contains(ignoreTables, tableName); } @Override public String getTenantIdColumn() { return "deleted";//這里寫死為delete字段 } }
浙公網安備 33010602011771號