使用Druid的SqlParser解析sql语句

d

解析sql
public Map<Integer, String> parseSql(String sql, DbType dbType) {
        List<SQLStatement> statementList = SQLUtils.parseStatements(sql, dbType);
        Map<Integer, String> sqlMap = new HashMap<Integer,String>();
        for (SQLStatement stmt : statementList) {
            if (stmt instanceof SQLInsertStatement) {
                SQLInsertStatement insertStatement = (SQLInsertStatement) stmt;
                List<SQLInsertStatement.ValuesClause> valuesClauses = insertStatement.getValuesList();
                for (int i = 0; i < insertStatement.getColumns().size(); i++) {
                    String columnName = insertStatement.getColumns().get(i).toString();
                    SQLExpr columnValue = valuesClauses.get(0).getValues().get(i);
                    sqlMap.put(i,columnName);
                }
            }
        }
        return sqlMap;
    }
变更sql
public static void main(String[] args) {
        String sql ="INSERT INTO student  ( user_name, email )  VALUES  ( ?,? )";

        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, DbType.mysql);

        for (SQLStatement stmt : stmtList) {
            if (stmt instanceof SQLInsertStatement) {
                SQLInsertStatement insert = (SQLInsertStatement) stmt;
                // 添加字段和值

                insert.addColumn(SQLUtils.toSQLExpr("user_name_1", DbType.mysql));
                // 创建新的值子句
                SQLInsertStatement.ValuesClause values = insert.getValues();

                values.addValue(SQLUtils.toSQLExpr("?", DbType.mysql));

                // 输出修改后的SQL语句
                String modifiedSql = SQLUtils.toMySqlString(insert);

                System.out.println(modifiedSql);

            }
        }
    }
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid是一款数据库连接池和监控平台,可以对SQL进行解析,帮助我们实现血缘关系计算。 首先,需要在项目中引入Druid的相关依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency> ``` 接着,我们可以通过Druid提供的`Parser`类来解析SQL语句: ```java import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; public class SqlParser { public static void parseSql(String sql) { // 解析SQL,获取AST MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseStatement(); // 获取查询语句部分 SQLSelectStatement selectStatement = (SQLSelectStatement)statement; // 获取AST中的表名和列名 SchemaStatVisitor visitor = new SchemaStatVisitor(); selectStatement.accept(visitor); System.out.println(visitor.getColumns()); System.out.println(visitor.getTables()); } } ``` 以上代码中,我们首先使用`MySqlStatementParser`类解析SQL语句,然后通过`SchemaStatVisitor`访问AST中的表名和列名,从而获取血缘关系。 需要注意的是,Druid只能解析SQL语句,无法在运行时获取真实的数据表和列名,因此我们需要在代码中手动指定表和列的信息,以便进行血缘关系计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值