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.rhkb.cn/news/188214.html

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

相关文章

【教3妹学编程-算法题】2923. 找到冠军 I

3妹&#xff1a;2哥2哥&#xff0c;你看到新闻了吗&#xff1f;襄阳健桥医院院长 公然“贩卖出生证明”&#xff0c; 真是太胆大包天了吧。 2哥 : 我也看到新闻了&#xff0c;7人被采取刑事强制措施。 就应该好好查查他们&#xff0c; 一查到底&#xff01; 3妹&#xff1a;真的…

springboot定时服务

上一篇文章【修改定时时间&#xff0c;定时任务及时生效】 是定时任务与功能项目共用一个&#xff1b; 我目前所在公司的定时服务是专门有一个项目处理&#xff0c;然后定时查询库里面的定时信息配置。 话不多说&#xff0c;上程序 数据库设置 create table SCHEDULER_JOB…

语音识别与自然语言处理(NLP):技术前沿与未来趋势

语音识别与自然语言处理&#xff08;NLP&#xff09;&#xff1a;技术前沿与未来趋势 随着科技的快速发展&#xff0c;语音识别与自然语言处理&#xff08;NLP&#xff09;技术逐渐成为人工智能领域的研究热点。这两项技术的结合&#xff0c;使得机器能够更好地理解和处理人类语…

自主开发刷题应用网站H5源码(无需后端无需数据库)

该应用使用JSON作为题库的存储方式&#xff0c;层次清晰、结构简单易懂。 配套的word模板和模板到JSON转换工具可供使用&#xff0c;方便将题库从word格式转换为JSON格式。 四种刷题模式包括顺序刷题、乱序刷题、错题模式和背题模式&#xff0c;可以根据自己的需求选择适合的模…

arm2 day4

汇编编写流水灯 代码&#xff1a; LED流水灯现象&#xff1a;

浅谈高并发以及三大利器:缓存、限流和降级

引言 高并发背景 互联网行业迅速发展&#xff0c;用户量剧增&#xff0c;系统面临巨大的并发请求压力。 软件系统有三个追求&#xff1a;高性能、高并发、高可用&#xff0c;俗称三高。三者既有区别也有联系&#xff0c;门门道道很多&#xff0c;全面讨论需要三天三夜&#…

掌动智能性能压力测试优势有哪些

企业通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。本文将介绍性能压力测试的价值及主要优势! 一、性能压力测试的价值 1、评估系统能力&#xff1a;有助于参数的基准测试&#xff0c;可以度量系统的响应时间;还有助于检查系统是否可…

[工业自动化-12]:西门子S7-15xxx编程 - PLC从站 - ET200 SP系列详解

目录 一、概述 1.1 概述 二、系统组成 2.1 概述 2.2 与主站的通信接口模块 2.3 总线适配器 2.4 基座单元 2.5 电子模块 2.6 服务器模块 一、概述 1.1 概述 PLC ET200 SP 是西门子&#xff08;Siemens&#xff09;公司生产的一款模块化可编程逻辑控制器&#xff08;PL…

Linux输入与输出设备的管理

计算机系统中CPU 并不直接和设备打交道&#xff0c;它们中间有一个叫作设备控制器&#xff08;Device Control Unit&#xff09;的组件&#xff0c;例如硬盘有磁盘控制器、USB 有 USB 控制器、显示器有视频控制器等。这些控制器就像代理商一样&#xff0c;它们知道如何应对硬盘…

【MATLAB源码-第73期】基于matlab的OFDM-IM索引调制系统不同子载波数目误码率对比,对比OFDM系统。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术&#xff0c;它将正交频分复用&#xff08;OFDM&#xff09;和索引调制&#xff08;IM&#xff09;相结合&#xff0c;以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

嵌入式养成计划-52----ARM--开发板介绍--相关硬件基础内容介绍--GPIO讲解

一百三十一、开发板介绍 131.1 核心板介绍 131.2 拓展板 一百三十二、相关硬件基础内容介绍 132.1 PCB PCB&#xff08; Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c; 是重要的电子部件&#xff0c;是电子元器…

Direct3D粒子系统

粒子和点精灵 粒子(是种微小的物体,在数学上通常用点来表示其模型。所以显示粒子时,使用点图元(由 D3 DPRIMITIVETYPE类型的D3 DPT POINTLIST枚举常量表示)是一个很好的选择。但是光栅化时,点图元将被映射为一个单个像素。这样就无法为我们提供很大的灵活性,因为实际应用…

从windows iso文件中提取install.wim

1、首先从微软官方下载需要的windows镜像 https://www.microsoft.com/zh-cn/software-download/windows10/ 2、在下载的iso文件右键&#xff0c;打开压缩包&#xff0c;在sources文件夹下&#xff0c;应该就可以看到install.wim了。但似乎在最新的win10版本&#xff0c;微软采…

金字塔原理小节

目录 第1章 为什么要用金字塔结构 一、归类分组&#xff0c;将思想组织成金字塔 二、奇妙的数字“7” 三、归类分组搭建金字塔 四、找出逻辑关系&#xff0c;抽象概括 五、自上而下表达&#xff0c;结论先行 第1章 为什么要用金字塔结构 如果受众希望通过阅读你的文章、听…

Git系列之Git集成开发工具及git扩展使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…

【启扬方案】启扬安卓屏一体机在医疗自助服务终端上的应用解决方案

为了解决传统医疗模式下的“看病难、看病慢”等问题&#xff0c;提高医疗品质、效率与效益&#xff0c;自助服务业务的推广成为智慧医疗领域实现信息化建设、高效运作的重要环节。 医疗自助服务终端是智慧医疗应用场景中最常见的智能设备之一&#xff0c;它通过与医院信息化系统…

使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计

标题&#xff1a;Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;19年&#xff09; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…

SDWAN(Software Defined Wide Area Network)概述与优势分析

文章目录 SDWAN简介SDWAN技术优势简化网络部署和维护安全传输灵活网络拓扑极致体验 SD-WAN关联技术STUNIPsec智能选路SaaS路径优化 典型组网多总部分支组网云管理组网 推荐阅读 SDWAN简介 SDWAN&#xff08;Software Defined Wide Area Network&#xff0c;软件定义广域网&…

Java TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; impor…

数据分析实战 | K-means算法——蛋白质消费特征分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 ​编辑 八、模型评价 九、模型调参与预测 一、数据及分析对象 txt文件——“protein.txt”&#xff0c;主要记录了25个国家的9个属性&#xff0c;主…