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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM