1、需求:

需求:目前有一方需要使用where一类的sql当参数传过来,我们接受参数,然后转成我们本地的参数,去查询我们数据。

举例:

  • 对方:类似这种json ,key 是一个where的sql

    • {"vulKeys": "vul_id='DADASDASDSAAAAAAAAAA' and key between 1 and 5 "}
  • 我方:需要转换成我们自己的映射字段
    • {"vulKeys": "vul_id_a='DADASDASDSAAAAAAAAAA' and key_a between 1 and 5 "}

这里面会包含所有可能的sql运算符号,= 、 >=、 <=、 or、 and 、(a=b and c=d)等等 现在来搞一下。

2、代码

引入pom:

      <dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>3.1</version></dependency>

实现 :

package com.***;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.relational.Between;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.parser.SimpleNode;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import org.apache.commons.lang3.StringUtils;import java.util.*;/*** @author fei.chen* @date 2022/10/26下午 3:56*/
public class SqlParserUtil {public static String getSqlWhereHandel(String sql, Map<String, String> cloumMap) throws JSQLParserException {Select select = (Select) CCJSqlParserUtil.parse(sql);SelectBody selectBody = select.getSelectBody();PlainSelect plainSelect = (PlainSelect) selectBody;Expression expr = CCJSqlParserUtil.parseCondExpression(plainSelect.getWhere().toString());List<Map<String, Object>> arrList = new ArrayList<>();//递归处理sqlHandel(expr, arrList);//列映射替换String sqlResult = cloumHandel(arrList, cloumMap);return sqlResult;}public static String cloumHandel(List<Map<String, Object>> arrList, Map<String, String> cloumMap) {for (Map<String, Object> map : arrList) {if (map.size() == 3) {Optional<Object> first = map.values().stream().findFirst();String s = cloumMap.get(first.get().toString());if (StringUtils.isNotEmpty(s)) {map.put("left", s);}}}StringBuilder sb = new StringBuilder();for (Map<String, Object> map : arrList) {if (map.size() == 3) {sb.append(map.get("left")).append(" ").append(map.get("operator")).append(" ").append(map.get("right")).append(" ");} else {sb.append(map.values().stream().findFirst().get()).append(" ");;}}return sb.toString();}public static Object sqlHandel(Object expr, List<Map<String, Object>> arrList) {if (expr instanceof OrExpression) {Expression leftExpression = ((OrExpression) expr).getLeftExpression();sqlHandel(leftExpression, arrList);Map<String, Object> param2 = new HashMap<>();param2.put("operator", "OR");arrList.add(param2);Expression rightExpression = ((OrExpression) expr).getRightExpression();sqlHandel(rightExpression, arrList);} else if (expr instanceof AndExpression) {Expression leftExpression = ((AndExpression) expr).getLeftExpression();sqlHandel(leftExpression, arrList);Map<String, Object> param = new HashMap<>();param.put("operator", "AND");arrList.add(param);Expression rightExpression = ((AndExpression) expr).getRightExpression();sqlHandel(rightExpression, arrList);} else if (expr instanceof EqualsTo) {Map<String, Object> node = getNode((Expression) expr);arrList.add(node);System.out.println("node-----------------" + node.get("left") + node.get("operator") + node.get("right"));} else if (expr instanceof Parenthesis) {Expression leftExpression = ((Parenthesis) expr).getExpression();Map<String, Object> param1 = new HashMap<>();param1.put("operator", "(");arrList.add(param1);sqlHandel(leftExpression, arrList);Map<String, Object> param2 = new HashMap<>();param2.put("operator", ")");arrList.add(param2);} else if (expr instanceof GreaterThan) {Map<String, Object> node = getGreaterThanNode((Expression) expr);arrList.add(node);System.out.println("node-----------------" + node.get("left") + node.get("operator") + node.get("right"));} else if (expr instanceof LikeExpression) {Map<String, Object> node = getLikeNode((LikeExpression) expr);arrList.add(node);System.out.println("node-----------------" + node.get("left") + node.get("operator") + node.get("right"));}else if(expr instanceof Between){Map<String, Object> node = getBetweenNode((Between) expr);arrList.add(node);System.out.println("node-----------------" + node.get("left") + node.get("operator") + node.get("right"));}return null;}public static Map<String, Object> getNode(Expression expression) {Map<String, Object> param = new HashMap<>();SimpleNode astNode = expression.getASTNode();Expression node = (Expression) astNode.jjtGetValue();param.put("left", ((EqualsTo) node).getLeftExpression().toString());param.put("operator", ((EqualsTo) node).getStringExpression());param.put("right", ((EqualsTo) node).getRightExpression().toString());return param;}public static Map<String, Object> getGreaterThanNode(Expression expression) {Map<String, Object> param = new HashMap<>();String leftExpression = ((Between) expression).getLeftExpression().toString();Expression rightExpression = ((Between) expression).getBetweenExpressionStart();Expression stringExpression = ((Between) expression).getBetweenExpressionEnd();param.put("left", leftExpression);param.put("operator", stringExpression);param.put("right", rightExpression);return param;}public static Map<String, Object> getLikeNode(Expression expression) {Map<String, Object> param = new HashMap<>();SimpleNode astNode = expression.getASTNode();param.put("left", ((LikeExpression) expression).getLeftExpression().toString());param.put("operator", astNode.jjtGetFirstToken().toString());param.put("right", astNode.jjtGetLastToken().toString());return param;}public static Map<String, Object> getBetweenNode(Expression expression) {Map<String, Object> param = new HashMap<>();String start = ((Between) expression).getBetweenExpressionStart().toString();String end = ((Between) expression).getBetweenExpressionEnd().toString();param.put("left", ((Between) expression).getLeftExpression().toString());param.put("operator", "between");param.put("right", Integer.parseInt(start) +" AND " + Integer.parseInt(end));return param;}
}// 使用方法public static void main(String[] args) throws JSQLParserException {String aa = "{\"assetInfoRange\": \"ip like '10.65.128.1'\",\"vulKeys\": \"vul_id='DADASDASDSAAAAAAAAAA'  and key between 1 and 5  \"}";"and     key between 1 and 5    \"}";JSONObject jsonObject = JSON.parseObject(aa);String assetInfoRange = jsonObject.get("assetInfoRange").toString();// 测试这个哦String vulKeys = jsonObject.get("vulKeys").toString();String sql = "select * from aaa where " + vulKeys;Map<String, String> map1 = new HashMap<>();map1.put("vul_id", "vul_id_a");map1.put("university", "university_a");map1.put("gpa", "gpa_a");// sql是我们要转换的 ; map1 是把sql的字段转换成查询我们数据库的字段String s = getSqlWhereHandel(sql, map1);System.out.println(s);}// 最后运行结果
vul_id_a = 'MVM-2011-1554368855919435776' AND key between 1 AND 5

JsqlParser工具类获取 where 参数相关推荐

  1. java工具类获取文件扩展名与content-type、http与content-type映射关系

    java工具类获取文件扩展名与content-type.http与content-type映射关系 大家好,我是酷酷的韩~ 一.对应关系参考地址: http://doc.chacuo.net/cont ...

  2. java validate校验_自定义工具类实现validate参数校验

    前言 相信项目中做一些htttp接口,避免不了要对参数进行校验,大多数情况下,其实我们只是校验是否为NULL就可以了 1.通过注解实现各种状态的字段 1.1.引入依赖 默认的版本是6.0.9.Fina ...

  3. java 获取温度_Java利用RXTX串口通信工具类获取DS18B20温度传感器的温度值

    环境:Windows10,Eclipse4.5.2,JDK1.7 设备:DS18B20温度传感器(4线,485接口),USB转485接口转换器,笔记本电脑 注意点:RTU传输,使用的是字节,那么在程序 ...

  4. java 集合反射_关于granite源码包CollectionUtil集合工具类获取集合反射类型、实例化各种集合类型HashSet/ArrayList等...

    一.前言 基于granite源码包org.granite.util.CollectionUtil集合工具类,分别获取集合反射类型java.lang.reflect.Type.实例化newCollect ...

  5. Java工具类-获取请求ip/浏览器/操作系统/浏览器版本

    获取请求ip/浏览器/操作系统/浏览器版本 使用到第三方工具类 hutool <!-- hutool工具类 --> <dependency><groupId>cn. ...

  6. 身份证工具类-获取性别、年龄、出生日期

    package com.kotei.aptiv.common.core.util;import org.apache.commons.lang3.StringUtils;import java.uti ...

  7. Java时间工具类(获取上个月、获取月份1月1号时间戳、获取月份最后一天时间戳...)

    在开发中我们经常还会用到日期时间,以下是一个日期时间工具类,包含: 获取每月月初时间戳 获取每月15号时间戳 获取每月月末时间戳 获取当前被格式化后的日期 从这些方法中你可以改写出你需要的方法 PS: ...

  8. .net工具类 获取枚举类型的描述

    一般情况我们会用枚举类型来存储一些状态信息,而这些信息有时候需要在前端展示,所以需要展示中文注释描述. 为了方便获取这些信息,就封装了一个枚举扩展类. /// <summary>/// 枚 ...

  9. Android工具类获取上下文对象

    在Android开发中,我们经常会遇到在一个类中获取当前的上下文对象,比如:我们要写一个Notification对象做弹出通知,我们应该写在全局里边.方法:自定义MyApplication继承Appl ...

最新文章

  1. 复盘:从0到1设计 A/B 测试系统
  2. python 利用matplotlib中imshow()函数绘图
  3. linux系统编程:IO读写过程的原子性操作实验
  4. c语言100块钱买100只鸡算法,JS计算输出100元钱买100只鸡问题的解决方法
  5. 内推熟人来自己公司一定要慎重
  6. Maven使用archetype迅速生成项目骨架
  7. ios 代码截屏模糊问题解决办法
  8. 洛谷——P1838 三子棋I
  9. 【UV打印机】PrintExp打印软件教程(七)-高级模式(其它)
  10. [存档]CxServer系统
  11. 蝙蝠侠大战超人:正义黎明[Batman v Superman: Dawn of Justice]
  12. Google guava之SortedMultiset简介说明
  13. SpringBoot海景房出租管理系统+代码讲解
  14. 数字签名、电子签名与电子合同
  15. GIS理论常识——GeoJson和TopoJson
  16. 从右往左截取字符_按照某个字符串从右到左以第一个为条件截取数据
  17. 电脑硬件升级完全解决方案2
  18. 分享--操作系统学习
  19. imperva网关重新注册
  20. 大数据全系技术知识概览

热门文章

  1. (脑肿瘤分割笔记:四七)--自编码器和变分自编码介绍具有变分自编码器正则化的U型分割结构
  2. 本田 - 网联自动驾驶发展规划
  3. HUB集线器,交换机,路由器的差异
  4. python2 正则匹配中文汉字数字字母
  5. 次世代学习入门方法,个人学习的感悟
  6. idea git 合并分支代码
  7. 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)
  8. 清华加强版「蚂蚁呀嘿」来袭,再也不用手动抠素材了!
  9. 教你用Python写一个京东自动下单抢购脚本(Python实现京东自动抢购)
  10. MySQL数据库升降序排序