mybatis plus自定义拦截器
在实际业务中需要实现机群,特定的查询 ,我们可有通过自定义拦截器去实现
·
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();
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)