springboot引入druid解析sql的过程
更新时间:2023年08月22日 15:15:46 作者:夜空下的星
在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析,需要的朋友可以参考下
一、前言
在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析。
二、引入相关maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>三、通过工具类SqlUtils实现对SQL的解析。
public class QualitySqlUtils {
/**
* 根据sql及数据源类型获取表名
*/
public static List<String> getSelectSqlTable(String sql, String dbType) {
List<String> tableList = new ArrayList<>();
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
SchemaStatVisitor visitor;
for (SQLStatement sqlStatement : stmtList) {
if (DbType.mysql.name().equalsIgnoreCase(dbType)) {
visitor = new MySqlSchemaStatVisitor();
} else if (DbType.hive.name().equalsIgnoreCase(dbType)) {
visitor = new HiveSchemaStatVisitor();
} else if (DbType.postgresql.name().equalsIgnoreCase(dbType)) {
visitor = new PGSchemaStatVisitor();
} else if (DbType.oracle.name().equalsIgnoreCase(dbType)) {
visitor = new OracleSchemaStatVisitor();
} else {
visitor = new SchemaStatVisitor(DbType.of(dbType));
}
sqlStatement.accept(visitor);
Map<TableStat.Name, TableStat> tables = visitor.getTables();
for (Map.Entry<TableStat.Name, TableStat> entry: tables.entrySet()){
String value = entry.getValue().toString();
if (StringUtils.isNotBlank(value)) {
tableList.add(entry.getKey().getName());
}
}
}
return tableList;
}
/**
* 根据sql获取查询的字段
*/
public static Map<String, String> getSelectSqlColumn(String sql, String dbType) {
Map<String, String> columnMap = new HashMap<>();
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
for (int i = 0; i < stmtList.size(); i++) {
SQLStatement stmt = stmtList.get(i);
if (stmt instanceof SQLSelectStatement) {
SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) stmt;
SQLSelect select = sqlSelectStatement.getSelect();
SQLSelectQueryBlock query = (SQLSelectQueryBlock) select.getQuery();
List<SQLSelectItem> selectList = query.getSelectList();
selectList.forEach(item->{
columnMap.put(item.getExpr().toString(), item.getAlias());
});
}
}
return columnMap;
}
}三、测试结果
public class testDemo{
public static void main(String[] args) {
String sql = "select t.* from table1 as t left join table2 t2 on t.id = t2.id";
List<String> tableList =getSelectSqlTable(sql, "mysql");
System.out.println("获取到的表名: "+tableList);
}
}运行结果如下:

到此这篇关于springboot引入druid解析sql的文章就介绍到这了,更多相关springboot引入druid内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java中的system.getProperty()的作用及使用方法
System.getProperty() 方法用于获取系统属性的值,该方法接受一个字符串参数,表示要获取的系统属性的名称,返回值为字符串类型,表示该属性的值,接下来通过本文给大家介绍Java中的system.getProperty()的作用及使用方法,感兴趣的朋友跟随小编一起看看吧2023-05-05
springboot vue接口测试前后端实现模块树列表功能
这篇文章主要为大家介绍了springboot vue接口测试前后端实现模块树列表功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-05-05


最新评论