SQL表、字段、查询参数获取

news2024/10/7 16:20:04

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() {
                @Override
                public 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() {
                @Override
                public 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() {
                    @Override
                    public void visit(JdbcNamedParameter namedParameter) {
                        TableFieldVo tableField = new TableFieldVo();
                        tableField.setFieldName(namedParameter.getName());
                        requestParamList.add(tableField);
                    }
                });
            }
        }
        return requestParamList;
    }


}

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

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

相关文章

说说你在使用React 过程中遇到的常见问题?如何解决?

一、前言 在使用react开发项目过程中&#xff0c;每个人或多或少都会遇到一些"奇怪"的问题&#xff0c;本质上都是我们对其理解的不够透彻 react 系列&#xff0c;33个工作日&#xff0c;33次凌晨还在亮起的台灯&#xff0c;到今天就圆满画上句号了&#xff0c;比心…

通用工作站设计方案 :807-ORI-S3R500 -多路PCIe3.0的单CPU通用工作站

ORI-S3R500 -多路PCIe3.0的单CPU通用工作站 (研华工业计算机IPC-610&#xff0c;IPC940 升级款) 一、机箱功能和技术指标&#xff1a; 系统 系统型号 ORI-SR500 主板支持 EEB(12*13)/CEB(12*10.5)/ATX(12*9.6)/Mi cro ATX 前置硬盘 最大支持2个3.5寸1个2.5寸SATA …

2024 款:最新前端技术趋势

Hello&#xff0c;大家好&#xff0c;我是 Sunday。 上一次的时候聊了 那么些已经落后的前端开发技术 。但是光知道什么技术落后了是不够的&#xff0c;咱们还得知道 前端最新的技术趋势是什么。所以&#xff0c;今天这篇文章&#xff0c;咱们就来聊一聊&#xff0c;2023 最新…

IDEA 使用Reset Current Branch to Here 进行git 版本控制,图文操作

文章目录 一、总结区别&#xff08;只针对本地仓库操作&#xff09;Soft详细解释文件版本冲突处理 Mixed详细解释Hard详细解释Keep详细解释文件版本冲突处理 二、其他Revert commit 参考文档 一、总结区别&#xff08;只针对本地仓库操作&#xff09; Soft详细解释 Soft操作只…

Linux本地部署1Panel现代化运维管理面板并实现公网访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

nginx的配置文件说明

nginx的配置文件说明 https://blog.csdn.net/S_ZaiJiangHu/article/details/126838279 https://blog.csdn.net/qq_33454884/article/details/89212702 二、nginx的正向代理和反向代理 2.1 nginx的反向代理 2.1.1 反向代理说明 对于客户端来说&#xff0c;反向代理就好像目标…

STM32——NVIC中断优先级管理分析

文章目录 前言一、中断如何响应&#xff1f;NVIC如何分配优先级&#xff1f;二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇&#xff0c;用自己的话总结出来清晰易懂&#xff0c;给小白看也能一眼明了&#xff0c;这就是写博客的意义吧…

【中间件篇-Redis缓存数据库03】Redis高级特性和应用(发布 订阅、Stream)

Redis高级特性和应用(发布 订阅、Stream) 发布和订阅 Redis提供了基于“发布/订阅”模式的消息机制&#xff0c;此种模式下&#xff0c;消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息&#xff0c;订阅该频道的每个客户端都可以收到该消息。 …

遇到问题[已解决]TypeError: ‘odict_keys‘ object is not subscriptable

背景 运行CPD代码时&#xff0c;由于源代码踊跃python2.7&#xff0c;但是我的是3.8出现报错 【Python3】【报错】- TypeError: ‘dict_keys‘ object is not subscriptable-CSDN博客 原因&#xff1a; 在Python3中&#xff0c;keys()方法不允许切片 VGG代码如下 解决办法: 就…

最新GitHub学生认证,可以愉快的使用Copilot了(保姆级教程)

&#x1f388;博客主页&#xff1a;&#x1f308;我的主页&#x1f308; &#x1f388;欢迎点赞 &#x1f44d; 收藏 &#x1f31f;留言 &#x1f4dd; 欢迎讨论&#xff01;&#x1f44f; &#x1f388;本文由 【泠青沼~】 原创&#xff0c;首发于 CSDN&#x1f6a9;&#x1f…

Project Office X for Mac项目管理工具

Project Office X是一款全能的项目管理软件&#xff0c;可帮助企业或个人有效地规划、协调和执行项目。它具有直观的用户界面和强大的功能&#xff0c;适用于各种规模的项目。 这个软件提供了多种实用工具&#xff0c;包括项目计划、资源管理、任务分配、进度跟踪、风险管理和团…

Google Firebase PHP实现消息推送

获取key的方法&#xff1a; 登录谷歌开发者后台 https://console.firebase.google.com/?hlzh-cn function firebaseNotice($title,$body){$token_arr[token1,token2]; //用户的firebasetoken列表$notify_msg ["notification" > ["title" > $title…

NodeJs - 单线程模型和高并发处理原理

NodeJs - 单线程模型和高并发处理原理 前言一. NodeJs 线程模型1.1 NodeJs 模型分析1.2 NodeJs处理事件请求的流程1.3 NodeJs 和传统 Server 的对比 二. Cluster 模块利用多核CPU处理三. 总结 前言 我们都知道JavaScript是单线程的处理。但是我们在Node开发、Egg开发下&#x…

Ubuntu 20.04编译Chrome浏览器

本文记录chrome浏览器编译过程&#xff0c;帮助大家避坑qaq 官网文档&#xff1a;https://chromium.googlesource.com/chromium/src//main/docs/linux/build_instructions.md 一.系统要求 一台64位的英特尔机器&#xff0c;至少需要8GB的RAM。强烈推荐超过16GB。至少需要100…

问题排查-进程分析工具-001strace-安装方式--用法用量

参考来源&#xff1a; centos7 安装strace 《极客时间-网络排查案例课》 strace工具介绍 跟网络排查中有 tcpdump 这样强大的工具类似&#xff0c;进程的排查也有相关的强大工具&#xff0c;比如strace。通过 strace&#xff0c;我们可以把排查工作从进程级别&#xff0c;继续…

【EI会议征稿】第八届先进能源科学与自动化国际研讨会(AESA 2024)

第八届先进能源科学与自动化国际研讨会&#xff08;AESA 2024) 2024 8th International Workshop on Advances in Energy Science and Automation 继AESA 2017-2023相继成功举办之后&#xff0c;来自国内外多所高校、科研院所及企业代表在先进能源科学与自动化的科研合作和交流…

【虹科干货】Lambda数据架构和Kappa数据架构——构建现代数据架构

如何更好地构建我们的数据处理架构&#xff0c;如何对IT系统中的遗留问题进行现代化改造并将其转变为现代数据架构&#xff1f;该怎么为你的需求匹配最适合的架构设计呢&#xff0c;本文将分析两种最流行的基于速度的数据架构&#xff0c;为你提供一些思路。 文章速览&#xf…

2023最新版JavaSE教程——第5天:数组

目录 一、数组的概述1.1 为什么需要数组1.2 数组的概念1.3 数组的分类 二、一维数组的使用2.1 一维数组的声明2.2 一维数组的初始化2.2.1 静态初始化2.2.2 动态初始化 2.3 一维数组的使用2.3.1 数组的长度2.3.2 数组元素的引用 2.4 一维数组的遍历2.5 数组元素的默认值 三、一维…

【开源】基于Vue和SpringBoot的生活废品回收系统

项目编号&#xff1a; S 003 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S003&#xff0c;文末获取源码。} 项目编号&#xff1a;S003&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&…

SAP 50策略测试简介

上篇博文写了40策略的测试,40策略就是典型的按库存生产,考虑库存,考虑销售订单。 本文将测试50策略,按单生产用的最多的策略。相信很多公司按单生产应该都会用到50的策略 1、首先还是先创建物料AB3 同时将BOM中的原材料的独立集中的字段设置为1 2、创建BOM—CS01 3、同杨…