Java中如何解析、格式化、生成SQL语句?

基于JSqlParser的SQL语句分析与处理 JSqlParser是一个用Java编写的开源SQL解析器库,它能够将SQL语句解析成抽象语法树(Abstract Syntax Tree,AST),并提供丰富的API来遍历和修改这些语法树。作为一个成熟的开源项目,JSqlParser支持大多数主流数据库的SQL语法,包括MySQL、PostgreSQL、Oracle、SQL Server等。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:TJ

a8513d54d4e68f4f1f1aa316e4979ab0.jpeg


昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用?

之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类似内容,那就拿来试试,如果暂时没需求,就先了解收藏(技多不压身)。

JSqlParser

JSqlParser是一个用Java编写的SQL解析器,可以将SQL语句解析为Java对象,从而使开发人员能够轻松地分析、修改和重构SQL查询。

比如,这样的一句SQL语句SELECT 1 FROM dual WHERE a = bSELECT 1 FROM dual WHERE a = b

JSqlParser可以将其解析为如下对象结构

SQL Text
  └─Statements: net.sf.jsqlparser.statement.select.Select
     └─selectBody: net.sf.jsqlparser.statement.select.PlainSelect
        ├─selectItems -> Collection<SelectExpressionItem>
        │  └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem
        │     └─LongValue: 1
        ├─Table: dual
        └─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo
           ├─Column: a
           └─Column: b

然后我们就可以通过其提供的API来访问这句SQL语句中的各个要素:

Statement statement = CCJSqlParserUtil.parse(sqlStr);
if (statement instanceof Select) {
    Select select = (Select) statement;
    PlainSelect plainSelect = (PlainSelect) select.getSelectBody();

    SelectExpressionItem selectExpressionItem =
            (SelectExpressionItem) plainSelect.getSelectItems().get(0);

    Table table = (Table) plainSelect.getFromItem();

    EqualsTo equalsTo = (EqualsTo) plainSelect.getWhere();
    Column a = (Column) equalsTo.getLeftExpression();
    Column b = (Column) equalsTo.getRightExpression();
}

目前,JSqlParser支持了大部分主要的关系型数据库,包括:

  • Oracle

  • MS SQL Server and Sybase

  • PostgreSQL

  • MySQL and MariaDB

  • DB2

  • H2 and HSQLDB and Derby

  • SQLite

它支持大多数常见的SQL语法,包括SELECT、INSERT、UPDATE、DELETE等。除了解析SQL语句外,JSqlParser还提供了一些有用的功能,例如格式化SQL语句、生成SQL查询等。此外,JSqlParser还可以与其他Java库和框架集成,例如Hibernate、Spring等。

项目地址:https://github.com/JSQLParser/JSqlParser



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

106b5c12e00b76876b812d0349639d69.png

已在知识星球更新源码解析如下:

0a5c26207b90c5f54955db3f612d8b3a.jpeg

47681c46b0aed1e82970849db40c3b3a.jpeg

d3819714ce9d1c6c018f6f64bb4d9257.jpeg

0bf0b4c5de6a72dfbac12e5e0f793d59.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
深入解析 Java 中的 SQL 解释器树设计与实现 在上期文章中,我们深入探讨了Java 集合框架中List集合的声明与使用,通过源码解析、案例分享及其应用场景分析,帮助开发者更加高效地处理有序数据。在本期文章中,我们将继续深入 Java 开发技术的高级话题,探讨如何使用SQL 解释器树来解析和执行 SQL 语句。SQL 解析是数据库领域中的核心技术,而在 Java 中,通过树结构(通常是抽象语法树,AST)来解析 SQL 语句是常见的设计方式。 阅读详情

相关推荐

【java】java使用JSqlParser如何解析、格式化、生成SQL

JSqlParse的总体代码量不大,结构也很简单,其项目整体结构图如下:包含表达式相关的类和接口,可以简单看做sql解析后的组成对象之一。如果需要对sql进行一些更改变换,基本都会涉及到这个包。JSqlParse最核心的包,这个包里的类实现了sql的解析,进而我们才可以对解析后的sql(“java类”)做各种自定义处理。虽然这个包是最核心的包,但如果纯粹从使用角度上来说可以不必太在意它,除非我们想深入了解sql解析的过程。

九师兄 753

Java解析SQL的基本思路

splitUntil方法是一个循环,它不断从Tokenizer对象中读取字符串,如果读取的字符串不等于给定的分隔符until,则将字符串拼接到StringBuffer对象sb中,并在每个字符串之间添加一个空格。如果读取的字符串等于分隔符until,则循环结束,并返回拼接好的字符串。使用Tokenizer的next()方法获取SQL语句的第一个关键字,并通过cmdMap获取对应的DBCmd对象。总之,Parser类通过查表法将SQL关键字与对应的数据库命令进行映射,实现了SQL语句的解析和执行。

java小白翻身 3445

SQL格式化功能(JAVA代码)

从Hibernate中提取的SQL格式化功能,去除了没用的功能,没有第三方jar包

Java格式化SQL语句

代码参考(Java格式化SQL语句 作者:kanpiaoxue): https://www.iteye.com/blog/kanpiaoxue-2308622 将kanpiaoxue写的SQLUtils代码粘贴到自己的项目,引入jar包到项目 (补充:我使用的jar包 druid-1.1.10.jar ) 需要美化的SQL可以直接调用如下方法: formatMysql(String sql) formatOdps(String sql) formatOracle(String sq..

visual_lulu的博客 2292

JSqlParser:JSqlParser解析一条SQL语句并将其转换为Java类的层次结构。 可以使用“访问者模式”浏览生成的层次结构

的JSqlParser 在此处查找更多信息和示例: : 。 执照 JSqlParser具有LGPL V2.1或Apache软件许可2.0版的双重许可。 讨论 请提供有关以下方面的反馈: API更改:使用返回值扩展访问者( ) 消息 发布了JSqlParser的版本4.0 发布了JSqlParser的3.2版 发布了JSqlParser的3.1版 发布了JSqlParser 3.0版 数组解析是默认行为。 必须使用解析器标志( CCJSqlParser.withSquareBracketQuotation )启用方括号引用。 由于API的更改,该版本将为3.0 现在,JSqlParser至少使用Java 8 更多新闻可以在这里找到: : 。 JSqlParser的替代品? 看起来很不错,具有扩展SQL语法(如PL / SQL和T-SQL)和Java + .NET AP

AIGC内容溯源技术:如何追踪AI生成内容的原始来源

本文旨在系统性地介绍AIGC内容溯源的技术体系,帮助读者理解如何追踪AI生成内容的来源。我们将覆盖从基础概念到前沿技术的完整知识链,包括但不限于数字水印、区块链存证、内容指纹等技术方案。文章将从AIGC的基本概念出发,逐步深入探讨各种溯源技术,分析其原理和实现,最后讨论实际应用和未来趋势。AIGC:AI Generated Content,人工智能生成内容内容溯源:追踪数字内容的创作、修改和传播历史数字水印:嵌入在数字内容中的不可见识别信息数字水印:隐藏在内容中的识别信息,像隐形墨水内容指纹。

SuperAGI2025 2073

Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?

昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用?

weixin_39158966的博客 1709

JS自动化生成大疆WPML航线文件实战(附完整代码与云台控制解析)

本文详细介绍了如何利用JavaScript自动化生成大疆WPML航线文件,以解决手动规划航线效率低、易出错的问题。通过解析WPML文件结构,特别是云台控制等核心参数,并封装可复用的JS模板函数,开发者能够快速批量生成复杂航线,如倾斜摄影五向飞行,实现航测与巡检任务的标准化与高效执行。

weixin_29007243的博客 299

Excel 数据导入与 SQL 生成:基于 Hutool 和 Apache POI 的优雅实践

在日常开发中,我们经常会遇到需要从 Excel 文件中读取数据并生成 SQL 语句的场景。假设我们需要从一个 Excel 文件中读取员工的昵称和公司邮箱信息,并生成对应的 SQL 更新语句,用于更新数据库中的。这种方法不仅高效,而且易于扩展,适用于多种场景。在解析完 Excel 数据后,我们可以根据业务需求生成 SQL 语句。为了兼容不同类型的单元格(字符串、数字、日期等),我们编写了一个通用的。最终目标是实现自动化处理,减少人工干预,提高效率。下面我们将逐步拆解代码逻辑,并分享一些实用的技巧。

程序猿熊躍暉的专栏 1251

Centos7.9上安装glibc2.28遇到/usr/bin/ld: cannot find -lnss_test2问题

Centos7.9安装glic2.28遇到-lnss_test2问题及解决方案。

freflying1119的博客 2898

二次开发vba_CATIA VBA(VBS)二次开发:使用Search批量选择元素

在CATIA二次开发中很多在程序中进行自动交互的方法或函数都需要使用选择集作为参数,将几何元素按照要求批量添加到选择集中也是实现程序自动运行的有效方法。在前面的文章《CATIA使用VBA(VBS)二次开发时用户的交互选择》和《CATIA使用VBA(VBS)二次开发时工程图和草图位置的交互选择函数Indicate2D》中介绍了在CATIA VBA(VBS)二次开发中用户和选择集之间的交互操...

weixin_32497403的博客 1321

【JSqlParser】Java使用JSqlParser解析SQL语句总结

熟悉JDBC的程序员一般都知道Statement,其实就是语句的意思,不过在Jsqlparser中Statement已经面向对象,被设计成了一个interface,之所以设计成interface大概都可以猜到,因为Jsqlparser既然要去解析SQL,那必然要对SQL语句做区分,到底是Select、还是Insert、还是Delete、甚至是Create,而Jsqlparser对每种语句都做了一个封装,它们都继承了Statement。

RudolphLiu的博客 1万+

机器学习实战5-天气预测系列:利用数据集可视化分析数据,并预测某个城市的天气情况

大家好,我是微学AI,最近天气真的是多变啊,忽冷忽热,今天再次给大家带来天气的话题,机器学习实战5-天气预测系列,我们将探讨一个城市的气象数据集,并利用机器学习来预测该城市的天气状况。该数据集包含年平均温度和湿度等信息。

微学AI的博客 1万+

java分批次写入文件_java中如何实现文件的批量读取与写入

展开全部public class UserDataGather {public static final String TXT_FILE_PATH = "D://testUser.txt";public static final String openFileStyle = "r";public static final String fieldLimitChar = ".";public st...

weixin_32486581的博客 1973

【MATLAB】通过计算曲率和曲率变化率来实现对曲线波浪程度

这段代码将计算给定曲线的曲率,并与给定阈值进行比较以检测拐角。函数是MATLAB中一个常用的函数,可以用于计算曲线在每个点处的曲率。它基于一种被称为“local least squares fitting” 的方法,通过拟合每个点周围的一小段曲线来计算曲率。MATLAB中可以使用多种方法实现拐角检测,其中一种方法是基于曲率半径的算法。该算法通过计算曲线上每个点处的曲率半径,找到拐角和弯曲处。是一个可选参数,用于控制拟合曲线的平滑度,取值范围为0到1,越接近1表示曲线越平滑。表示曲线在每个点处的曲率,

Fanjufei的博客 1921

零基础入门simulink建模仿真--基于Simulink的QPSK调制与解调仿真建模示例

QPSK是一种相位调制技术,将两个比特映射到一个符号上,每个符号对应四个可能的相位之一(0°、90°、180°、270°)。通过Simulink,我们可以通过模块化的建模方式实现QPSK的调制和解调过程,并观察信号在信道中的传输效果。通过本指南,我们介绍了如何基于Simulink搭建一个完整的QPSK调制与解调仿真模型,并进行仿真和性能评估。背景介绍:理解QPSK调制与解调的基本原理及其应用。所需工具和环境:列出进行QPSK仿真所需的工具和环境。步骤详解。

amy_mhd的博客 1310

LangChain4j如何让Java应用通过自然语言直接查询数据库

在当今数据驱动的业务环境中,非技术用户经常需要访问数据库信息却受限于SQL技能门槛。LangChain4j作为Java生态中领先的AI应用框架,通过其SQL数据库智能交互功能,让业务人员能够用自然语言直接查询数据库,极大提升了数据访问的民主化程度。这项技术将大型语言模型与数据库元数据智能结合,为Java开发者提供了构建智能数据查询系统的强大工具。 ## 价值定位:消除技术门槛的数据访问革命 传

gitblog_00626的博客 1012

Python爬虫实战:高德地图POI信息爬取(餐馆/加油站等),附选址分析技巧

高德API配置AMAP_KEY = "你的高德API Key" # 替换成自己的Key# 爬取参数CITY = "成都" # 城市DISTRICTS = ["锦江区"] # 区域,可添加多个(比如["锦江区", "武侯区"])KEYWORDS_LIST = ["川菜馆", "加油站"] # 要爬取的POI类型TYPES = {"川菜馆": "050101", # 餐饮服务→中餐→川菜馆(高德POI分类编码)"加油站": "110100" # 交通设施→加油站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2472

JAVA校验SQL语句与格式化语句

前言 现在需要向数据库中某张表中的某个字段中,插入的值为SQL语句,但是要保证插入SQL语句的正确性,而且还需要进行格式化,就像navicat中的美化SQL语句一样。 格式化 druid包中提供了SQLUtils用来格式化SQL语句,直接使用即可 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version&

时来时去时不返 3098

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Druid解析SQL语句

Druid介绍:阿里巴巴Druid Maven: <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</versi...

星的奏鸣曲 7196

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SQL解析利器General SQL Parser

最近发现一款很有意思的工具,名字叫GSP(全称General SQL Parser)。他是一款专业的SQL引擎,适用于各种数据库。

postnull的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JsqlParser插件格式化SQL语句

第三方的格式化工具类: JsqlParser插件用来对于SQL语句进行解析和组装,将SQL语句关键词之间的内容用List<String>进行保存,同时可以进行更改List<String>的内容后重新组装成一个新的SQL语句。项目中的需求多用于更改SQL中table name。(其实感觉用正则会更好一点) JsqlParser其实就是将sql语句各个关键词用Java类的形...

java技术专家全栈成长之路 2053

java sql语句格式化_java 对sql格式化

public classSqlFormat{public static voidmain(String[] args){String sql="";sqlFormat(sql);}public static Map map = new HashMap();//需要换行的字段public static Map bracket= new HashMap();//括号前关键字static{map.put...

weixin_39865102的博客 628

SQL 语法解析与格式化实战:使用 General SQL Parser 构建可靠的 SQL 分析流程

本文介绍了使用General SQL Parser(GSP)进行SQL自动化处理的方法。GSP是一款专业的SQL解析引擎,支持多种数据库方言,能实现语法检测、SQL格式化和语句提取等功能。文章通过Java代码示例演示了语法检查、SQL格式化和多语句拆分等操作,并分析了GSP在SQL审计、数据库迁移等场景的应用优势。相比正则表达式,GSP能更准确地处理复杂SQL语句,是数据库开发中可靠的底层工具。

聚焦学生开发者需求,分享课设毕设项目实战经验、系统开发技巧、数据库设计规范及文档排版实用方法。 1349
上一篇: GPT-4老板:AI可能会杀死人类,已经出现我们无法解释的推理能力
下一篇: 不愧是微软出品的工具,逆天!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值