首页 > 数据库 >Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?

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

时间:2023-03-07 09:45:18浏览次数:57  
标签:语句 Java Column JSqlParser statement SQL

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

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

标签:语句,Java,Column,JSqlParser,statement,SQL
From: https://www.cnblogs.com/didispace/p/17186990.html

相关文章

  • mysql 0点 弹窗 取消
         ......
  • 开心档之Java 9 新特性
    Java9新特性Java9发布于2017年9月22日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍Java9的新特性。Java9新特性模......
  • postgresql + mybatis传入时间参数的问题
    在使用mybatis传入日期参数进行动态时间判断的时候,如果传入参数为String,使用mybatis时,在mapper中以下几种写法是错误的<iftest="query.beginDate!=nullandquer......
  • SQL语句
    MySQL是c/s架构第三方(图形化)工具:workbenchNavicatSQlyogphpmyadmin连接服务器配置信息:地址,端口号,用户名,密码常见的数据库:mysqloraclesql_server行:row   列:column......
  • java23种设计模式学习
    1、策略模式理解:就是通过传不同的参数,调用不同的对象代码实操publicinterfaceIStrategy{voidoperate();}publicclassBackDoorimplementsIStrategy{......
  • java的反射
    1.获取class对象的三种方式Class.forName();类名.class实例对象.getClass();2.利用反射获取构造函数Constructor<?>[]getConstructor()返回所有公共构造方法......
  • MySQL中这14个必备神器,用过都说好
    前言:最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat 在我们平常的工作中,使用groupby......
  • mysql中 Char 和 varchar 的区别?
    1、char的长度是固定不变,而varchar的长度是可变的例如值:abc类型char(10),存储值为:abc_______(abc+7个空格)类型varchar(10),存储值为:abc(自动缩短为3个字母的长......
  • ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
    目录ElasticSearch实现分词全文检索-概述ElasticSearch实现分词全文检索-ES、Kibana、IK安装ElasticSearch实现分词全文检索-Restful基本操作ElasticSearch......
  • JavaSE——转型与instanceof关键字
    为什么要转型多态的写法就无法访问子类独有功能了。当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方......