MyBatis自定义插件开发

我不是女神ヾ 2023-07-20 10:55 103阅读 0赞

插件的原理:

1.每个创建出来的对象都不是直接返回

  1. interceptorChain.pluginAll(parameterHandler);

2.获取到所有的Interceptor(拦截器)(插件需要实现的接口)

  1. 调用interceptor.plugin(target);返回target包装后的对象

3.插件机制,我们可以使用插件为目标对象创建一个代理对象,AOP(面向切面)

  • 我们的插件可以为四大对象创建出代理对象
    代理对象就可以拦截到四大对象的每一个执行。

    public Object pluginAll(Object target) {

    1. for (Interceptor interceptor : interceptors) {
    2. target = interceptor.plugin(target);
    3. }
    4. return target;

    }

自定义拦截器的步骤:
1.编写拦截器

  1. public class MyFirstPlugin implements Interceptor {
  2. /** * 拦截目标对象方法的执行 * @param invocation * @return * @throws Throwable */
  3. @Override
  4. public Object intercept(Invocation invocation) throws Throwable {
  5. System.out.println("MyFirstPlugin...intercept"+invocation.getMethod());
  6. //动态的改变一下sql运行的参数,以前1号学生,实际查询5号学生
  7. Object target = invocation.getTarget();
  8. // System.out.println("当前拦截到的对象"+invocation.getTarget());
  9. //拿到StatementHandler==>ParameterHandler==>parameterObject
  10. //拿到target的元数据
  11. MetaObject metaObject = SystemMetaObject.forObject(target);
  12. Object value = metaObject.getValue("parameterHandler.parameterObject");
  13. // System.out.println("sql语句用的参数是"+value);
  14. //修改完sql语句要执行的参数
  15. metaObject.setValue("parameterHandler.parameterObject",5);
  16. //放行的方法
  17. Object proceed = invocation.proceed();
  18. return proceed;
  19. }
  20. /** * 包装目标对象,将增强的对象和拦截器包装起来并返回 * @param target * @return */
  21. @Override
  22. public Object plugin(Object target) {
  23. System.out.println("MyFirstPlugin..plugin:mybatis将要包装的对象"+target);
  24. //我们可以借助Plugin的wrap方法来使用当前Interceptor包装我们的目标对象
  25. Object wrap = Plugin.wrap(target, this);
  26. //返回当前target创建的动态代理
  27. return wrap;
  28. }
  29. /** * 将插件注册时的property属性 * @param properties */
  30. @Override
  31. public void setProperties(Properties properties) {
  32. // System.out.println("插件配置的信息");
  33. }
  34. }

2.编写 签名注解

  1. /** * 完成插件签名: * 告诉Mybatis当前插件用来拦截哪个对象的哪个方法 */
  2. @Intercepts(
  3. {
  4. @Signature(type = StatementHandler.class,
  5. method = "parameterize",args = java.sql.Statement.class)
  6. })

3.配置

  1. <plugins>
  2. <!-- 分页插件-->
  3. <plugin interceptor="com.github.pagehelper.PageInterceptor">
  4. <!--<!– config params as the following –>-->
  5. <!--<property name="dialect" value="mysql"/>-->
  6. <property name="reasonable" value="true"/>
  7. <!--<property name="dialect" value="mysql"/>-->
  8. </plugin>
  9. <plugin interceptor="com.itt.plugins.MyFirstPlugin">
  10. <property name="username" value="root"/>
  11. <property name="password" value="123456"/>
  12. </plugin>
  13. </plugins>
  • 测试
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg5MzA4NQ_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读