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

  • 项目地址:github.com/JSQLParser/…

欢迎重视我的大众号:程序猿DD。第一时间了解前沿职业音讯、分享深度技术干货、获取优质学习资源