加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Mybatis超具体插件机制理会,弄懂拦截器So easy

发布时间:2019-12-26 00:15:57 所属栏目:编程 来源:站长网
导读:副问题#e# 概述 Mybatis插件又称拦截器,本篇文章中呈现的拦截器都暗示插件。 Mybatis回收责任链模式,通过动态署理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认举动(诸如SQL重写之类的),因为插件会深入到Mybatis的焦点,因此在编写本身的插

假若有N个插件,就有N个署理,每个署理都要执行上面的逻辑。这内里的层层署理要多次天生动态署理,是较量影响机能的。固然能指定插件拦截的位置,但这个是在执行要领时动态判定,初始化的时辰就是简朴的把插件包装到了全部可以拦截的处所。

因此,在编写插件时需留意以下几个原则:

不编写不须要的插件;

实现plugin要领时判定一下方针范例,是本插件要拦截的工具才执行Plugin.wrap要领,否者直接返回方针自己,这样可以镌汰方针被署理的次数。

// 若是我们只要拦截Executor工具,那么我们应该这么做 

public Object plugin(final Object target) { 

  if (target instanceof Executor) { 

   return Plugin.wrap(target, this); 

  } else { 

   return target; 

  } 

Mybatis插件很强盛,可以对Mybatis框架举办很大的扩展。虽然,假如你不领略Mybatis插件的道理,开提倡来只能是模仿两可。在现实开拓进程中,我们可以参考别人写的插件。下面是一个Mybatis分页的插件,可觉得往后开拓做参考。

/** 

 * Mybatis - 通用分页插件(假如开启二级缓存必要留意) 

 */ 

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class}), 

    @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})}) 

@Log4j 

public class PageHelper implements Interceptor { 

 

  public static final ThreadLocal<Page> localPage = new ThreadLocal<Page>(); 

 

  /** 

   * 开始分页 

   * 

   * @param pageNum 

   * @param pageSize 

   */ 

  public static void startPage(int pageNum, int pageSize) { 

    localPage.set(new Page(pageNum, pageSize)); 

  } 

 

  /** 

   * 竣事分页并返回功效,该要领必需被挪用,不然localPage会一向生涯下去,直到下一次startPage 

   * 

   * @return 

   */ 

  public static Page endPage() { 

    Page page = localPage.get(); 

    localPage.remove(); 

    return page; 

  } 

 

  public Object intercept(Invocation invocation) throws Throwable { 

    if (localPage.get() == null) { 

      return invocation.proceed(); 

    } 

    if (invocation.getTarget() instanceof StatementHandler) { 

      StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); 

      MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); 

      // 疏散署理工具链(因为方针类也许被多个插件拦截,从而形成多次署理,通过下面的两次轮回 

      // 可以疏散出最原始的的方针类) 

      while (metaStatementHandler.hasGetter("h")) { 

        Object object = metaStatementHandler.getValue("h"); 

        metaStatementHandler = SystemMetaObject.forObject(object); 

      } 

      // 疏散最后一个署理工具的方针类 

      while (metaStatementHandler.hasGetter("target")) { 

        Object object = metaStatementHandler.getValue("target"); 

        metaStatementHandler = SystemMetaObject.forObject(object); 

      } 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读