需求
给一个SQL,需要解析出涉及到的数据表的名称
解决方法
方法一:druid
如何使用
最强的方法,基于druid的SQL解析功能获取表的名称
开始的时候感觉很垃圾,以为只能识别很简单的SQL语句里面的表。后来发现是自己用错了,完整代码如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.19</version>
</dependency>
public String getTableName(String sql) {
String dbType = JdbcConstants.MYSQL;
// 格式化输出
String format = SQLUtils.format(sql, dbType);
System.out.println(format);
List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, dbType);
// 独立语句的个数
int size = sqlStatements.size();
System.out.println(size);
StringBuilder stringBuilder = new StringBuilder();
for (SQLStatement stmt : sqlStatements) {
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmt.accept(visitor);
stringBuilder.append(visitor.getTables.keyset()).append(" ");
}
return stringBuilder.toString();
}
Druid Visitor原理分析
原理我还没有深刻理解,先放在这里
参考:
zhuanlan.zhihu.com/p/411029742
blog.51cto.com/u_15064626/… (详细)
方法二
使用Jsqlparser从复杂SQL语句中提取表名_java_码云网 (findsrc.com)