解析SQL 获取表、字段及SQL查询参数

解析SQL 获取表、字段及SQL查询参数

    • 1. 执行效果
    • 2. 使用
      • 2.1 引入依赖
      • 2.2 相关实体
      • 2.3 工具类

1. 执行效果

在这里插入图片描述

2. 使用

2.1 引入依赖

	<!-- sql 解析处理--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.4</version></dependency>

2.2 相关实体

  1. TableDescVo.java

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;/*** @author:* @version: 1.0* @className: TableDesc* @description: 表描述信息* @date: 2023/05/23 11:36*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class TableDescVo {/*** 表名*/private String name;/*** 备注*/private String remark;/*** 数据库名称*/private String dbName;/*** 表原始名称*/private String originName;
}
  1. TableFieldVo.java

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;/*** @author:* @version: 1.0* @className: TableField* @description: 字段信息* @date: 2023/05/23 11:41*/
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class TableFieldVo {/*** 字段名称*/private String fieldName;/*** 字段别名*/private String aliasName;/*** 表名称*/private String tableName;}

2.3 工具类

getTablesBySQL: 用于获得SQL中携带的表及数据库信息
getColumnNameBySQL: 用于获得SQL中携带的列字段信息, 如果为select * from xxx,则返回fieldName为* ,若为 select a.* from xx a,则放回 fieldName为*, tableName为 a
getRequestParamsBySQL: 用于获得请求参数,例如 select * from xxx where a = :a,则会提取a为请求参数


import com.sdews.bdpLite.vo.sqlparser.TableDescVo;
import com.sdews.bdpLite.vo.sqlparser.TableFieldVo;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.expression.JdbcNamedParameter;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.*;import java.util.ArrayList;
import java.util.List;/*** @author * @version 1.0* @className: SqlParserUtils* @description: SQL解析工具类* @date: 2022/12/11 16:10**/
public final class SqlParserUtils {/*** 获得所有表名+别名** @param sql* @return* @throws JSQLParserException*/public static List<TableDescVo> getTablesBySQL(String sql) throws JSQLParserException {Select select = (Select) CCJSqlParserUtil.parse(sql);List<TableDescVo> tableList = new ArrayList<>();SelectBody selectBody = select.getSelectBody();PlainSelect plainSelect = (PlainSelect) selectBody;Table table = (Table) plainSelect.getFromItem();TableDescVo tableDesc = new TableDescVo();tableDesc.setOriginName(table.getName());tableDesc.setName(table.getName());tableDesc.setDbName(table.getDatabase().getDatabaseName());if (table.getAlias() != null) {tableDesc.setName(table.getAlias().getName());}tableList.add(tableDesc);if (plainSelect.getJoins() != null) {for (Join join : plainSelect.getJoins()) {Table joinTable = (Table) join.getRightItem();TableDescVo joinTableDesc = new TableDescVo();joinTableDesc.setOriginName(joinTable.getName());joinTableDesc.setName(joinTable.getName());joinTableDesc.setDbName(joinTable.getDatabase().getDatabaseName());if (joinTable.getAlias() != null) {joinTableDesc.setName(joinTable.getAlias().getName());}tableList.add(joinTableDesc);}}return tableList;}/*** 通过sql获得所有返回参数结果** @param sql* @return columnList: SQL列* @throws JSQLParserException*/public static List<TableFieldVo> getColumnNameBySQL(String sql) throws JSQLParserException {Select select = (Select) CCJSqlParserUtil.parse(sql);SelectBody selectBody = select.getSelectBody();List<TableFieldVo> columnList = new ArrayList<>();List<SelectItem> selectItems = ((PlainSelect) selectBody).getSelectItems();for (SelectItem item : selectItems) {TableFieldVo tableField = new TableFieldVo();String column = null;if (item instanceof AllColumns) {column = item.toString();}if (item instanceof AllTableColumns) {Table table = ((AllTableColumns) item).getTable();tableField.setTableName(table.getName());column = "*";}if (item instanceof SelectExpressionItem) {Alias alias = ((SelectExpressionItem) item).getAlias();Expression expression = ((SelectExpressionItem) item).getExpression();if (alias != null) {// 原名称column = expression.toString();// 别名String aliasName = alias.getName();tableField.setAliasName(aliasName);} else if (expression != null) {column = expression.toString();if (column.contains(".")) {String[] columnArr = column.split("\\.");tableField.setTableName(columnArr[0]);column = columnArr[1];}}}tableField.setFieldName(column);columnList.add(tableField);}return columnList;}/*** 获得jdbcName参数形式请求参数** @param sql* @return* @throws JSQLParserException*/public static List<TableFieldVo> getRequestParamsBySQL(String sql) throws JSQLParserException {Select select = (Select) CCJSqlParserUtil.parse(sql);SelectBody selectBody = select.getSelectBody();List<TableFieldVo> requestParamList = new ArrayList<>();Expression where = ((PlainSelect) selectBody).getWhere();if (where != null) {where.accept(new ExpressionVisitorAdapter() {@Overridepublic void visit(JdbcNamedParameter namedParameter) {TableFieldVo tableField = new TableFieldVo();tableField.setFieldName(namedParameter.getName());requestParamList.add(tableField);}});}Offset offset = ((PlainSelect) selectBody).getOffset();if (offset != null && offset.getOffset() != null) {offset.getOffset().accept(new ExpressionVisitorAdapter() {@Overridepublic void visit(JdbcNamedParameter namedParameter) {TableFieldVo tableField = new TableFieldVo();tableField.setFieldName(namedParameter.getName());requestParamList.add(tableField);}});}Limit limit = ((PlainSelect) selectBody).getLimit();if (limit != null) {Expression rowCount = limit.getRowCount();if (rowCount != null) {rowCount.accept(new ExpressionVisitorAdapter() {@Overridepublic void visit(JdbcNamedParameter namedParameter) {TableFieldVo tableField = new TableFieldVo();tableField.setFieldName(namedParameter.getName());requestParamList.add(tableField);}});}}return requestParamList;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/174558.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【读点论文】结构化剪枝

结构化剪枝 在一个神经网络模型中&#xff0c;通常包含卷积层、汇合层、全连接层、非线形层等基本结构&#xff0c;通过这些基本结构的堆叠&#xff0c;最终形成我们所常用的深度神经网络。 早在 1998 年&#xff0c;LeCun 等人使用少数几个基本结构组成 5 层的 LeNet-5 网络&…

docker简介和安装

0.前提 本文章意在告诉各位开发者学生有一个工具能够方便你未来的项目开发和部署&#xff0c;这也是我在给我留下一份备份&#xff0c;在我忘记的时候可以回头寻找。 1.docker简介 docker本身就有集装箱的意思。Docker: Accelerated Container Application Development Dock…

香港科技大学广州|智能制造学域机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场

&#x1f3e0;地点&#xff1a;中国科学技术大学西区学生活动中心&#xff08;一楼&#xff09;报告厅 【宣讲会专场1】让制造更高效、更智能、更可持续—智能制造学域 &#x1f559;时间&#xff1a;2023年11月16日&#xff08;星期四&#xff09;18:00 报名链接&#xff1a…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

Java Stream 的使用

Java Stream 的使用 开始中间操作forEach 遍历map 映射flatMap 平铺filter 过滤limit 限制sorted 排序distinct 去重 结束操作collect 收集toList、toSet 和 toMapCollectors.groupingByCollectors.collectingAndThen metch 匹配find 查询findFirst 与 findAny 的使用Optional …

基于非对称纳什谈判的多微网电能共享运行优化策略(附带MATLAB程序)

基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 资源地址&#xff1a; 基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 MATLAB代码&#xff1a;基于非对称纳什…

SpringBoot3数据访问

SpringBoot3数据访问 SpringBoot整合 Spring、SpringMVC、MyBatis进行数据访问开发。 整合SSM场景 整合步骤 1、创建SSM整合项目 ①数据库准备 DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id bigint NOT NULL AUTO_INCREMENT COMMENT 编号,login_name varchar(200)…

[Linux]tcpdump抓包工具

windows中的抓包工具&#xff1a;wireshark linux中的抓包工具&#xff1a;tcpdump cpdump是Linux系统中自带抓包工具 [rootIKUN ~]# rpm -q tcpdump tcpdump-4.9.0-5.el7.x86_64 [rootIKUN ~]# tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.1…

又卷又累,救救一个将被随机拖死的程序员!

前两天在小红书上看到有人吐槽&#xff1a;“国内做程序员性价比不高&#xff0c;又卷又累&#xff0c;个人时间都被拖死了。” 现在普遍来讲&#xff0c;“卷”都是打工人的现状。 而至于国内程序员性价比不高的话&#xff0c;确实是肉少僧多。工作强度一加持&#xff0c;累自…

使用jedis连接虚拟机redis报错 Failed to connect to any host resolved for DNS name

问题描述&#xff1a; 导致该问题发生的原因可能是虚拟机没有开放6379端口。 解决方案&#xff1a; 首先检查redis.conf的bing配置是否被注释了&#xff0c;如果没有将其注释 第二步&#xff0c;将保护模式设置为no 第三步&#xff0c;接下来可以使用命令查看6379端口是否…

Java学习之路 —— Day3(内部类、枚举、泛型、API)

文章目录 1. 内部类2. 枚举3. 泛型 1. 内部类 成员内部类 就是类中的一个普通成员&#xff0c;类似普通的成员方法、成员变量。&#xff08;套娃&#xff09; public class Outer {public class Inner {private String name;public static String school;public String getNa…

hadoop 如何关闭集群 hadoop使用脚本关闭集群 hadoop(八)

1. hadoop22, hadoop23, hadoop24三台机器 2. namenode 所在hadoop22关闭 hdfs: # 找到/etc/hadoop位置 cd /opt/module/hadoop-3.3.4/etc/hadoop # 找到shell脚本&#xff0c;关闭即可sbin/stop-dfs.sh 3. 关闭yarn脚本&#xff0c;我的在hadoop23&#xff1a; # 找到/etc…