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

程式猿DD發表於2023-03-07

昨天在群裡看到有小夥伴問,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。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源