druid解析器介绍参考:Druid SQL 解析器概览 - 邱明成 - 博客园 (cnblogs.com)
不说废话直接上代码:
maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.12</version>
</dependency>
回调接口(个人比较倾向使用这种方式):
/**
* @description 替换表名回调
* @modified By
*/
public interface IReplaceCallback {
/**
* 获取新的表名
*
* @param originTable
* @return
*/
String getNewTable(String originTable);
}
自定义Visitor
/**
* 自定义Visitor ,这里是MySQL,其他数据库请自行更换
**/
public class MyReplaceTableVisitor extends MySqlASTVisitorAdapter {
private final IReplaceCallback callback;
public MyReplaceTableVisitor(IReplaceCallback callback) {
this.callback = callback;
}
@Override
public boolean visit(SQLExprTableSource x) {
String originTableName = x.getExpr().toString();
String newTableName = callback.getNewTable(originTableName);
if (newTableName != null) {
//修改表名
x.setExpr(newTableName);
logger.debug(" replace table:" + originTableName + " -> " + newTableName);
}
return true;
}
}
实现代码:
public static String replaceTableName(String sql, IReplaceCallback callback) {
if (callback == null) {
return sql;
}
List<SQLStatement> statements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
MyReplaceTableVisitor visitor = new MyReplaceTableVisitor(callback);
for (SQLStatement stmt : statements) {
stmt.accept(visitor);
}
return SQLUtils.toSQLString(statements, JdbcConstants.MYSQL);
}
测试代码:
public static void main(String[] args) {
String sql = "select * from user where id = 1"
replaceTableName(sql , new IReplaceCallback() {
@Override
public String getNewTable(String originTable) {
//返回新的表名
return “sys_user”;
}
});
}

本文介绍了如何利用Druid的SQL解析器进行表名替换操作。通过引入Maven依赖,并定义自定义的Visitor实现,可以在运行时动态修改SQL中的表名。示例代码展示了这一过程。

3526

被折叠的 条评论
为什么被折叠?



