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