当前位置: 首页 > news >正文

JSqlParser 解析 sql

目录

  • 前言
  • 一、Maven依赖
  • 二、获取sql中的表名
  • 三、获取sql中的具体信息

前言

JSqlParser是一个 SQL 语句解析器。它将 SQL 语句转换为可遍历的 Java 类层次结构,可以方便的用代码对 SQL 语句进行解析,修改等操作。

官网 api 文档和 github 地址如下:

jsqlparser API 文档

jsqlparser github 地址

一、Maven依赖

        <!-- 4.9版本是适用于jdk8的最后一个版本--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.9</version></dependency>

二、获取sql中的表名

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.util.TablesNamesFinder;
import java.util.Set;public class MainServer {public static void main(String[] args) throws JSQLParserException {String sql = "SELECT e.employee_id, e.first_name, e.last_name, d.department_name, e.salary " +"FROM employees e " +"LEFT JOIN departments d ON e.department_id = d.department_id " +"WHERE e.salary > ( " +"    SELECT AVG(salary) " +"    FROM staff " +"    WHERE department_id = e.department_id " +");";Set<String> tableNames = TablesNamesFinder.findTables(sql);//输出: staff, departments, employeesSystem.out.println(tableNames);}
}

三、获取sql中的具体信息

import javassist.CannotCompileException;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;public class MainServer {public static void main(String[] args) throws CannotCompileException, JSQLParserException {String sql = "SELECT DISTINCT e.employee_id, e.first_name, e.last_name, d.department_name, e.salary " +"FROM employees e " +"LEFT JOIN departments d ON e.department_id = d.department_id " +"WHERE e.salary > ( " +"    SELECT AVG(salary) " +"    FROM staff " +"    WHERE department_id = e.department_id " +") " +"GROUP BY d.department_id, e.employee_id, e.first_name, e.last_name, d.department_name, e.salary " +"HAVING COUNT(*) = 1  " +"ORDER BY d.department_name " +"LIMIT 10 OFFSET 20;";Statement statement = CCJSqlParserUtil.parse(sql);//如果是 select 语句if (statement instanceof Select) {Select selectStatement = (Select) statement;PlainSelect plainSelect = selectStatement.getPlainSelect();System.out.println("【DISTINCT 子句】:" + plainSelect.getDistinct());System.out.println("【查询字段】:" + plainSelect.getSelectItems());System.out.println("【FROM 表】:" + plainSelect.getFromItem());System.out.println("【JOIN 子句】:" + plainSelect.getJoins());System.out.println("【WHERE 子句】:" + plainSelect.getWhere());System.out.println("【GROUP BY 子句】:" + plainSelect.getGroupBy());System.out.println("【HAVING 子句】:" +plainSelect.getHaving());System.out.println("【ORDER BY 子句】:" + plainSelect.getOrderByElements());System.out.println("【LIMIT 子句】:" + plainSelect.getLimit());System.out.println("【OFFSET 子句】:" + plainSelect.getOffset());}}
}

输出:

DISTINCT 子句】:DISTINCT
【查询字段】:[e.employee_id, e.first_name, e.last_name, d.department_name, e.salary]FROM 表】:employees e
【JOIN 子句】:[LEFT JOIN departments d ON e.department_id = d.department_id]WHERE 子句】:e.salary > (SELECT AVG(salary) FROM staff WHERE department_id = e.department_id)GROUP BY 子句】:GROUP BY d.department_id, e.employee_id, e.first_name, e.last_name, d.department_name, e.salary
【HAVING 子句】:COUNT(*) = 1ORDER BY 子句】:[d.department_name]LIMIT 子句】: LIMIT 10OFFSET 子句】: OFFSET 20

参考:
JSqlParser实战指南
JSQLParser 解析复杂SQL
JSqlParser入门系列
jsqlparser基本使用

相关文章:

JSqlParser 解析 sql

目录 前言一、Maven依赖二、获取sql中的表名三、获取sql中的具体信息 前言 JSqlParser是一个 SQL 语句解析器。它将 SQL 语句转换为可遍历的 Java 类层次结构&#xff0c;可以方便的用代码对 SQL 语句进行解析&#xff0c;修改等操作。 官网 api 文档和 github 地址如下&…...

Vue中使用mind-map实现在线思维导图

概述 在前面的文章Vue中实现在线画流程图实现中介绍了流程图的在线绘制&#xff0c;在本文&#xff0c;给大家分享一下基于mind-map实现在线的思维导图&#xff0c;并实现&#xff1a;1. 导图导出为图片&#xff1b;2. 打开xmind文件。 实现效果 实现 1. mind-map简介 simp…...

ChatGPT 深度解析:技术驱动的智能对话

在当今科技飞速发展的时代&#xff0c;ChatGPT 无疑成为了最耀眼的明星之一。它以其令人惊叹的智能对话能力&#xff0c;引发了全球范围内的广泛关注和热议。 ChatGPT 背后的技术堪称精妙绝伦。它基于深度学习算法&#xff0c;通过对海量数据的学习和分析&#xff0c;从而能够理…...

Armv8-R内存模型详解

目录 1.内存模型的必要性 2.Armv8-R内存模型分类 2.1 Normal memory 2.2 Device Memory 2.2.1 Gathering 2.2.2 Reordering 2.2.3 Early Write Acknowledgement 3.小结 大家好&#xff0c;今天是悲伤的肌肉。 在调研区域控制器芯片时&#xff0c;发现了S32Z、Stellar …...

Python面经

文章目录 Python基本概念1. Python是**解释型**语言还是**编译型**语言2. Python是**面向对象**语言还是面向过程语言3. Python基本数据类型4.append和 extend区别5.del、pop和remove区别6. sort和sorted区别介绍一下Python 中的字符串编码is 和 的区别*arg 和**kwarg作用浅拷…...

海外ASO:iOS与谷歌优化的相同点和区别

海外ASO是针对iOS的App Store和谷歌的Google Play这两个主要海外应用商店进行的优化过程&#xff0c;两个不同的平台需要采取不同的优化策略&#xff0c;以下是对iOS优化和谷歌优化的详细解析&#xff1a; 一、iOS优化&#xff08;App Store&#xff09; 1、关键词覆盖 选择关…...

【C++题解】1168. 歌唱比赛评分

问题&#xff1a;1168. 歌唱比赛评分 类型&#xff1a;数组找数 题目描述&#xff1a; 四&#xff08;1&#xff09; 班要举行一次歌唱比赛&#xff0c;以选拔更好的苗子参加校的歌唱比赛。评分办法如下&#xff1a;设 N 个评委&#xff0c;打 N 个分数&#xff08; 0≤每个分…...

鸿蒙开发工程师面试-架构篇

1. 假如让你负责鸿蒙App架构设计&#xff0c;你会关注哪些方面&#xff1f; 分层架构设计&#xff1a; 将应用划分为产品定制层、基础特性层和公共能力层&#xff0c;以降低层间依赖性&#xff0c;提升代码可维护性。通过分层架构设计&#xff0c;进一步明确每层的职责和层间交…...

【Redis】持久化

对于Redis中间件来说&#xff0c;一般是作为内存型数据库或者缓存出现的。但是由于其数据是在内存中&#xff0c;因此当Redis所在的主机宕机之后&#xff0c;数据就会消失&#xff0c;再次重启之后&#xff0c;没有任何数据。这对于生产环境来说&#xff0c;是属于P0级别的灾难…...

港股指数实时行情API接口

港股 指数 实时 行情 API接口 # Restful API https://tsanghi.com/api/fin/index/HKG/realtime?token{token}&ticker{ticker}指定指数代码&#xff0c;获取该指数的实时行情&#xff08;开、高、低、收、量&#xff09;。 更新周期&#xff1a;实时。 请求方式&#xff1a…...

Qt5开发实战_图形_QPen

Qpen是Qt框架中的一个类&#xff0c;用于定义绘制线条的属性&#xff0c;包括颜色、宽度、样式、端点样式和连接样式。 具体属性(设置颜色和设置宽度直接pass从样式开始&#xff09;: 设置样式&#xff1a; pen的样式主要有以下几种&#xff1a; 分别是&#xff1a;直线样式…...

linux进程周边知识——内核对硬件的管理——计算机世界的管理

前言&#xff1a;本节主要讲解内核也就是操作系统对于硬件的管理&#xff0c; 本节内容同样为进程的周边知识。 主要是关于软件方面&#xff0c; 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章&#xff0c; 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但…...

同声传译语音合成接口,分段预合成实现丝滑的衔接效果

背景&#xff1a; 在使用微信官方语音合成插件的时候遇到一个问题&#xff0c;textToSpeech这个api的内容限制在官网的文档上明明是1000个字节&#xff0c;也就是说能保证333个中文字符应该是没有问题的&#xff0c;但是也不知道为什么我这里仅仅传了150个中文字符就报错了&…...

数据结构——单链表详解(超详细)(1)

前言&#xff1a; 小编在近日学习了单链表的知识&#xff0c;为了加强记忆&#xff0c;于是诞生了这一篇文章&#xff0c;单链表是数据结构比较重要的知识&#xff0c;读者朋友们一定要去好好的学习&#xff01;这个可以说是比顺序表更好用的线性表&#xff0c;下面废话不多说&…...

在 Linux 上使用 lspci 命令查看 PCI 总线硬件设备信息

lspci 命令用于显示 Linux 系统上的设备和驱动程序 当在个人电脑或服务器上运行 Linux 时&#xff0c;有时需要识别该系统中的硬件。lspci 命令用于显示连接到 PCI 总线的所有设备&#xff0c;从而满足上述需求。该命令由 pciutils 包提供&#xff0c;可用于各种基于 Linux 和…...

python数据可视化(6)——绘制散点图

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 Python绘制散点图查看BMI与保险费的关系 散点图: 用两组数据构成多个坐标点&#xff0c;考察…...

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别&#xff08;automatic-speech-recognition&#xff09; 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…...

Mysql-错误处理: Found option without preceding group in config file

1、问题描述 安装MYSQL时&#xff0c;在cmd中“初始化”数据库时&#xff0c;输入命令&#xff1a; mysqld --initialize --consolecmd报错&#xff1a; D:\mysql-5.7.36-winx64\bin>mysql --initialize --console mysql: [ERROR] Found option without preceding group …...

[iOS]内存分区

[iOS]内存分区 文章目录 [iOS]内存分区五大分区栈区堆区全局区常量区代码区验证内存使用注意事项总结 函数栈堆栈溢出栈的作用 参考博客 在iOS中&#xff0c;内存主要分为栈区、堆区、全局区、常量区、代码区五大区域 还记得OC是C的超类 所以C的内存分区也是一样的 iOS系统中&a…...

sklearn基础教程:掌握机器学习入门的钥匙

sklearn基础教程&#xff1a;掌握机器学习入门的钥匙 在数据科学和机器学习的广阔领域中&#xff0c;scikit-learn&#xff08;简称sklearn&#xff09;无疑是最受欢迎且功能强大的库之一。它提供了简单而高效的数据挖掘和数据分析工具&#xff0c;让研究人员、数据科学家以及…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...