java 解析sql语句中所有的表名称
maven依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
测试代码
/**
* @author chongmengzhao
* @version 0.1
* @date 2021/5/6 10:00
* @Description TODO
*/
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
import java.util.List;
/**
* 基于Druid的sql解析功能,获取表名
*/
public class DruidUtil {
public static void main(String[] args) {
String sql = "select * from Outvisit l\n" +
"left join patient p on l.patid=p.patientid\n" +
"join patstatic c on l.patid=c.patid inner join patphone ph on l.patid=ph.patid\n" +
"where l.name='kevin' and exsits(select 1 from pharmacywestpas p where p.outvisitid=l.outvisitid)\n" +
"union all\n" +
"select * from invisit v ";
DbType dbType = JdbcConstants.MYSQL;
//格式化输出
String result = SQLUtils.format(sql, dbType);
System.out.println(result); // 缺省大写格式
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
//解析出的独立语句的个数
System.out.println("size is:" + stmtList.size());
for (int i = 0; i < stmtList.size(); i++) {
SQLStatement stmt = stmtList.get(i);
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmt.accept(visitor);
//获取表名称
System.out.println("Tables : " + visitor.getTables());
}
}
}
测试结果