JAVA解析sql表别名_Java中通过druid修改sql中表名、别名

场景

在项目中如有一条查询语句,需要将其中表名所在的库名补充上(库名已知),

例如:select id from a,表a所在库叫d,那么需要修改为select id from d.a

初步思考

所以最开始打算用正则,不区分大小写的形式匹配到from+空格+不带点、不带空格的字符串,然后将第三部分替换。

有了如下代码:

private String dealSql(String sql, String dbName) {

sql = sql.replaceAll("\\s+", " ").replace(";"," ");

String result = sql;

String p = "(from)(\\s+)([^\\s]+)";

Pattern pattern = Pattern.compile(p, Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher(sql);

while (matcher.find()) {

if(matcher.groupCount() == 3) {

if(!matcher.group(3).contains(".")) {

result = matcher.replaceAll("$1$2" + dbName + ".$3");

}

}

}

return result;

}

经过测试

85aaf2f7931440bd4768bd385813e2d5.png

深入思考

貌似结果是正确的,但是由于sql不可能只有这样一种情况,还会有诸如以下形式产生:

多表查询,使用where关联selec

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是可以的。使用SQLUtils解析SQL语句后,可以通过遍历解析后的语法树,获取SQL语句名或别名信息。具体的实现方式可以参考以下代码示例: ``` import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; public class SQLParser { public static void main(String[] args) { String sql = "SELECT a.id, b.name FROM table_a a join table_b b on a.id = b.id where a.id = 1"; SQLSelect sqlSelect = (SQLSelect) SQLUtils.parseSingleStatement(sql); SQLSelectQuery sqlSelectQuery = sqlSelect.getQuery(); SQLTableSource sqlTableSource = sqlSelectQuery.getFrom(); parseTableSource(sqlTableSource); } private static void parseTableSource(SQLTableSource sqlTableSource) { if (sqlTableSource instanceof SQLJoinTableSource) { SQLJoinTableSource joinTableSource = (SQLJoinTableSource) sqlTableSource; parseTableSource(joinTableSource.getLeft()); parseTableSource(joinTableSource.getRight()); } else if (sqlTableSource instanceof SQLSubqueryTableSource) { SQLSubqueryTableSource subqueryTableSource = (SQLSubqueryTableSource) sqlTableSource; parseTableSource(subqueryTableSource.getSelect().getQuery().getFrom()); } else { SQLExpr sqlExpr = sqlTableSource.getExpr(); if (sqlExpr instanceof SQLName) { SQLName sqlName = (SQLName) sqlExpr; String tableName = sqlName.getSimpleName(); String tableAlias = sqlTableSource.getAlias(); System.out.println("Table name: " + tableName + ", alias: " + tableAlias); } else if (sqlExpr instanceof SQLIdentifierExpr) { SQLIdentifierExpr sqlIdentifierExpr = (SQLIdentifierExpr) sqlExpr; String tableName = sqlIdentifierExpr.getName(); String tableAlias = sqlTableSource.getAlias(); System.out.println("Table name: " + tableName + ", alias: " + tableAlias); } } } } ``` 在上述代码,我们首先使用SQLUtils解析SQL语句,并获取SQL语句源信息。然后,我们通过遍历源信息的语法树,逐一获取名和别名信息。对于多连接查询和子查询的情况,我们通过递归的方式进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值