public class VehicleFleetInnerInterceptor extends JsqlParserSupport implements InnerInterceptor {

    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
        if (InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())) return;
        PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
        mpBs.sql(parserSingle(mpBs.sql(), null));
    }

    @Override
    protected void processSelect(Select select, int index, String sql, Object obj) {
        processSelectBody(select.getSelectBody());
        List<WithItem> withItemsList = select.getWithItemsList();
        if (!CollectionUtils.isEmpty(withItemsList)) {
            withItemsList.forEach(this::processSelectBody);
        }
    }

    protected void processSelectBody(SelectBody selectBody) {
        if (selectBody == null) {
            return;
        }
        processPlainSelect((PlainSelect) selectBody);
    }

    protected void processPlainSelect(PlainSelect plainSelect) {
        if (ContextUtil.get(ContextConstant.FLEET_ID) != null) {
            String fleetId = ContextUtil.get(ContextConstant.FLEET_ID).toString();
            String fleetType = ContextUtil.get(ContextConstant.FLEET_TYPE);
             // String fleetId = "3";
             // String fleetType = "DYNAMIC-MODEL";
            //只对部分主表实现过滤
            List<String> tablesAlias = Arrays.asList("v_vehicle","v_alarm_info","v_alarm_history");
            Table table = (Table) plainSelect.getFromItem();
            //过滤掉单表查询
            if(plainSelect.getJoins() != null){
                //构建新增的查询对象  根据不同的用户信息构建不同的sql
                if (fleetId != null && tablesAlias.contains(table.getName())) {
                    String sql = null;
                    switch (fleetType) {
                        case "STATIC":
                            sql = "inner  join v_vehicle_fleet_vin fleet  on  vv.vin  =  fleet.vin  and  fleet.fleet_id = " + fleetId;
                            break;
                        case "DYNAMIC-ORG":
                            sql = "inner  join v_vehicle_fleet_org fleet  on  vv.org_id  =  fleet.org_id  and  fleet.fleet_id = " + fleetId;
                            break;
                        case "DYNAMIC-ORG-XS":
                            sql = "inner  join v_vehicle_fleet_org fleet  on  vv.sale_org_id  =  fleet.org_id  and  fleet.fleet_id = " + fleetId;
                            break;
                        case "DYNAMIC-ORG-SC":
                            sql = "inner  join v_vehicle_fleet_org fleet  on  vv.product_org_id  =  fleet.org_id  and  fleet.fleet_id = " + fleetId;
                            break;
                        case "DYNAMIC-ORG-FW":
                            sql = "inner  join v_vehicle_fleet_org fleet  on  vv.service_org_id  =  fleet.org_id  and  fleet.fleet_id = " + fleetId;
                            break;
                        case "DYNAMIC-MODEL":
                            sql = "inner  join v_vehicle_fleet_model fleet  on  vv.vehicle_model_id  =  fleet.vehicle_model_id  and  fleet.fleet_id = " + fleetId;
                            break;
                    }
                    plainSelect.addJoins(getJoinUtil(sql));
                }
            }
        }
    }

    /**
     * 将 string 转化成 Join 对象
     *
     * @param sql
     * @return
     */
    public Join getJoinUtil(String sql) {
        CCJSqlParserManager pm = new CCJSqlParserManager();
        String defaultSql = "select  * from v_vehicle vv";
        String newSql = defaultSql + sql;
        try {
            net.sf.jsqlparser.statement.Statement parse = pm.parse(new StringReader(newSql));
            return ((PlainSelect) ((Select) parse).getSelectBody()).getJoins().get(0);
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
        return null;
    }
}

在配置文件中注入该拦截器

@Slf4j
@Configuration
@EnableConfigurationProperties(PeregrineMyBatisProperties.class)
public class MyBatisPlusConfig {

    @Autowired
    private PeregrineMyBatisProperties config;

    /**
     *  使用多个功能需要注意顺序关系,建议使用如下顺序
     *       多租户,动态表名
     *       分页,乐观锁
     *       sql性能规范,防止全表更新与删除
     *  总结: 对sql进行单次改造的优先放入,不对sql进行改造的最后放入
     * @param tenantLineInnerInterceptor
     * @return 拦截器
     */
    @Bean
    public MybatisPlusInterceptor paginationInterceptor(@Autowired(required = false) TenantLineInnerInterceptor tenantLineInnerInterceptor) {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //是否启用多租户
        if(config.getTenant().getEnabled()) {
            interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
        }
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        VehicleFleetInnerInterceptor vehicleFleetInnerInterceptor = new VehicleFleetInnerInterceptor();
        interceptor.addInnerInterceptor(vehicleFleetInnerInterceptor);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }

    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new BootMetaObjectHandler();
    }

    @Bean
    @ConditionalOnMissingBean
    public PeregrineSqlInjector getMySqlInjector() {
        return new PeregrineSqlInjector();
    }



}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐