1,概念
1) SQL 解析器
用于处理 SQL 查询语句的解析和分析。
场景:
- 数据库客户端开发,解析用户输入的sql语法并执行。
- 自定义sql解析和执行逻辑。
标准的数据库接口(如 JDBC)无法完全满足需求时,自定义执行逻辑,以实现更复杂的功能。 - 实现数据库查询优化器
- 自定义SQL 分析工具
对大量的 SQL 查询进行分析,以了解查询的模式、性能瓶颈等 - 实现 SQL 注入检测工具
解析用户输入的 SQL 查询,并检测其中是否包含潜在的注入漏洞。
2,jsqlparser
sql解析库,收费:官网
将 SQL 语句解析为 Java 对象表示形式,使得可以轻松地对 SQL 进行分析、修改和生成。JSqlParser 支持多种 SQL 方言,包括 ANSI SQL、MySQL、Oracle 等。
1)使用
<!-- sql解析 工具 jsqlparser -->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.4</version>
</dependency>
// SQL解析
// 解析为Statement的具体实现:Selete Update Delete,可以通过 if(statement instanceof Select)判断;
Statement statement = CCJSqlParserUtil.parse(sql);
Select select = (Select) statement;
//select 的field获取
List<String> selectList = new ArrayList<>();
//order获取
final String[] order = {""};
//分页获取
final String[] page = {""};
select.getSelectBody().accept(new SelectVisitorAdapter(){
//此处有多个实现方法;
//PlainSelect是单个简单的select查询语句,可以包含SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、JOIN;
//ValuesStatement 表示值数组,表示 INSERT, REPLACE 或 MERGE语句;
//SetOperationList 表示多个查询结果集之间的合并操作,包括: UNION(并集)、INTERSECT(交集)和EXCEPT(差集)。另外常规的PlainSelect中如果先limit再order by,会被识别为SetOperationList
//WithItem 包含WITH子句、带有别名(alias)子查询
@Override
public void visit(PlainSelect plainSelect) {
plainSelect.getSelectItems().forEach(x -> selectList.add(x.toString()));
//where条件获取
plainSelect.getWhere().toString();
//group获取
plainSelect.getGroupBy().toString()
order[0] = plainSelect.getOrderByElements().stream().map(x -> x.getExpression().toString() + " " + (x.isAsc() ? "asc" : "desc")).collect(Collectors.joining(","));
String limit = plainSelect.getLimit().getRowCount().toString();
order[0] += " limit " + limit;
String offset = plainSelect.getOffset().getOffset().toString();
order[0] += " offset " + offset;
}
});
// 获取到表名列表
List<String> tableNameList = tablesNamesFinder.getTableList(statement);
3,druid
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
4,ANTLR(Another Tool for Language Recognition)
语言识别器生成器,可以用于构建解析器和编译器。
5,Apache Calcite
开源的 SQL 解析、优化和查询引擎。可以将 SQL 转换为抽象语法树(AST),从而进行进一步的查询优化和执行计划生成。
6,SQLJocky
主要用于与 MySQL 数据库进行交互。