最近项目中出现了至少两次由于Mybatis的动态where条件不知足致使实际sql语句的where条件为空,进而查询全表,当数据量比较大的时候,致使OOM的状况.程序员
如何禁止这种状况,我的以为三种措施:sql
前两种措施都是依赖人,从这个层面讲,是不靠谱的,即一个策略不是强制的,就是不靠谱的.相对而言,第三种是不依赖程序员的自觉性,是最靠谱的.乘周六有时间,实现一个简单的Mybatis拦截器来拦截where条件为空的SQL语句.mybatis
先上代码,这里拦截了SqlCommandType为select,update,delete这三种类型.出现状况目前只是打日志.工具
包括一个简单反射工具的实现:ui
这篇文章很好的解释了Mybatis的Interceptor机制.spa
mybatis读取配置再xml文件中Interceptor,经过反射构造其实例,将全部的Interceptor保存到InterceptorChain中。.net
mybatis的拦截器只能代理指定的四个类:ParameterHandler、ResultSetHandler、StatementHandler以及Executor。3d
参考:代理