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() {
                @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.mfbz.cn/a/129893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PLSQL工具 数据库连接名的设置

在help >>surpost info 能看到 这东西好难用啊。。不直接显示url,非要搞个名称。。

2023年A股借壳上市研究报告

第一章 借壳上市概况 1.1 定义 借壳上市作为一种独特的资本市场操作手法&#xff0c;历来是企业拓展融资渠道和实现市场战略目标的重要途径。具体来说&#xff0c;借壳上市可分为狭义与广义两种模式。在狭义的定义下&#xff0c;借壳上市是指一家已上市的公司的控股母公司&am…

React【异步逻辑createAsyncThunk(一)、createAsyncThunk(二)、性能优化、createSelector】(十二)

文章目录 异步逻辑 createAsyncThunk&#xff08;一&#xff09; createAsyncThunk&#xff08;二&#xff09; 性能优化 createSelector 异步逻辑 //Product.js const onAdd () > {const name nameRef.current.value// 触发添加商品的事件dispatch(addProduct({name…

vue3介绍

介绍 3完全兼容2的语法 vue3&#xff1a;体积更小&#xff0c;性能会更高。底层做了很多优化 2倍左右 vue3vitets 渐进式框架 vue3和vue2 的区别 新语法&#xff0c;性能上提升很多 思想是一致的&#xff1a;动态绑定&#xff1a;状态data&计算属性&#xff0c;监听某些状态…

超声波俱乐部分享:Enter AI native application

11月5日&#xff0c;2023年第十四期超声波俱乐部内部分享会在北京望京举行。本期的主题是&#xff1a;Enter AI native application。 到场的嘉宾有&#xff1a;超声波创始人杨子超&#xff0c;超声波联合创始人、和牛商业创始人刘思雨&#xff0c;蓝驰创投合伙人刘勇&#xf…

The Sandbox于香港举办全球首个创作者日,推出「公开发布」功能,并为 GameMakerFund提供1亿$SAND基金!

新的 NFT 铸造、无需编码的 Game Maker 软件升级、其他支持 Web3 创作者的功能优化。 2023 年 11 月 3 日——The Sandbox 举办了首届全球创作者日活动&#xff0c;并在活动期间宣布了其在 2024 年的计划&#xff0c;包括为创作者赋能&#xff0c;在地图上呈现 2000 个用户生成…

说说 React中的setState执行机制

一、是什么 一个组件的显示形态可以由数据状态和外部参数所决定&#xff0c;而数据状态就是state 当需要修改里面的值的状态需要通过调用setState来改变&#xff0c;从而达到更新组件内部数据的作用 如下例子&#xff1a; import React, { Component } from react export d…

flutter 使用 hive 遇到的错误

1. ] Unhandled Exception: RangeError: Not enough bytes available. 根据日志定位到 下图的地方 解决&#xff1a;因为之前存在保存到本地的信息&#xff0c;但是你修改了 数据类里面的东西&#xff08;比如添加变量啥的&#xff09;&#xff0c;清空app缓存或者卸载重新构…

vue2和vue3 的双向绑定原理

前文: 都知道vue是双向绑定的mvvm框架,也一直再用,那么他到底是如何实现的呢?vue3又针对这点做了哪些升级呢? 这段时间也正好有空,下面我们来一起看看吧 一 、vue的双向绑定原理 那么什么是双向绑定呢 ? 一般我们所指的双向绑定都是指的数据,即当数据发生变化的时候,视图也…

Vue简单使用Echart图表柱形图 vue使用柱形图 vue使用 echart图表柱形图 vue使用柱形图

Vue简单使用Echart图表柱形图 vue使用柱形图 vue使用 echart图表柱形图 vue使用柱形图 1、安装依赖2、页面Demo使用3、效果图 1、安装依赖 官方文档&#xff1a;https://echarts.apache.org/zh/option.html#title 官方在线示例&#xff1a;https://echarts.apache.org/exampl…

SpringCloudAlibaba——Nacos

Nacos是服务注册中心服务配置中心。替换了以前的EurekaConfigBus。 1.Nacos作为服务注册中心 Nacos支持AP和CP模式的转换。 2.Nacos作为服务配置中心 服务要配置两个yml文件&#xff0c;bootstrap.yml和application.yml。因为Nacos同springcloud-config一样&#xff0c;在项…

4S店汽车行业万能通用小程序源码系统 在线预约试驾+购车计算器 源码完全开源可二次开发

随着互联网技术的发展和普及&#xff0c;越来越多的消费者开始依赖于互联网进行消费。传统的汽车销售模式也正在经历着数字化转型&#xff0c;以适应消费者需求的变化。这款小程序源码系统就是为帮助汽车4S店等销售商实现数字化转型而开发的。 以下是部分核心功能的代码模块&a…

OushuDB 专家认证第四期报名开始啦!

OushuDB 专家认证培训第四期今日正式启动&#xff01;本次培训为偶数科技面向生态合作伙伴与客户公开举办的线上培训&#xff0c;旨在共同发展 OushuDB 生态。 报名时间&#xff1a;2023年11月9日9:00—11月30日12:00 报名方式&#xff1a;偶数科技官网&#xff08;点击下方阅…

新“芯”向荣|利用合作科研设计和优化电芯案例探究

利用合作科研设计和优化电芯 锂电行业发展的契机——我国致力于减少二氧化碳的排放&#xff0c;将2050年实现净零排放作为目标。 电池制造商、细分领域专用电芯设计厂商、汽车OEM厂商、电动垂直起降(eVTOL)飞机制造商以及电池材料供应商都投入了大量的资源&#xff0c;寻求电…

金融服务行业如何面对精细化的大数据模式下日益增加的文件传输压力?

随着数字化转型的加速&#xff0c;金融机构需要在数据化基础上进行升级和转型&#xff0c;挖掘互联网数据传输与金融业深度融合的新形态&#xff0c;同时确定如何更好地存储、保护和分析数据。然而&#xff0c;在精细化的大数据模式下&#xff0c;金融机构也面临着日益增加的数…

ChatGPT 上新,效果炸裂,知识平台才是大模型的最佳狩猎场

数新网络_让每个人享受数据的价值浙江数新网络有限公司是一家开源开放、专注于云数据智能操作系统和数据价值流通的服务商。公司自主研发的DataCyber云数据智能操作系统&#xff0c;主要包括数据平台CyberData、人工智能平台CyberAI、数据智能引擎CyberEngine、数据安全平台Cyb…

try-catch-finally执行以及他们在有return的情况下,基本数据类型、对象以及有异步赋值情况异同分析

这两天面试,遇到好几个人,都是那种我感觉我肚子里的墨水都吐出来完了,难不倒人家,于是问了下家里那位老狗,从最开始就念叨着你问他try-catch在有return的情况下怎么执行的,执行结果是啥,我前面没理,后面确实有点遭不住了,来看看吧,肚子里添点墨水,别把脸丢大了~ 做…

Android jetpack compose 组件学习

官网地址&#xff1a;https://developer.android.com/jetpack/compose/tutorial?hlzh-cn 一、写一个 hello world 在New Project的时候选择Photo and Tablet里的Empty Compose Activity&#xff0c;如下所示&#xff1a; 打开这个project之后&#xff0c;可以看到MainActivit…

WebSocket魔法师:打造实时应用的无限可能

1、背景 在开发一些前端页面的时候&#xff0c;总是能接收到这样的需求&#xff1a;如何保持页面并实现自动更新数据呢&#xff1f;以往的常规做法&#xff0c;是前端使用定时轮询后端接口&#xff0c;获取响应后重新渲染前端页面&#xff0c;这种做法虽然能达到类似的效果&…

RPC 框架 openfeign 介绍和学习使用总结

一、基本概念 RPC 远程过程调用&#xff08;Remote Procedure Call&#xff09;的缩写形式 Birrell 和 Nelson 在 1984 发表于 ACM Transactions on Computer Systems 的论文《Implementing remote procedure calls》对 RPC 做了经典的诠释。 RPC 是指计算机 A 上的进程&am…
最新文章