解析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.mzph.cn/news/142561.shtml

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

相关文章

「实用场景教程」如何用日程控件DHTMLX Scheduler制作酒店预订日历?(一)

dhtmlxScheduler是一个类似于Google日历的JavaScript日程安排控件&#xff0c;日历事件通过Ajax动态加载&#xff0c;支持通过拖放功能调整事件日期和时间&#xff0c;事件可以按天&#xff0c;周&#xff0c;月三个种视图显示。 DHTMLX Scheduler正式版下载 在本教程中&…

K8S的基础知识

K8S的意义与入门 专有名词 容器:包含了运行一个应用程序所需要的所有东西,包括:代码、运行时、各种依赖和配置。pod:K8s调度的最小单元,包含一个或多个容器。一个容器组中的容器具有紧密耦合性,共享资源,存储空间和IP。即同一个容器组中的容器可以通过localhost:xxx访问…

windows系统pycharm程序通过urllib下载权重https报错解决

报错内容&#xff1a; raise URLError(unknown url type: %s % type) urllib.error.URLError: <urlopen error unknown url type: https> 解决办法记录&#xff1a; 1. 下载 pyopenssl : pip install pyopenssl 此时&#xff0c; import ssl 可以通过提示指导你安…

简单地聊一聊Spring Boot的构架

前言 本文小编将详细解析Spring Boot框架&#xff0c;并通过代码举例说明每个层的作用。我们将深入探讨Spring Boot的整体架构&#xff0c;包括展示层、业务逻辑层和数据访问层。通过这些例子&#xff0c;读者将更加清晰地了解每个层在应用程序中的具体作用。通过代码实例&…

Uniapp开发 购物商城源码 在线电商商城源码 适配移动终端项目及各小程序

lilishop电商商城系统 商城移动端&#xff0c;使用Uniapp开发&#xff0c;可编译为所有移动终端项目及各小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88487579 源码下载2&#xff1a;关注我留言

0基础学习VR全景平台篇第121篇:认识视频剪辑软件Premiere

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 大家好&#xff0c;这节课是带领大家认识认识我们的剪辑软件Premiere&#xff0c;一般简称是PR。 &#xff08;PR界面&#xff09; 我们首先打开PR&#xff0c;第一步就是要创建…

深入理解JVM虚拟机第二十五篇:详解JVM方法的绑定机制静态绑定和动态绑定,早期绑定晚期绑定,并编写代码从字节码角度证明这件事情

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

Android WebView专题

WebView 专题 第一个WebView程序&#xff1a;加载远程网址 Layout添加WebView组件&#xff1b; <WebViewandroid:id"id/webView_first"android:layout_width"match_parent"android:layout_height"match_parent"/>初始化组件&#xff0c;加…

arm2 day6

串口实现单个字符的收发 main.c uart4.c uart4.h

java轮播图接口实现

一. 内容简介 实现java后端用户管理接口&#xff0c;数据库使用msyql。 二. 软件环境 2.1 java 1.8 2.2 mysql Ver 8.0.13 for Win64 on x86_64 (MySQL Community Server - GPL) 2.3 IDEA ULTIMATE 2019.3 2.4d代码地址 https://gitee.com/JJW_1601897441/competitionAs…

【左程云算法全讲10】打表技巧和矩阵处理技巧

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

冲击900亿美元估值!邀约路演、秘密交表的Shein上市有望

双十一的狂欢刚刚结束&#xff0c;Shein即将赴美上市的消息又在电商圈里投下一枚重磅炸弹。 继被媒体曝光其寻求900亿美金估值后&#xff0c;最新的消息称其已邀请投资人参与路演&#xff0c;且已秘密完成交表。这个神秘的中国独角兽&#xff0c;离敲钟登陆美股的日子越来越近…

SoftwareTest6 - 用 Selenium 怎么点点点

用 Selenium 来点点点 一 . 什么是自动化 ?1.1 自动化测试的分类接口自动化测试UI 自动化测试 (界面测试) 1.2 实现自动化测试的工具 : selenium环境部署驱动 二 . selenium 的使用2.1 一个简单的示例 : 让谷歌浏览器在百度首页搜索蔡徐坤准备工作编写代码 2.2 打开谷歌浏览器…

【vue】AntDV组件库中a-upload实现文件上传:

文章目录 一、文档&#xff1a;二、使用(以Jeecg为例)&#xff1a;【1】template&#xff1a;【2】script&#xff1a; 三、效果图&#xff1a; 一、文档&#xff1a; Upload 上传–Ant Design Vue 二、使用(以Jeecg为例)&#xff1a; 【1】template&#xff1a; <a-uploa…

day08_子网划分与子网掩码

什么是子网划分? 1、概念&#xff1a;借主机位给网络位使用,以此来达到把一个大网段划分为n个儿子网段的目的&#xff0c;2. 为何要进行子网划分&#xff1f;3、子网掩码&#xff1a;就是对ip地址打记号4、 网络地址的计算机方式&#xff1a;ip地址与子网掩码都转换成二进制&a…

基于51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)

PCF8591数字电压表数码管显示 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机PCF8591数字电压表数码管设计( proteus仿真程序设计报告讲…

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型

一、直接上代码&#xff0c;在vue3-typescript-threejs 项目 导入外部的glb格式3D模型 极简代码&#xff0c;快速理解 <template><div ref"container"></div></template><script lang"ts" setup>import { onMounted, ref …

IEEE--DSConv: Efficient Convolution Operator 论文翻译

论文地址:https://arxiv.org/pdf/1901.01928v1.pdf 目录 摘要 1 介绍 2 相关工作 3 DSConv层 4 量化过程 5 分布偏移 6 优化推断 7 训练 8 结果 8.1 ImageNet 8.2 内存和计算负载 8.3 转移性 9 结论 摘要 我们引入了一种卷积层的变体&#xff0c;称为DSConv&…

cmd打开idea

当我们用idea打开一个项目的时候&#xff0c;有时候这个项目目录是有的&#xff0c;但是用idea的open却找不到&#xff0c;有时候我要重新关闭窗口&#xff0c;再open好多次才有 于是我现在使用命令打开&#xff0c;先把idea安装路径的bin目录放在path里面 然后cd到项目路径&…

Linux操作系统使用及C高级编程-D3Linux shell命令(权限、输入输出)

Shell 是一种应用程序&#xff0c;用以完成用户与内核之间的交互 一个功能强大的编程语言&#xff08;C语言&#xff09; 一个解释执行的脚本语言&#xff0c;不需要编译&#xff0c;写完直接执行 目前Linux 乌班图的Shell默认是bash 查看当前提供的Shell&#xff1a;cat /…