一、代碼實現
1、添加攔截器
@Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); ArrayList<ISqlParser> sqlParserList = new ArrayList<>(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public String getTenantIdColumn() { //獲取租戶字段名 return "manager_id"; } @Override public Expression getTenantId() { //獲取租戶 ID 值表達式,只支持單個 ID 值,一般來自session/token等 return new LongValue(1087982257332887553L); } @Override public boolean doTableFilter(String tableName) { //根據表名判斷是否忽略拼接多租戶條件 //默認都要進行解析並拼接多租戶條件 //true:表示忽略,false:需要解析並拼接多租戶條件 return false; } }); sqlParserList.add(tenantSqlParser); paginationInterceptor.setSqlParserList(sqlParserList); return paginationInterceptor; }
2、測試
@Test public void select(){ List<User> list = userMapper.selectList(null); list.forEach(System.out::println); }
可以看到測試雖然是查詢全部,但是添加了條件:manager_id = 1087982257332887553
二、特點SQL過濾
1、方式一
這種方式可以過濾MP自帶的方法,也可以過濾我們自己定義在xml里的方法
@Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); ArrayList<ISqlParser> sqlParserList = new ArrayList<>(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public String getTenantIdColumn() { //獲取租戶字段名 return "manager_id"; } @Override public Expression getTenantId() { //獲取租戶 ID 值表達式,只支持單個 ID 值,一般來自session/token等 return new LongValue(1087982257332887553L); } @Override public boolean doTableFilter(String tableName) { //根據表名判斷是否忽略拼接多租戶條件 //默認都要進行解析並拼接多租戶條件 //true:表示忽略,false:需要解析並拼接多租戶條件 return false; } }); sqlParserList.add(tenantSqlParser); paginationInterceptor.setSqlParserList(sqlParserList); //設置哪些SQL不拼接多租戶條件 paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() { //true:表示忽略,false:需要解析並拼接多租戶條件 @Override public boolean doFilter(MetaObject metaObject) { MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject); if ("com.mp.dao.UserMapper.selectList".equals(ms.getId())) { return true; } return false; } }); return paginationInterceptor; }
2、方式二
使用@SqlParser(filter = true)來過濾
public interface UserMapper extends BaseMapper<User> { @SqlParser(filter = true) List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> queryWrapper); }
注意:低版本MP需要在配置文件中設置:mybatis-plus.global-config.sql-parser-cache=true