当前位置: 首页 > 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基本使用

http://www.lryc.cn/news/400738.html

相关文章:

  • Vue中使用mind-map实现在线思维导图
  • ChatGPT 深度解析:技术驱动的智能对话
  • Armv8-R内存模型详解
  • Python面经
  • 海外ASO:iOS与谷歌优化的相同点和区别
  • 【C++题解】1168. 歌唱比赛评分
  • 鸿蒙开发工程师面试-架构篇
  • 【Redis】持久化
  • 港股指数实时行情API接口
  • Qt5开发实战_图形_QPen
  • linux进程周边知识——内核对硬件的管理——计算机世界的管理
  • 同声传译语音合成接口,分段预合成实现丝滑的衔接效果
  • 数据结构——单链表详解(超详细)(1)
  • 在 Linux 上使用 lspci 命令查看 PCI 总线硬件设备信息
  • python数据可视化(6)——绘制散点图
  • 【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)
  • Mysql-错误处理: Found option without preceding group in config file
  • [iOS]内存分区
  • sklearn基础教程:掌握机器学习入门的钥匙
  • 【unity实战】使用unity制作一个红点系统
  • 开发指南046-机构树控件
  • SpringBatch文件读写ItemWriter,ItemReader使用详解
  • 如何评估AI模型:评估指标的分类、方法及案例解析
  • 程序员学CFA——经济学(七)
  • imx335帧率改到10fps的方法
  • Large Language Model系列之二:Transformers和预训练语言模型
  • java后端项目启动失败,解决端口被占用问题
  • PostgreSQL安装/卸载(CentOS、Windows)
  • OutOfMemoryError异常OOM排查
  • 【Python】Arcpy将excel点生成shp文件