昨天在群里看到有小伙伴问,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 等。
- 我的项目地址:https://github.com/JSQLParser/JSqlParser
欢送关注我的公众号:程序猿 DD。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源