zoukankan      html  css  js  c++  java
  • Failed to process, please exclude the tableName or statementId.--Mybatis-Plus

    多租户
    多个用户间使用同一套程序,但每个用户之间实现数据隔离

    方法一
    :在 Mapper 的自定义方法上添加注解 @SqlParser(filter = true),在查询的时候不需要添加租户信息

    @SqlParser(filter=true)
    IPage<CognitiveCardPackagePageData> selectCognitiveCardPackagePage(Page page,@Param("query") OkyaCognitiveCardPackagePageListQueryData req);

    方法二
    @Slf4j
    @Configuration
    @MapperScan(value = {"com.**.dao"})
    public class MyBatisPlusConfig {

    /**
    * 分页插件
    */
    @Bean
    public PaginationInterceptor paginationInterceptor(DynamicTableNameParser dynamicTableNameParser) {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    List<ISqlParser> sqlParserList = new ArrayList<>();
    // 添加租户sql解析链,如果是开发业务系统,可以去掉这个配置,不去也可以。
    TenantSqlParser tenantSqlParser = new TenantSqlParser();
    tenantSqlParser.setTenantHandler(tenantHandler());
    sqlParserList.add(tenantSqlParser);
    // 设置sql解析链
    paginationInterceptor.setSqlParserList(sqlParserList);
    // 设置过滤器链
    paginationInterceptor.setSqlParserFilter(sqlParserFilter());
    return paginationInterceptor;
    }

    @Bean
    public TenantHandler tenantHandler() {
    return new TenantHandler() {
    @Override
    public Expression getTenantId() {
    // 返回当前登录人员的租户ID
    return new LongValue(
    RbacUserUtils.getCurrentTenantId());
    }
    @Override
    public String getTenantIdColumn() {
    return "tenant_id";
    }
    @Override
    public boolean doTableFilter(String tableName) {
    return false;
    }
    };
    }

    /**
    * 如何有自定义无租户的查询,可以在此过滤
    * @return SQL解析过滤
    */
    @Bean
    public ISqlParserFilter sqlParserFilter() {
    return metaObject -> {
    // 如果在程序中已经手动设置了tenant_id,此处就过滤
    Object boundSql = metaObject.getValue("boundSql");
    String sql = String.valueOf(ReflectionUtils
    .getFieldValue(boundSql, "sql"));
    return StringUtils.containsIgnoreCase(sql, "insert")
    && StringUtils.containsIgnoreCase(sql, "tenant_id");
    };
    }
    }


    注意此处的sqlParserFilter的配置,在没有此配置之前,无论你是插入、更新、查询,mybatis plus 就带上tenant_id,这个tenant_id不是一直都是有的,在注册租户的时候就是没有的,不过这也没有关系,我们可以当系统当前没有登录的租户时就将租户的ID统一设置为-1(一个统一特殊的数值),有登录的用户就获取该用户的租户ID获租户自己的ID。这是没有问题的。

  • 相关阅读:
    Layui的省市区三级联动
    Uncaught SyntaxError: Unexpected token ','
    Cannot use 'in' operator to search for '23' in
    Linux 递归批量删除文件夹或文件的命令
    PHPstorm常用快捷键(Windows)
    Isset、empty、count、is_null的比较
    PHPstorm快捷键的学习
    Elasticsearch索引按月划分以及获取所有索引数据
    Elasticsearch入门
    java自学-流程控制语句
  • 原文地址:https://www.cnblogs.com/xianz666/p/13472776.html
Copyright © 2011-2022 走看看