springboot引入druid解析sql

news2025/1/23 10:44:33

一、前言
在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析。

二、引入相关maven依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

三、通过工具类SqlUtils实现对SQL的解析。

public class QualitySqlUtils {

	  /**
     *  根据sql及数据源类型获取表名
     */
	 public static List<String> getSelectSqlTable(String sql, String dbType) {
        List<String> tableList = new ArrayList<>();
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
        SchemaStatVisitor visitor;
        for (SQLStatement sqlStatement : stmtList) {
            if (DbType.mysql.name().equalsIgnoreCase(dbType)) {
                visitor = new MySqlSchemaStatVisitor();
            } else if (DbType.hive.name().equalsIgnoreCase(dbType)) {
                visitor = new HiveSchemaStatVisitor();
            } else if (DbType.postgresql.name().equalsIgnoreCase(dbType)) {
                visitor = new PGSchemaStatVisitor();
            } else if (DbType.oracle.name().equalsIgnoreCase(dbType)) {
                visitor = new OracleSchemaStatVisitor();
            } else {
                visitor = new SchemaStatVisitor(DbType.of(dbType));
            }
            sqlStatement.accept(visitor);
            Map<TableStat.Name, TableStat> tables = visitor.getTables();
            for (Map.Entry<TableStat.Name, TableStat> entry: tables.entrySet()){
                String value = entry.getValue().toString();
                if (StringUtils.isNotBlank(value)) {
                    tableList.add(entry.getKey().getName());
                }
            }
        }
        return tableList;
    }
    /**
    * 根据sql获取查询的字段
    */
    public static Map<String, String> getSelectSqlColumn(String sql, String dbType) {
        Map<String, String> columnMap = new HashMap<>();
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
        for (int i = 0; i < stmtList.size(); i++) {
            SQLStatement stmt = stmtList.get(i);
            if (stmt instanceof SQLSelectStatement) {
                SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) stmt;
                SQLSelect select = sqlSelectStatement.getSelect();
                SQLSelectQueryBlock query = (SQLSelectQueryBlock) select.getQuery();
                List<SQLSelectItem> selectList = query.getSelectList();
                selectList.forEach(item->{
                    columnMap.put(item.getExpr().toString(), item.getAlias());
                });
            }
        }
        return columnMap;
    }
}

三、测试结果

public class testDemo{
	
    public static void main(String[] args) {
        String sql = "select t.* from table1 as t left join table2 t2 on t.id = t2.id";
        List<String> tableList =getSelectSqlTable(sql, "mysql");
        System.out.println("获取到的表名: "+tableList);
    }
}

运行结果如下:

在这里插入图片描述
大家感兴趣可以尝试下。

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

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

相关文章

Python基础语法入门(第二十二天)——并发编程

在Python中&#xff0c;并发编程的实现有多种方式&#xff0c;包括多线程、多进程和异步编程。每一种方式都有其使用的场景和特点。那么如何去选择多线程、多进程和多协程呢&#xff1f;要知道如何选择的话就要了解一下什么是CPU密集型计算、什么是I/O密集型计算&#xff1b;多…

selenium +Jmeter 的性能测试

通过Jmeter快速将已有的Selenium 代码以性能测试的方式组织起来&#xff0c;并使用JMeter 丰富的报表展示测试结果 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver …

JAVA基础知识(三)——数组

数组 数组一、数组的概述1.1 数组的定义1.2 数组的常见概念1.3 数组的特点1.4 数组的分类 二、一维数组的使用2.1 一维数组的声明和初始化2.2 数组的基本使用2.3 数组元素的默认初始化值2.4 数组的内存解析 三、多维数组的使用3.1 二维数组的理解3.2 二维数组的声明3.3 二维数组…

多家企业加入即将在2024年发射的量子卫星SpeQtral-1任务

近日&#xff0c;总部位于新加坡的量子通信技术公司SpeQtral宣布将与纳米航空电子公司NanoAvionics和卫星光子学公司Mbryonics合作执行即将到来的SpeQtral-1量子密钥分发&#xff08;Quantum Key Distribution, QKD&#xff09;卫星任务。NanoAvionics被选为卫星平台提供商&…

算法题面试实战收集

回文数字 2023-08-18 美团 一面 在不使用额外的内存空间的条件下判断一个整数是否是回文。 回文指逆序和正序完全相同。 数据范围&#xff1a; 进阶&#xff1a; 空间复杂度O(1) &#xff0c;时间复杂度 O(n) 提示&#xff1a; 负整数可以是回文吗&#xff1f;&#xff08;比如…

Python数据分析实战-多进程并发处理列表(附源码和实现效果)

实现功能 有15个列表&#xff0c;尝试多进程并发处理&#xff0c;每个列表一个进程&#xff0c;进程数和 CPU 核数一致 实现代码 import multiprocessing有15个列表&#xff0c;尝试多进程并发处理&#xff0c;每个列表一个进程&#xff0c;进程数和 CPU 核数一致def sum_li…

第P1周:实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow 2.13.0 一、前期工作&#xff1a; …

Element Plus el-table 数据为空时自定义内容【默认为 No Data】

1. 通过 Table 属性设置 <div class"el-plus-table"><el-table empty-text"暂无数据" :data"tableData" style"width: 100%"><el-table-column prop"date" label"Date" width"180" /&g…

VR数字工厂多元化展现,打造数字企业工厂名片

5G时代&#xff0c;各种营销都在走数字化的路子&#xff0c;VR数字工厂用VR赋能工厂数字升级&#xff0c;将企业环境、工厂生产、产品研发、质检运输等流程&#xff0c;无死角720度的展示在客户面前&#xff0c;不仅可以提升自身企业的实力&#xff0c;还可以提高客户的信任感。…

.netcore grpc身份验证和授权

一、鉴权和授权&#xff08;grpc专栏结束后会开启鉴权授权专栏欢迎大家关注&#xff09; 权限认证这里使用IdentityServer4配合JWT进行认证通过AddAuthentication和AddAuthorization方法进行鉴权授权注入&#xff1b;通过UseAuthentication和UseAuthorization启用鉴权授权增加…

虽然每天都在一线coding,但是如果不是经常温习一些面试题,真的有时候会被问蒙

前言 虽然每天都在一线coding,但是如果不是经常温习一些面试题,真的有时候会被问蒙。因为技术的东西是在大多台繁杂了,不经常用就很容易淡忘,但是有经验有能很快处理开发中的问题。技术无止境,人生苦短,35岁是程序员的一道坎,能转管理路线尽量转管理路线。 一、有了 f…

HackNos 3靶场

配置 进入控制面板配置网卡 第一步&#xff1a;启动靶机时按下 shift 键&#xff0c; 进入以下界面 第二步&#xff1a;选择第二个选项&#xff0c;然后按下 e 键&#xff0c;进入编辑界面 将这里的ro修改为rw single init/bin/bash&#xff0c;然后按ctrlx&#xff0c;进入…

暂停Windows更新的方法,可延后数十万年,简单且有手就行

前言 近年来&#xff0c;Windows更新频率过快&#xff0c;最大只能暂停更新5周&#xff0c;导致用户不厌其烦&#xff0c;从网上找到的暂停更新的方法不是过于繁琐就是毫无效果&#xff0c;或者是暂停的时间有限&#xff0c;无意中发现一个大神的帖子可以通过修改注册表信息以达…

【K8S源码之Pod漂移】整体概况分析 controller-manager 中的 nodelifecycle controller(Pod的驱逐)

参考 k8s 污点驱逐详解-源码分析 - 掘金 k8s驱逐篇(5)-kube-controller-manager驱逐 - 良凯尔 - 博客园 k8s驱逐篇(6)-kube-controller-manager驱逐-NodeLifecycleController源码分析 - 良凯尔 - 博客园 k8s驱逐篇(7)-kube-controller-manager驱逐-taintManager源码分析 - 良…

完美解决微信小程序van-field left-icon自定义图片

实现效果&#xff1a; <view class"userName"><van-field left-icon"{{loginUserNameIcon}}" clearable class"fieldName" value"{{ loginUserName }}" placeholder"请输入账号" border"{{ false }}" &g…

python入门--抓取网页文字

要抓取网页文字&#xff0c;我们需要使用Python的一个库&#xff0c;叫做requests。这个库可以帮助我们向网站发送请求&#xff0c;获取网站的内容。 下面是一个简单的示例代码&#xff0c;用于抓取一个网页的文字&#xff1a; import requests import re import os import i…

年度数码刺客 真香小主机 英特尔 蝰蛇峡谷

作为英特尔旗下的迷你工作站&#xff0c;英特尔峡谷系列设备每年都能吸引不少眼球&#xff0c;今年英特尔推出的最新一代的蝰蛇峡谷除了采用英特尔CPU之外&#xff0c;更加重要的是加入了英特尔Arc A770M显卡&#xff0c;这是一款移动显卡&#xff0c;也算是英特尔重返游戏级独…

精彩回顾 | 迪捷软件出席2023ATC汽车电子与软件技术周

2023年8月18日&#xff0c;由ATC汽车技术会议主办&#xff0c;上海市集成电路行业协会支持的“2023ATC汽车电子与软件技术周”在上海市圆满落幕。迪捷软件上海参展之行圆满收官。 ▲开幕式 本次峰会汇聚了整车厂、汽车零部件集团、软硬件方案提供商、软件工具供应商、软件测试…

优秀产品经理所必备的6大产品思维

作为产品经理&#xff0c;我们需要真正了解产品思维&#xff0c;其核心就是透过现象看本质&#xff0c;我们从事情的宏观到微观&#xff0c;逐层抽丝剥茧&#xff0c;发现本源。如果我们无法透过现象看本质&#xff0c;那么在日常工作中往往不能深刻认识和分析问题&#xff0c;…

【HarmonyOS】codelab在hvigor版本2.4.2上无法运行问题

【关键字】 HarmonyOS、codelab、hvigor 【问题描述】 有cp反馈集成鸿蒙codelab报错。 下载音乐专辑示例文件&#xff08;一次开发&#xff0c;多端部署-音乐专辑&#xff08;ArkTS&#xff09; (huawei.com)&#xff09;后构建项目&#xff0c;显示找不到2.5.0的hvigor。 …