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