JSqlParser-SQL解析处理

article/2025/10/5 4:39:06

一、介绍 

        JSqlParse是一款很精简的sql解析工具,将sql语句转成Java对象。

官网:JSqlParser - Home

用法:可以用于数据权限处理,拦截sql解析改写sql等等。

二、版本

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

三、结构

1.expression:SQL构建相关类,比如ArrayExpression、CaseExpression、JsonExpression等表达式用于构建SQL。

2.parser: SQL解析相关类,比如CCJSqlParserUtil主要类。

3.schema:主要存放数据库schema相关的类 ,比如表、列等。

4.statement:封装了数据库操作对象,create、insert、delete、select等

5.util: 各种工具类、不同DB版本、SQL标准等处理类,如SelectUtils、DatabaseType、TablesNamesFinder等。

 案例:

1.解析单个sql

        //1、获取原始sql输入String sql="SELECT u.username, u.age, u.sex FROM user as u where u.id=1 and u.age in (1,2,3) ;";//构建解析器Select select = (Select) CCJSqlParserUtil.parse(sql);//获取select对象SelectBody selectBody = select.getSelectBody();System.err.println(selectBody.toString());//解析sqlPlainSelect plainSelect=(PlainSelect) selectBody;//表名Table table= (Table) plainSelect.getFromItem();//表名称System.out.println(table.getName());//别名System.out.println(table.getAlias().getName());//查询列List<SelectItem> selectItems = plainSelect.getSelectItems();selectItems.stream().forEach(selectItem -> {System.out.println(selectItem.toString());});//where  一个and 条件
//        EqualsTo equalsTo = (EqualsTo) plainSelect.getWhere();
//        Expression leftExpression = equalsTo.getLeftExpression();
//        Expression rightExpression = equalsTo.getRightExpression();
//        System.err.println(leftExpression); // id
//        System.err.println(rightExpression); // 1//多个andAndExpression andExpression = (AndExpression) plainSelect.getWhere();Expression leftExpression = andExpression.getLeftExpression();System.err.println(((EqualsTo) leftExpression).getLeftExpression()); // IDSystem.err.println(((EqualsTo) leftExpression).getRightExpression()); // 1//inExpression rightExpression = andExpression.getRightExpression();InExpression inExpression = (InExpression) rightExpression;ItemsList rightItemsList = inExpression.getRightItemsList();System.err.println(rightItemsList); // (1,2,3)

2.解析组合sql

        // 多表SQLString sql = "SELECT t1.a , t1.b  FROM table1 AS t1 JOIN table2 t2 ON t1.user_id  = t2.user_id WHERE t1.id = 8 and t1.name='a' and t1.age IN (8,9,10)";// 1.解析表名CCJSqlParserManager parserManager = new CCJSqlParserManager();// 解析SQL为Statement对象Statement statement = parserManager.parse(new StringReader(sql));// 创建表名发现者对象TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();// 获取到表名列表List<String> tableNameList = tablesNamesFinder.getTableList(statement);// 循环打印解析到的表名 table1 table2if (!CollectionUtils.isEmpty(tableNameList)) {tableNameList.forEach(System.err::println);}// 2.解析查询元素 列,函数等Select select = (Select) CCJSqlParserUtil.parse(sql);PlainSelect plainSelect = (PlainSelect) select.getSelectBody();List<SelectItem> selectItems = plainSelect.getSelectItems();selectItems.forEach(System.err::println);// 3.解析JoinList<Join> joins = plainSelect.getJoins();joins.forEach(e -> {Collection<Expression> onExpressions = e.getOnExpressions();for (Expression onExpression : onExpressions) {System.err.println(onExpression); // 获取ON 表达式 t1.user_id = t2.user_id}});// 3.解析WHERE条件AndExpression andExpression = (AndExpression) plainSelect.getWhere();AndExpression leftAndExpression=(AndExpression)andExpression.getLeftExpression();Expression leftExpression1 = leftAndExpression.getLeftExpression();Expression rightExpression1 = leftAndExpression.getRightExpression();System.out.println(leftExpression1);System.out.println(rightExpression1);// 4.解析INInExpression rightAndExpression=(InExpression)andExpression.getRightExpression();System.out.println(rightAndExpression.getRightItemsList());

3.解析insert

 String insertSql = "INSERT INTO test ( c1,c2) VALUES ( 1,2)";Statement statement = CCJSqlParserUtil.parse(insertSql);if (statement instanceof Insert) {Insert insert = (Insert) statement;// 添加新列insert.addColumns(new Column("c3 "));// 添加新插入值ExpressionList expressionList = (ExpressionList) insert.getItemsList();expressionList.getExpressions().add(new StringValue("3"));System.err.println(insert); }

4.解析update

String updateSql = "UPDATE User SET FirstName = 'a' WHERE LastName = 'b' ";
Statement statement = CCJSqlParserUtil.parse(updateSql);
if (statement instanceof Update) {Update update = (Update) statement;Expression where = update.getWhere(); System.err.println(where);for (UpdateSet updateSet : update.getUpdateSets()) {updateSet.getColumns().forEach(System.out::println);}
}

5.解析Delete

String updateSql = "delete from test  WHERE LastName = 'b' ";Statement statement = CCJSqlParserUtil.parse(updateSql);if (statement instanceof Delete) {Delete delete = (Delete) statement;Expression where = delete.getWhere();System.err.println(where);}

6.构建insert-sql

// 创建表对象设置表名
Table table = new Table();
table.setName("table");
// 创建插入对象
Insert insert = new Insert();
insert.setTable(table); // 设置插入对象的表对象
// 设置插入列
List<Column> columnList = Arrays.asList(new Column("a"), new Column("b"));
insert.setColumns(columnList);
// 设置插入值
MultiExpressionList multiExpressionList = new MultiExpressionList();
multiExpressionList.addExpressionList(Arrays.asList(new StringValue("1"), new StringValue("2")));
insert.setItemsList(multiExpressionList);
System.err.println(insert); // INSERT INTO table (a, b) VALUES ('1', '2')

7.构建update-sql

        // 创建表对象设置表名Table table = new Table();table.setName("table");table.setAlias(new Alias("t"));// 创建更新对象Update update = new Update();update.setTable(table);// 设置更新对象的表对象update.addUpdateSet(new Column("a"), new StringValue("1"));update.addUpdateSet(new Column("b"), new StringValue("2"));// 添加Where条件EqualsTo equalsTo = new EqualsTo(); // 等于表达式// 设置表达式左边值equalsTo.setLeftExpression(new Column(table, "id"));// 设置表达式右边值equalsTo.setRightExpression(new StringValue("123456"));update.setWhere(equalsTo); // 设置WhereSystem.out.println(update.toString());

8.构建delete-sql

// 创建表对象设置表名
Table table = new Table();
table.setName("table");
table.setAlias(new Alias("t"));// 创建更新对象
Delete delete = new Delete();
delete.setTable(table);// 设置更新对象的表对象// 添加Where条件
EqualsTo equalsTo = new EqualsTo(); // 等于表达式
// 设置表达式左边值
equalsTo.setLeftExpression(new Column(table, "id"));
// 设置表达式右边值
equalsTo.setRightExpression(new StringValue("123456"));
delete.setWhere(equalsTo); // 设置Where// 输入语句
System.err.println(delete);

9.构建单表查询

        // 单表全量Table table = new Table("test");table.setAlias(new Alias("t"));Select select = SelectUtils.buildSelectFromTable(table);System.err.println(select); // SELECT * FROM test// 指定列查询Select buildSelectFromTableAndExpressions = SelectUtils.buildSelectFromTableAndExpressions(table, new Column("a"), new Column("b"));System.err.println(buildSelectFromTableAndExpressions); // SELECT a, b FROM test// WHERE =// 等于表达式EqualsTo equalsTo = new EqualsTo();equalsTo.setLeftExpression(new Column(table, "id"));equalsTo.setRightExpression(new StringValue("12"));// 转换为更细化的Select对象PlainSelect plainSelect = (PlainSelect) select.getSelectBody();plainSelect.setWhere(equalsTo);System.err.println(plainSelect);//  SELECT * FROM test WHERE test.id = '12'// WHERE  != <>NotEqualsTo notEqualsTo = new NotEqualsTo();notEqualsTo.setLeftExpression(new Column(table, "id"));notEqualsTo.setRightExpression(new StringValue("12"));PlainSelect plainSelectNot = (PlainSelect) select.getSelectBody();plainSelectNot.setWhere(notEqualsTo);System.err.println(plainSelectNot);//  SELECT * FROM test WHERE test.id <> '12'// 其他运算符, 参考上面代码添加表达式即可GreaterThan gt = new GreaterThan(); // ">"gt.setLeftExpression(new Column(table,"age"));gt.setRightExpression(new StringValue("12"));PlainSelect plainSelectGt = (PlainSelect) select.getSelectBody();plainSelectGt.setWhere(gt);System.err.println(plainSelectGt);//  SELECT * FROM test WHERE test.age > 12GreaterThanEquals geq = new GreaterThanEquals(); // ">="MinorThan mt = new MinorThan(); // "<"MinorThanEquals leq = new MinorThanEquals();// "<="IsNullExpression isNull = new IsNullExpression(); // "is null"isNull.setNot(true);// "is not null"LikeExpression nlike = new LikeExpression();nlike.setNot(true); // "not like"Between bt = new Between();bt.setNot(true);// "not between"// WHERE LIKE// 创建Like表达式对象LikeExpression likeExpression = new LikeExpression();likeExpression.setLeftExpression(new Column("username"));likeExpression.setRightExpression(new StringValue("张%"));PlainSelect plainSelectLike = (PlainSelect) select.getSelectBody();plainSelectLike.setWhere(likeExpression);System.err.println(plainSelectLike); // SELECT * FROM test WHERE username LIKE '张%'// WHERE INSet<String> deptIds = Sets.newLinkedHashSet(); // 创建IN范围的元素集合deptIds.add("1");deptIds.add("2");// 把集合转变为JSQLParser需要的元素列表ItemsList itemsList = new ExpressionList(deptIds.stream().map(StringValue::new).collect(Collectors.toList()));// 创建IN表达式对象,传入列名及IN范围列表InExpression inExpression = new InExpression(new Column("user_id "), itemsList);PlainSelect plainSelectIn = (PlainSelect) select.getSelectBody();plainSelectIn.setWhere(inExpression);System.err.println(plainSelectIn);// WHERE BETWEEN ANDBetween between = new Between();// 设置起点值between.setBetweenExpressionStart(new LongValue(18));// 设置终点值between.setBetweenExpressionEnd(new LongValue(30));// 设置左边的表达式,一般为列between.setLeftExpression(new Column("age"));PlainSelect plainSelectBetween = (PlainSelect) select.getSelectBody();plainSelectBetween.setWhere(between);System.err.println(plainSelectBetween);//  WHERE AND 多个条件结合,都需要成立AndExpression andExpression = new AndExpression(); // AND 表达式andExpression.setLeftExpression(equalsTo); // AND 左边表达式andExpression.setRightExpression(between);  // AND 右边表达式PlainSelect plainSelectAnd = (PlainSelect) select.getSelectBody();plainSelectAnd.setWhere(andExpression);System.err.println(plainSelectAnd); //  SELECT * FROM test WHERE test.id = '1' AND age BETWEEN 18 AND 30//  WHERE OR 多个条件满足一个条件成立返回// OR 表达式OrExpression orExpression = new OrExpression();orExpression.setLeftExpression(equalsTo);orExpression.setRightExpression(between);PlainSelect plainSelectOr = (PlainSelect) select.getSelectBody();plainSelectOr.setWhere(orExpression);System.err.println(plainSelectOr); // SELECT * FROM test WHERE test.id = '1' OR age BETWEEN 18 AND 30// ORDER BY 排序OrderByElement orderByElement = new OrderByElement(); // 创建排序对象orderByElement.isAsc(); //  设置升序排列 从小到大orderByElement.setExpression(new Column("createTime")); // 设置排序字段PlainSelect plainSelectOrderBy = (PlainSelect) select.getSelectBody();plainSelectOrderBy.addOrderByElements(orderByElement);System.err.println(plainSelectOrderBy); // SELECT * FROM test AS t WHERE t.id = '12' OR age BETWEEN 18 AND 30 ORDER BY createTime

10.构建多表查询

        Table t1 = new Table("t_user").withAlias(new Alias("t1").withUseAs(true)); // 表1Table t2 = new Table("t_user_book").withAlias(new Alias("t2", false)); // 表2PlainSelect plainSelect = new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1);// JOIN ON 如果表中有至少一个匹配,则返回行Join join = new Join(); // 创建Join对象// 设置join参数可实现其他类型join// join.setLeft(true); LEFT JOIN// join.setRight(true);  RIGHT JOIN// join.setFull(true); FULL JOIN// join.setInner(true);join.withRightItem(t2); // 添加Join的表 JOIN t2 =>JOIN t_user_book t2EqualsTo equalsTo = new EqualsTo(); // 添加 = 条件表达式  t1.id  = t2.user_idequalsTo.setLeftExpression(new Column(t1, "id "));equalsTo.setRightExpression(new Column(t2, "user_id "));join.addOnExpression(equalsTo);// 添加ONplainSelect.addJoins(join);System.err.println(plainSelect); // SELECT * FROM t_user AS t1 JOIN t_user_book t2 ON t1.id  = t2.user_id//where t2.book_name="小鸡快跑"EqualsTo equalsTo2 = new EqualsTo();equalsTo2.setLeftExpression(new Column(t2, "book_name"));equalsTo2.setRightExpression(new StringValue("小鸡快跑"));plainSelect.setWhere(equalsTo2);System.err.println(plainSelect);//  SELECT * FROM t_user AS t1 JOIN t_user_book t2 ON t1.id  = t2.user_id  WHERE t2.book_name = '小鸡快跑'

基本用法就是如此,关键是理解jsqlparser五大结构对象,一边debug,一边梳理。

代码


http://chatgpt.dhexx.cn/article/Odkv8qqv.shtml

相关文章

JSQLParser 解析复杂SQL 2.0

前言 这段时间&#xff0c;为了开发数据中台项目&#xff0c;我去研究学习了JSQLParser&#xff08;Java中解析SQL语句的工具&#xff09;&#xff0c;并且结合网上资料&#xff0c;写了一个初步的SQL解析工具类... 正文 时隔三天&#xff0c;我又回来了&#xff0c; 因为之前J…

JSqlParser入门系列(1)-JSqlParser简介及入门案例

简介 JSqlParser是一个SQL语句解析器。它将SQL转换为Java类的可遍历层次结构。 支持Oracle&#xff0c;SqlServer&#xff0c;MySQL&#xff0c;PostgreSQL等常用数据库。但各种数据库系统的SQL语法都在动态变化&#xff0c;可以解析某些&#xff08;不是全部&#xff09;。 …

JSqlParser

JSqlParser 关于SqlParser引言&#xff1a; Java 生态中较为流行的 SQL Parser 有以下几种&#xff1a; fdb-sql-parser 是 FoundationDB 在被 Apple 收购前开源的 SQL Parser&#xff08;不支持很复杂的SQL&#xff09;&#xff0c;目前已无人维护。jsqlparser 是基于 Java…

Sql解析转换之JSqlParse完整介绍

1、 jsqlparse介绍 JSqlParse是一款很精简的sql解析工具&#xff0c;它可以将常用的sql文本解析成具有层级结构的“语法树”&#xff0c;我们可以针对解析后的“树节点&#xff08;也即官网里说的有层次结构的java类&#xff09;”进行处理进而生成符合我们要求的sql形式。 官…

相机内参模型Kannala-Brandt/fisheye/pinhole+equi详解

文章目录 1. 论文总述2. pinholeradtan无法建模鱼眼相机3. 内参模型3.1 Radially Symmetric Model3.2 Full Model3.3 affine transformation3.4 Backward Model 4. 标定4.1 ORIFL190-3 lens 可以被标定 5. 内参结果验证参考文献 本博客主要从fisheye论文角度&#xff0c;详细介…

python-opencv实现pinhole相机图像转fisheye相机图像

根据鱼眼相机公式rff*θ&#xff0c;其中θatan(rc/f)&#xff0c;即可实现从pinhole相机模型到fisheye相机模型的像素映射。可自行设置焦距&#xff0c;我使用如下代码完成了将cityscape数据集转换为鱼眼视角。 import numpy as np import cv2 import osclass ConvertFisheye…

jiraconfluencefisheye用户同步

分别安装好jira和confluence&#xff0c;fisheye之后&#xff0c;先在jira中将confluence和fisheye的应用程序连接配置好。如下 配置好后&#xff0c;在jira中的用户服务器中可以已经允许对应的程序使用jira的用户了。 此时&#xff0c;分别去confluence或者fisheye的user-d…

Atlassian家族 JIRA Confluence Fisheye 在 Linux (CentOS 7.6 )安装部署教程

安装包 atlassian-agent-v1.2.2.tar.gz # 破解工具atlassian-fisheye-4.8.3.zipatlassian-confluence-7.4.1-lts-x64.binatlassian-jira-software-8.5.5-lts-x64.bin 部署环境 Linux版本&#xff1a;CentOS 7.6VMware 16Confluence 6.3.1Jira 8.5.5MySQL 5.6JDK 1.8…

【图像】【OpenCV鱼眼矫正】二、fisheye::initUndistortRectifyMap()源码分析

目录 一、fisheye::initUndistortRectifyMap() 之 功能介绍二、fisheye::initUndistortRectifyMap() 之 源码分析1. 源码分析2. 更进一步3. 如何由 (j, i) 算出 (u, v) &#xff1f; 一、fisheye::initUndistortRectifyMap() 之 功能介绍 在上一篇文章的第 2. 部分中&#xff…

Monocular Fisheye Camera Depth Estimation Using Sparse LiDAR Supervision

Paper name Monocular Fisheye Camera Depth Estimation Using Sparse LiDAR Supervision Paper Reading Note URL: https://arxiv.org/pdf/1803.06192.pdf TL;DR 2018 年 ITSC 文章&#xff0c;出自于德国 Valeo 自动驾驶公司&#xff0c;提出了单目鱼眼深度估计的有监督…

Linux环境fisheye+crucible安装与破解

由于最新的版本中fisheye和crucible已经集成在一起了&#xff0c;故只需要下载一个包就可以了。 需要的软件及版本情况如下&#xff1a; fisheye4.8.7&#xff1b;&#xff08;安装包&#xff09; atlassian-agent-v1.2.3&#xff1b;&#xff08;破解工具&#xff09; mysql-c…

相机模型-鱼眼模型(fisheye camera model)

鱼眼相机模型 &#xff08;fisheye camera model&#xff09; 模型介绍等距投影等立体角投影正交投影体视投影线性投影 Kannala-Brandt 模型去畸变过程投影过程反投影过程 雅可比计算 之前总结了一下针孔相机的模型&#xff0c;然后得到了比较积极的回复&#xff08;其实是我到…

opencv fisheye calibration(鱼眼相机校正)

文章目录 fisheye_calibration小孔成像模型&#xff08;理想相机成像模型&#xff09;fisheye model 相机模型内参校正的原理calibration过程对这个过程简单分析参考文章 fisheye_calibration 小孔成像模型&#xff08;理想相机成像模型&#xff09; 请参考下面的文章 理想相…

【论文】RAPiD: Rotation-Aware People Detection in Overhead Fisheye Images

RAPiD: Rotation-Aware People Detection in Overhead Fisheye Images 在这项工作中&#xff0c;我们开发了一种端到端的旋转感知的人检测方法&#xff0c;称为RAPID&#xff0c;它使用任意方向的包围盒来检测人。我们的完全卷积神经网络使用周期损失函数直接回归每个包围盒的…

fisheye calib视野调整

1. 畸变模型采用 K np.array([[6.2597563231075685e02, 0., 1.1601088601848592e03],[0., 6.2525998102575511e02, 1.1634786618991664e03],[0., 0., 1.]]) 2. 直接使用 initUndistortRectifyMap和remap时注意调节视野的大小&#xff0c;为了方便得到想要的大小需要借助 es…

初识FishEye

一、简介 这几个月一直都在整白盒测试&#xff0c;虽然断断续续&#xff0c;但是也确实学习了不少东西&#xff0c;长了不少见识。今天就要给大家隆重介绍一款非常棒的工具——FishEye&#xff01; FishEye能够为你打开代码库&#xff0c;并帮助你分析代码&#xff0c;一句话概…

FishEye简介

前言 在项目开发过程中&#xff0c;随着开发的进行&#xff0c;将有大量的代码编写提交到代码仓库&#xff0c;如何能全面准确的了解源代码的变化&#xff0c;提交的频率&#xff0c;代码量的趋势&#xff0c;发现代码的缺陷&#xff0c;将是控制源代码质量的重要指标&#xff…

linux服务器开机提示f1,Dell的Linux服务器开机按F1解决方法

最近买了些二手服务器&#xff0c;dell品牌&#xff0c;性价比还不错&#xff0c;但是一台dell 服务器开机总是提示按F1才能进系统,到底应该怎么解决呢&#xff1f; 请问我的电脑开机老是提示“strike the f1 key to continue &#xff0c;f2 to run the setup utility”这些&a…

服务器开机显示f1 f2,开机提示按F1/F2才能进入系统的解决方法

电脑开机出现了一个怪现象&#xff0c;那就是每次开机的时候都会有“F1”或者是“F2”的提示&#xff0c;并且要按一下才能正常进入系统&#xff0c;该怎么解决呢&#xff1f;下面秋叶系统小编教大家解决办法&#xff01; 下图为开机按F1键才能正常进入系统的画面&#xff01; …