• 简述 Mybatis 的插件运行原理,如何编写⼀个插件


    运行原理:

    Mybatis 只⽀持针对 ParameterHandler ResultSetHandler StatementHandler Executor 4 种接⼝的插件

    Mybatis 使⽤ JDK 的动态代理 为需要拦截的接⼝⽣成代理对象以实现接⼝⽅法拦截功能


    每当执⾏这 4 种接⼝对象的⽅法时,就会进⼊拦截⽅法,具体就是 InvocationHandler invoke()⽅法, 拦截那些你指定需要拦截的⽅法。

    编写插件:

    实现 Mybatis 的 Interceptor 接⼝复写 intercept ()⽅法, 然后在给插件编写注解, 指定
    要拦截哪⼀个接⼝的哪些⽅法即可, 在配置⽂件中配置编写的插件
    1. package com.tutu;
    2. import org.apache.ibatis.executor.Executor;
    3. import org.apache.ibatis.mapping.MappedStatement;
    4. import org.apache.ibatis.plugin.*;
    5. import org.apache.ibatis.session.ResultHandler;
    6. import org.apache.ibatis.session.RowBounds;
    7. import java.lang.reflect.Method;
    8. import java.util.Properties;
    9. /**
    10. * @Author: Hike
    11. * @Date: 2022/8/6 12:45
    12. * 你可以忘掉失败,但不能忘掉教训
    13. * 注解声明mybatis当前插件拦截哪个对象的哪个方法
    14. * type表示要拦截的目标对象 Executor.class StatementHandler.class ParameterHandler.class
    15. ResultSetHandler.class
    16. * method表示要拦截的方法,
    17. * args表示要拦截方法的参数
    18. */
    19. @Intercepts({
    20. @Signature(type = Executor.class, method = "query",
    21. args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
    22. public class TestUpdateMybatisIntercepter implements Interceptor {
    23. /**
    24. * 拦截目标对象的目标方法执行
    25. *
    26. * @param invocation
    27. * @return
    28. * @throws Throwable
    29. */
    30. @Override
    31. public Object intercept(Invocation invocation) throws Throwable {
    32. //被代理对象
    33. Object target = invocation.getTarget();
    34. //代理方法
    35. Method method = invocation.getMethod();
    36. //方法参数
    37. Object[] args = invocation.getArgs();
    38. // do something ...... 方法拦截前执行代码块
    39. //执行原来方法
    40. Object result = invocation.proceed();
    41. // do something .......方法拦截后执行代码块
    42. return result;
    43. }
    44. /**
    45. * 包装目标对象:为目标对象创建代理对象
    46. *
    47. * @param target
    48. * @return
    49. */
    50. @Override
    51. public Object plugin(Object target) {
    52. System.out.println("MySecondPlugin为目标对象" + target + "创建代理对象");
    53. //this表示当前拦截器,target表示目标对象,wrap方法利用mybatis封装的方法为目标对象创建代理对象(没有拦截的对象会直接返回,不会创建代理对象)
    54. Object wrap = Plugin.wrap(target, this);
    55. return wrap;
    56. }
    57. /**
    58. * 设置插件在配置文件中配置的参数值
    59. *
    60. * @param properties
    61. */
    62. @Override
    63. public void setProperties(Properties properties) {
    64. System.out.println(properties);
    65. }
    66. }

     

  • 相关阅读:
    亚马逊、eBay、wish、Lazada、shoppe和mercari如何降低测评成本提高测评效率?
    TreeSet和HashSet
    1161 Merging Linked Lists – PAT甲级真题
    01背包面试题系列(一)
    机器学习笔记之支持向量机(二)引出对偶问题
    python绑定游戏窗口模拟键盘鼠标操作方法64位32位通用
    Android Compose 入门,深入底层源码分析
    linux的date 显示非当前时间、date 设置系统时间、ntpdate命令
    猿创征文|瑞吉外卖——管理端_菜品管理_2
    使用OpenTelemetry进行监控
  • 原文地址:https://blog.csdn.net/m0_70734549/article/details/126192988