🐒个人主页:信计2102罗铠威
🏅JavaEE系列专栏
📖前言:
由于某个项目需要解析从前端传过来的SQL信息,我在网上找了好多方法,发现网上各种通过正则表达式解析SQL的代码,超级麻烦而且Bug还多,还有一个是JsqlParser,对想快速实现sql解析功能的小伙伴们入门不友好。最后我使用com.alibaba.druid依赖解析sql语句,特别简洁高效,在这里讲解一下~
🎀 maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
🎀 代码(后面是详解~)
public static void main(String[] args) {
String sql = "select a.prime_id, b.prime_id from adt_admit_discharges a full join mr_main b on a.visit_id = b.visit_id where a.visit_id is null";
parse(sql);
}
public static void parse(String sql) {
SQLStatementParser parser = new MySqlStatementParser(sql);
SQLStatement sqlStatement = parser.parseStatement();
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
sqlStatement.accept(visitor);
//todo 上面四行就是对sql进行解析,然后存储到了visitor中(可以打断点跟踪一下)
Map<TableStat.Name, TableStat> tables = visitor.getTables();//获取sql中的表名
Collection<TableStat.Column> columns = visitor.getColumns();//获取sql中的列名【Column这个是重点】
//打印操作
List<String> allColumnName = new ArrayList<>();
List<String> allTableName = new ArrayList<>();
for (TableStat.Name t : tables.keySet()) {
allTableName.add(t.getName());
}
for (TableStat.Column c : columns) {
if (!c.isWhere()&&!c.isJoin()){//不是where和join的列字段打印出来
allColumnName.add(c.getName());
}
}
System.out.println(allTableName);//所有表名
System.out.println(allColumnName);//不是where和join的列字段打印出来
}
🎀 关于TableStat.Column的详解
这个是封装sql中出现的所有字段信息以及对应的表关系