前言
- 上一篇文章《mybatis-plus的插件机制》主要介绍mybatis-plus的插件流程,为后续具体插件介绍做铺垫
- 本篇主要介绍mybatis-plus的sql性能规范插件:IllegalSQLInnerInterceptor
如何使用
- 主要参考官网示例:https://baomidou.com/guide/interceptor.html#mybatisplusinterceptor
- 配置sql性能规范插件
- 执行一个不带条件的的查询就会被拦截
插件分析
- 通过上一篇文章已知,在执行SQL之前会先调用插件链
- 根据executor/statementHandler和MybatisPlusInterceptor生成一个代理类,InvocationHandler为Plugin
2.1 代理接口的生成
(1)读取MybatisPlusInterceptor的@Intercepts注解(value属性是@Signature集合)
(2)将@Signature注解的值转换为Class与Method集合的映射signatureMap
(3)如果target是signatureMap中的key,则被代理
- 执行器执行方法时,直接进入代理方法Plugin#invoke
3.1 通过下图可以看出,如果方法是MybatisPlusInterceptor拦截的对象,则执行其intercept方法
MybatisPlusInterceptor#intercept分析
IllegalSQLInnerInterceptor#beforePrepare分析
- 获取解析参数后的SQL语句
1.1 可以忽视某些SQL:InterceptorIgnoreHelper.willIgnoreIllegalSql(ms.getId())PluginUtils.MPStatementHandler mpStatementHandler = PluginUtils.mpStatementHandler(sh); BoundSql boundSql = mpStatementHandler.boundSql(); String originalSql = boundSql.getSql();
- 解析SQL:JsqlParserSupport#parserSingle
2.1 调用栈截图如下
2.2 重点关注IllegalSQLInnerInterceptor#processSelect
(1)下图发现,如果没有where条件,在断言时就返回了
总结
- 本篇文章只是基于sql性能规范插件对没有条件的拦截进行流程分析
- 后续计划注重分析具体是怎样解析SQL语句(jsqlparser)