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

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

公众号新闻

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

管她前浪,还是后浪?

能浪的浪,才是好浪!

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

源码精品专栏

 
来源:TJ

昨天在群里看到有小伙伴问,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



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

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

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

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

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

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
MySQL索引15连问,抗住!如何高效实现MySQL与elasticsearch的数据同步使用 Vector 将 PostgreSQL 日志输出为 Prometheus 指标【图解】推动电梯安全监管科学化、数字化、智能化,一图读懂最新《上海市电梯安全管理办法》美团:MySQL 自增主键一定是连续的吗?江苏14岁少女被逼吸毒身亡,女孩生前漂亮照片曝光,涉事三男子在当地影响力大本周重磅活动!310真棒·美高盛典来了!还有国际学校备考解析、艺术留学专场分享......上海交通大学电院高薪诚聘计算机、自动化、生物信息学、系统生物学、生物、化学、药学等相关专业博后家长最伤孩子的10句话,你说过哪一句?MySQL 数据同步到 Redis 缓存, so Easy !NoSQL 数据库如何选型一条SQL如何被MySQL架构中的各个组件操作执行的?朝霞满天- 15分钟以前孩子常说这4句话,是在向你“求助”,你能听见几句?美团:这个 SQL 语句加了哪些锁?系统上线前,SQL脚本的9大坑高音甜,中音准,低音沉,对于音响还只会这两句?怎么开始学佛(三)回归现实无烟公寓成了大麻屋,奈何?问了几人,MySQL changebuffer 这点都没答对MySQL适合运行在Docker中吗?MIGA项目原作解读:基于生成式预训练语言模型T5的Text-to-SQL模型SpringBoot + Druid,完美监控 MySQL 性能UDOP项目原作解读:统一视觉、语言、格式、任务的通用文档处理模型美团四面:如何保障 MySQL 和 Redis 的数据一致性?全域化、事件营销、生态价值,大剧《三体》让品牌看到IP新解法慢SQL是如何拖垮数据库的?汽车行业智能化、低碳化、数字化趋势,这场会议说明白了!了解那些“奇葩”SQL写法,快速写出高效率SQL美团:为什么 MySQL 不推荐使用 join?隐语开源首个工业级多方安全数据分析系统SCQL:像写SQL一样「易用」隐私计算没有索引也能用SQL ?深度解析 SLS Schema-on-Read 分析原理与应用SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案Spring Boot 如何防护 XSS + SQL 注入攻击 ?终于懂了!刘德华带不动,王晶三年都没捧红,和沈腾一部电影她赚了25亿票房
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。