【mybatis】拦截sql语句进行替换指定字段

想请教大家一下,在使用mybatis时,有个需求是根据某标志位将动态产生的sql某些字段进行替换,例如 dao.query("dao.TestSettingMapper.qryData",param)
这个方法本来正常执行的sql是
“select a1,a2,a3 from tmp where id=001”,
但当param中flag=“special”时,希望产生的sql是
“select b1,b2,b3 from tmp where id=001”
这样 ,我想到是用aop去拦截,在方法拦截里抓出sql去替换,代码大致这样:

public Object invoke(MethodInvocation invocation) throws Throwable {

    
    Object[] arguments = invocation.getArguments();

    String sql_id = (String) arguments[0];//sql_id
    Map<String, Object> mParam = (Map<String, Object>) arguments[1];//参数
    //获取到sql
    String sql = mSessionFactory.getConfiguration().getMappedStatement(sql_id)

.getBoundSql(mParam).getSql();

    if("special"){
    //进行字符替换操作
    ...
    }

}
问题就在于我通过getBoundSql方法获取的sql没想到是含有通配符方式的,这样子就与入参匹配不到了,想请教大家怎么把带有通配符的sql语句再转成mybatis可以识别的写法,或者有没有更理想的方法,可以去拦截替换sql中字段?

阅读 5k
1 个回答

你这个是拦截处理返回结果了,如果想修改 sql 还是需要在 prepare 的时候处理
参考地址
https://blog.csdn.net/qq_2220...

不过我觉得你可以思考一下你当前的设计,虽然拦截器可以解决你当前遇到的问题,但是你这种实现方式有一些奇怪。看是否有其他方式解决你这个问题。不然后面看代码的人不能通过代码看到设计,却有一个隐患。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题