JsqlParser工具类获取 where 参数
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 参数相关推荐
- java工具类获取文件扩展名与content-type、http与content-type映射关系
java工具类获取文件扩展名与content-type.http与content-type映射关系 大家好,我是酷酷的韩~ 一.对应关系参考地址: http://doc.chacuo.net/cont ...
- java validate校验_自定义工具类实现validate参数校验
前言 相信项目中做一些htttp接口,避免不了要对参数进行校验,大多数情况下,其实我们只是校验是否为NULL就可以了 1.通过注解实现各种状态的字段 1.1.引入依赖 默认的版本是6.0.9.Fina ...
- java 获取温度_Java利用RXTX串口通信工具类获取DS18B20温度传感器的温度值
环境:Windows10,Eclipse4.5.2,JDK1.7 设备:DS18B20温度传感器(4线,485接口),USB转485接口转换器,笔记本电脑 注意点:RTU传输,使用的是字节,那么在程序 ...
- java 集合反射_关于granite源码包CollectionUtil集合工具类获取集合反射类型、实例化各种集合类型HashSet/ArrayList等...
一.前言 基于granite源码包org.granite.util.CollectionUtil集合工具类,分别获取集合反射类型java.lang.reflect.Type.实例化newCollect ...
- Java工具类-获取请求ip/浏览器/操作系统/浏览器版本
获取请求ip/浏览器/操作系统/浏览器版本 使用到第三方工具类 hutool <!-- hutool工具类 --> <dependency><groupId>cn. ...
- 身份证工具类-获取性别、年龄、出生日期
package com.kotei.aptiv.common.core.util;import org.apache.commons.lang3.StringUtils;import java.uti ...
- Java时间工具类(获取上个月、获取月份1月1号时间戳、获取月份最后一天时间戳...)
在开发中我们经常还会用到日期时间,以下是一个日期时间工具类,包含: 获取每月月初时间戳 获取每月15号时间戳 获取每月月末时间戳 获取当前被格式化后的日期 从这些方法中你可以改写出你需要的方法 PS: ...
- .net工具类 获取枚举类型的描述
一般情况我们会用枚举类型来存储一些状态信息,而这些信息有时候需要在前端展示,所以需要展示中文注释描述. 为了方便获取这些信息,就封装了一个枚举扩展类. /// <summary>/// 枚 ...
- Android工具类获取上下文对象
在Android开发中,我们经常会遇到在一个类中获取当前的上下文对象,比如:我们要写一个Notification对象做弹出通知,我们应该写在全局里边.方法:自定义MyApplication继承Appl ...
最新文章
- 复盘:从0到1设计 A/B 测试系统
- python 利用matplotlib中imshow()函数绘图
- linux系统编程:IO读写过程的原子性操作实验
- c语言100块钱买100只鸡算法,JS计算输出100元钱买100只鸡问题的解决方法
- 内推熟人来自己公司一定要慎重
- Maven使用archetype迅速生成项目骨架
- ios 代码截屏模糊问题解决办法
- 洛谷——P1838 三子棋I
- 【UV打印机】PrintExp打印软件教程(七)-高级模式(其它)
- [存档]CxServer系统
- 蝙蝠侠大战超人:正义黎明[Batman v Superman: Dawn of Justice]
- Google guava之SortedMultiset简介说明
- SpringBoot海景房出租管理系统+代码讲解
- 数字签名、电子签名与电子合同
- GIS理论常识——GeoJson和TopoJson
- 从右往左截取字符_按照某个字符串从右到左以第一个为条件截取数据
- 电脑硬件升级完全解决方案2
- 分享--操作系统学习
- imperva网关重新注册
- 大数据全系技术知识概览