mybatis-plus插件机制之sql性能规范插件介绍

前言

  1. 上一篇文章《mybatis-plus的插件机制》主要介绍mybatis-plus的插件流程,为后续具体插件介绍做铺垫
  2. 本篇主要介绍mybatis-plus的sql性能规范插件:IllegalSQLInnerInterceptor

如何使用

  1. 主要参考官网示例:https://baomidou.com/guide/interceptor.html#mybatisplusinterceptor
  2. 配置sql性能规范插件
    在这里插入图片描述
  3. 执行一个不带条件的的查询就会被拦截
    在这里插入图片描述

插件分析

  1. 通过上一篇文章已知,在执行SQL之前会先调用插件链
    在这里插入图片描述
  2. 根据executor/statementHandler和MybatisPlusInterceptor生成一个代理类,InvocationHandler为Plugin
    2.1 代理接口的生成
    (1)读取MybatisPlusInterceptor的@Intercepts注解(value属性是@Signature集合)
    (2)将@Signature注解的值转换为Class与Method集合的映射signatureMap
    (3)如果target是signatureMap中的key,则被代理
    在这里插入图片描述
    在这里插入图片描述
  3. 执行器执行方法时,直接进入代理方法Plugin#invoke
    3.1 通过下图可以看出,如果方法是MybatisPlusInterceptor拦截的对象,则执行其intercept方法
    在这里插入图片描述

MybatisPlusInterceptor#intercept分析

在这里插入图片描述

IllegalSQLInnerInterceptor#beforePrepare分析

在这里插入图片描述

  1. 获取解析参数后的SQL语句
    1.1 可以忽视某些SQL:InterceptorIgnoreHelper.willIgnoreIllegalSql(ms.getId())
    	PluginUtils.MPStatementHandler mpStatementHandler = PluginUtils.mpStatementHandler(sh);
    	BoundSql boundSql = mpStatementHandler.boundSql();
    	String originalSql = boundSql.getSql();	
    
  2. 解析SQL:JsqlParserSupport#parserSingle
    2.1 调用栈截图如下
    在这里插入图片描述
    2.2 重点关注IllegalSQLInnerInterceptor#processSelect
    (1)下图发现,如果没有where条件,在断言时就返回了
    在这里插入图片描述

总结

  1. 本篇文章只是基于sql性能规范插件对没有条件的拦截进行流程分析
  2. 后续计划注重分析具体是怎样解析SQL语句(jsqlparser)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值