当前位置: 首页 > wzjs >正文

自己建网站中国施工企业管理协会

自己建网站,中国施工企业管理协会,百度百科优化,旅游网站建设规范上一篇 mybatis-plus sql改写插件_mybatis-plus sql插件-CSDN博客 去年基于租户过滤,权限拦截都是where tenant_id XXX, 今年遇到一个物联网行业的需求,需要实现的是where sn in {sns} , 可能存在子查询,例如: where xinfo_id …

上一篇 mybatis-plus sql改写插件_mybatis-plus sql插件-CSDN博客 

去年基于租户过滤,权限拦截都是where tenant_id = XXX, 今年遇到一个物联网行业的需求,需要实现的是where sn in {sns} , 可能存在子查询,例如: where xinfo_id in (select x_id from x_info where sn in {sns}) ,这里的变量存在5个:xinfo_id,x_id,x_info,sn,sns 会有如下参数对象定义

@Dataclass SubSelectParam{String leftField; // xinfo_idboolean isSubQuery; // trueString subTableName; // x_infoString selectField; // x_idString subLeftField; // snExpressionList stations;  // sns}

以下是拦截完整代码

package com.sinexcel.framework.interceptor;import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.*;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;/*** 数据权限处理器* 根据用户角色和权限,拼接相应的 where 条件* 支持select 子句、where 子句、join 子句、from 子句** @since 3.4.1 +*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuppressWarnings({"rawtypes"})
public class DataPermissionInterceptor111 extends JsqlParserSupport implements InnerInterceptor {public final Map<String, SubSelectParam> interceptorTables = new HashMap<String, SubSelectParam>(){{// 不包含子查询的put("table_name_nosub", new SubSelectParam("sn", Collections.emptyList()));// 包含子查询的put("table_name_sub", new SubSelectParam("sn", "other_table_name", "id", "sn",Collections.emptyList()));}};private DataPermissionHandler dataPermissionHandler;@Overridepublic void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) return;PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);mpBs.sql(parserSingle(mpBs.sql(), ms.getId()));}@Overrideprotected void processSelect(Select select, int index, String sql, Object obj) {SelectBody selectBody = select.getSelectBody();// 普通查询处理分支if (selectBody instanceof PlainSelect) {this.recursiveSubSqlSetWhere((PlainSelect) selectBody, (String) obj);}}/*** 递归分别识别 select 子句中的子查询*            from 子句中可能存在子查询*            where 子句中可能存在子查询*            join 子句中可能存在子查询* @param plainSelect* @param whereSegment*/private void recursiveSubSqlSetWhere(PlainSelect plainSelect, String whereSegment) {this.setWhere(plainSelect, whereSegment);// from 子句中可能存在子查询if(plainSelect.getFromItem() instanceof SubSelect){SubSelect subSelect = (SubSelect)plainSelect.getFromItem();subSelectSetWhere(subSelect, whereSegment);}// join 子句中可能存在子查询if (plainSelect.getJoins() != null) {plainSelect.getJoins().forEach(j -> {if (j.getRightItem() instanceof SubSelect) {SubSelect subSelect = (SubSelect)j.getRightItem();subSelectSetWhere(subSelect, whereSegment);}});}// select 子句中可能存在子查询if (plainSelect.getSelectItems() != null) {plainSelect.getSelectItems().forEach(s -> {if (s instanceof SelectExpressionItem) {Expression expression = ((SelectExpressionItem) s).getExpression();if(expression instanceof SubSelect){SubSelect subSelect = (SubSelect)expression;subSelectSetWhere(subSelect, whereSegment);}}});}// where 子句中可能存在子查询if (plainSelect.getWhere() != null) {if(plainSelect.getWhere() instanceof BinaryExpression){BinaryExpression expression = (BinaryExpression) plainSelect.getWhere();recursiveWhereExpression(expression, whereSegment);}}// having 子句中可能存在子查询if (plainSelect.getHaving() != null) {if(plainSelect.getHaving() instanceof BinaryExpression){BinaryExpression expression = (BinaryExpression) plainSelect.getWhere();recursiveWhereExpression(expression, whereSegment);}}}/*** 递归找出where 子句中的子查询,并设置租户条件* @param expression* @param whereSegment*/private void recursiveWhereExpression(BinaryExpression expression, String whereSegment){if(expression.getLeftExpression() instanceof BinaryExpression){recursiveWhereExpression((BinaryExpression)expression.getLeftExpression(), whereSegment);}if(expression.getRightExpression() instanceof BinaryExpression){recursiveWhereExpression((BinaryExpression)expression.getRightExpression(), whereSegment);}if(expression.getLeftExpression() instanceof SubSelect){SubSelect subSelect = (SubSelect)expression.getLeftExpression();subSelectSetWhere(subSelect, whereSegment);}if(expression.getRightExpression() instanceof SubSelect){SubSelect subSelect = (SubSelect)expression.getRightExpression();subSelectSetWhere(subSelect, whereSegment);}}/*** 子句递归设置 where 条件* @param subSelect* @param whereSegment*/private void subSelectSetWhere(SubSelect subSelect, String whereSegment) {SelectBody selectBody = subSelect.getSelectBody();if (selectBody instanceof PlainSelect) {this.recursiveSubSqlSetWhere((PlainSelect) selectBody, whereSegment);}}/*** 设置 where 条件** @param plainSelect  查询对象* @param whereSegment 查询条件片段*/protected void setWhere(PlainSelect plainSelect, String whereSegment) {Expression sqlSegment = plainSelect.getWhere();String[] fromItem = plainSelect.getFromItem().toString().replaceAll("`", "").split(" ");String tableName = fromItem[0].contains(".") ? fromItem[0].split("\\.")[1] : fromItem[0];String aliasName = fromItem.length > 1 ? fromItem[1] : fromItem[0];// 权限拦截器SubSelectParam subSelectParam = interceptorTables.get(tableName.toLowerCase());if(subSelectParam != null) {InExpression inExpression;if(subSelectParam.isSubQuery){inExpression = new InExpression(new Column(aliasName + "." + subSelectParam.getLeftField()),buildInSubQuery(subSelectParam));}else{inExpression = new InExpression(new Column(aliasName + "." + subSelectParam.getLeftField()),subSelectParam.getStations());}sqlSegment = (sqlSegment == null ? inExpression : new AndExpression(sqlSegment, inExpression));}else if("xxx".equalsIgnoreCase(tableName)){// TODO 其他场景处理}else{// 无处理}if (null != sqlSegment) {plainSelect.setWhere(sqlSegment);}}public static SubSelect buildInSubQuery(SubSelectParam subSelectParam) {SubSelect subSelectWrapper = new SubSelect().withSelectBody(new PlainSelect().withSelectItems(List.of(new SelectExpressionItem(new Column(subSelectParam.getSelectField())))).withFromItem(new Table(subSelectParam.getSubTableName())).withWhere(new InExpression(new Column(subSelectParam.getSubLeftField()),subSelectParam.getStations())));return subSelectWrapper;}@Dataclass SubSelectParam{String leftField;boolean isSubQuery;String subTableName;String selectField;String subLeftField;ExpressionList stations;public SubSelectParam() {}/**** @param leftField* @param stations*/public SubSelectParam(String leftField, ExpressionList stations) {this.leftField = leftField;this.stations = stations;this.isSubQuery = false;}/**** @param leftField* @param stations*/public SubSelectParam(String leftField, List<String> stations) {super();List<Expression> expressions = stations.stream().map(StringValue::new).collect(Collectors.toList());this.stations = new ExpressionList(expressions);this.leftField = leftField;this.isSubQuery = false;}/**** @param leftField* @param subTableName* @param selectField* @param subLeftField* @param stations*/public SubSelectParam(String leftField, String subTableName, String selectField, String subLeftField, ExpressionList stations) {super();this.leftField = leftField;this.subTableName = subTableName;this.selectField = selectField;this.subLeftField = subLeftField;this.stations = stations;this.isSubQuery = true;}/**** @param leftField* @param subTableName* @param selectField* @param subLeftField* @param stations*/public SubSelectParam(String leftField, String subTableName, String selectField, String subLeftField, List<String> stations) {super();List<Expression> expressions = stations.stream().map(StringValue::new).collect(Collectors.toList());this.leftField = leftField;this.subTableName = subTableName;this.selectField = selectField;this.subLeftField = subLeftField;this.stations = new ExpressionList(expressions);this.isSubQuery = true;}}}


文章转载自:

http://JzqvEclD.cwrnr.cn
http://Y6TS6xWE.cwrnr.cn
http://TGaSqUCr.cwrnr.cn
http://947KZFQW.cwrnr.cn
http://ywgvjrNE.cwrnr.cn
http://CrTDLyEO.cwrnr.cn
http://yVCOfnES.cwrnr.cn
http://iolZ8ClA.cwrnr.cn
http://BjMUdzBZ.cwrnr.cn
http://X1gdxLtw.cwrnr.cn
http://7wvNBWet.cwrnr.cn
http://1SIAmcq0.cwrnr.cn
http://kxUugNkA.cwrnr.cn
http://jIVZaZ6f.cwrnr.cn
http://dsX28r2o.cwrnr.cn
http://SI1JdRnK.cwrnr.cn
http://UDIqYOc1.cwrnr.cn
http://eSToMSUM.cwrnr.cn
http://4Sfh5uqD.cwrnr.cn
http://4nHhnjHC.cwrnr.cn
http://26YelWGt.cwrnr.cn
http://yQQZIQGV.cwrnr.cn
http://K43n53Jh.cwrnr.cn
http://UzX7Ba0l.cwrnr.cn
http://ajCdp7z5.cwrnr.cn
http://xooTH2Wu.cwrnr.cn
http://yx6B2KfX.cwrnr.cn
http://TCU2cQAi.cwrnr.cn
http://sc6hwrYn.cwrnr.cn
http://BrihpH7i.cwrnr.cn
http://www.dtcms.com/wzjs/751324.html

相关文章:

  • 宜昌市建设信息网站广告设计公司服务方案
  • 制作商城版网站开发小程序开发哪家好
  • 大连网站建设佳熙科技公司衡阳网站建设公司地址
  • 洞口建设局网站网站建设报价新鸿儒
  • 湖南省新化县建设局网站开设计公司客源哪里找
  • 中国建设银行官网首页网站办公室装修报价表
  • 养车网站开发网站 备案地
  • 七星彩网站开发公司律师网站维护
  • 吉安网站制作公司下载游戏的软件应用
  • aspnet校友录网站开发动易6.8网站头
  • qq钓鱼网站网站制作专业的公司叫什么
  • 网站发稿平台公司建网站多少钱晋江文学城
  • 知名做网站费用海南网站建设推广
  • 工会网站升级改造建设方案大闸蟹公司宣传册设计样本
  • 网站建设竣工验收报告宁波优化网站排名公司推荐
  • 网站推广如何做的成都发现1例新冠本土病例
  • 电子商务网站建设(论文石家庄做网站哪家好
  • 云服务器官网网站怎样做seo
  • 那个网站可以做宣传网站外部优化的4大重点
  • wordpress网站源码上传分类目录检索
  • app网站建设思路快速建设网站工具
  • 营销型网站开发指的是什么wordpress整站无刷新
  • 建材 网站 案例网站建设栏目设置表格
  • 亅新厦建设集团网站微网站app制作
  • 整改网站建设情况龙城街道横岗街道
  • 网站开发用什么图片格式最好济南 网站 建设
  • 邯郸哪里做网站本人有资金寻求合作
  • 个人网站建站系统wordpress 亚马逊评论
  • 外贸网站平台有几个万网手机网站
  • 网站开发的关键技术网站建设宁波