Java ,druid1.2.8 解析sql,并通过 feign接口查询到的表元数据,替换包含left join 的select sql语句中的*,支持mysql、hive、postgresql、oracle等多种数据库
时间: 2023-07-16 13:13:53 浏览: 209
可以使用druid的SQLParser类来解析sql语句,然后通过JDBC或者Feign接口获取表的元数据信息,最后替换select语句中的*。
以下是一个示例代码:
```java
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.util.JdbcConstants;
import java.util.List;
public class SQLParserDemo {
public static void main(String[] args) {
String sql = "select t1.*, t2.name from table1 t1 left join table2 t2 on t1.id = t2.id";
String dbType = JdbcConstants.MYSQL;
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSelectStatement selectStmt = (SQLSelectStatement) stmtList.get(0);
SQLExpr selectList = selectStmt.getSelect().getFirst();
if (selectList instanceof SQLIdentifierExpr && ((SQLIdentifierExpr) selectList).getName().equals("*")) {
// 获取表的元数据信息并替换select语句中的*
// TODO: 通过JDBC或者Feign接口获取表的元数据信息
}
String newSql = SQLUtils.toSQLString(stmtList, dbType);
System.out.println(newSql);
}
}
```
上述示例代码中,我们首先使用druid的SQLParser类解析了一条select语句,然后获取了select语句中的selectList,如果selectList是一个*,则可以通过JDBC或者Feign接口获取表的元数据信息,并替换select语句中的*。最后我们使用SQLUtils.toSQLString方法将修改后的SQL语句转换为字符串并输出。
阅读全文