开发者社区> 问答> 正文

拦截 druid 执行的 sql, 怎么改变执行的表

使用 druid 的过滤器拦截 sql, 比如

update a set b='a' where id=1

我想把 a 换成 f 修改了 但是不起作用,
image.png

展开
收起
OSC开源社区 2024-06-16 08:20:07 110 0
1 条回答
写回答
取消 提交回答
  • 首先,你需要创建一个类,继承自com.alibaba.druid.filter.Filter,并重写相关的方法,比如initdoFilterdestroy。在doFilter方法中,你可以获取到SQL语句并进行修改。

    import com.alibaba.druid.filter.FilterAdapter;
    import com.alibaba.druid.proxy.jdbc.StatementProxy;
    import com.alibaba.druid.sql.parser.ParserException;
    import com.alibaba.druid.sql.parser.SQLParserUtils;
    import com.alibaba.druid.sql.parser.SQLStatementParser;
    
    public class TableNameRewriteFilter extends FilterAdapter {
    
        @Override
        public void doFilter(StatementProxy statementProxy, FilterChain chain) throws SQLException {
            String originalSql = statementProxy.getSql();
            // 修改SQL语句,替换表名
            String modifiedSql = rewriteTableName(originalSql);
            statementProxy.setSql(modifiedSql);
            chain.doFilter(statementProxy);
        }
    
        private String rewriteTableName(String sql) {
            try {
                SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, "mysql");
                SQLStatement sqlStatement = parser.parseStatement();
                // 在这里处理SQL语句,替换表名
                // ...
                return sqlStatement.toSQL();
            } catch (ParserException e) {
                throw new SQLException("Parse SQL failed", e);
            }
        }
    }
    
    2024-06-16 11:12:11
    赞同 1 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载