MyBatis空where拦截器

最近项目中出现了至少两次因为Mybatis的动态where条件不满足导致实际sql语句的where条件为空,进而查询全表,当数据量比较大的时候,导致OOM的情况.

如何禁止这种情况,个人觉得三种措施:

  • 1.在逻辑层面加充分的参数有效性检查;
  • 2.在where条件中如果索引条件都不满足,加上1=2这种必然失败的条件;
  • 3.Mybatis拦截器;
  • 前两种措施都是依赖人,从这个层面讲,是不靠谱的,即一个策略不是强制的,就是不靠谱的.相对而言,第三种是不依赖程序员的自觉性,是最靠谱的.乘周六有时间,实现一个简单的Mybatis拦截器来拦截where条件为空的SQL语句.

    1.实现

    先上代码,这里拦截了SqlCommandType为select,update,delete这三种类型.出现情况目前只是打日志.

  • 包括一个简单反射工具的实现:

  • /** * 反射工具 * * @author: xiaobaoqiu Date: 15-8-22 Time: 上午11:52 */
  • 2.Mybatis的Interceptor原理

    这篇文章很好的解释了Mybatis的Interceptor机制.

    mybatis读取配置再xml文件中Interceptor,通过反射构造其实例,将所有的Interceptor保存到InterceptorChain中。

    mybatis的拦截器只能代理指定的四个类:ParameterHandler、ResultSetHandler、StatementHandler以及Executor。

    参考:

    http://www.tuicool.com/articles/RbyUfu

    http://blog.csdn.net/hupanfeng/article/details/9247379

原文地址:https://www.cnblogs.com/cmfwm/p/8024520.html