首页 > 编程语言 >插件源码进一步分析与pageHelper分页插件介绍

插件源码进一步分析与pageHelper分页插件介绍

时间:2024-10-09 19:14:39浏览次数:7  
标签:插件 target Object pageHelper signatureMap 源码 User interceptor

知识回顾

上一篇 自定义MyBatis插件。我们实习了自定义插件,接下来我们先分析一下他的执行逻辑。

Plugin 实现了 InvocationHandler 接口,因此它的 invoke 方法会拦截所有的方法调用。invoke 方法会 对所拦截的方法进行检测,以决定是否执行插件逻辑。

我们看看 org.apache.ibatis.plugin.Plugin.java

public class Plugin implements InvocationHandler {
    private final Object target;
    private final Interceptor interceptor;
    private final Map<Class<?>, Set<Method>> signatureMap;

    private Plugin(Object target, Interceptor interceptor, Map<Class<?>, Set<Method>> signatureMap) {
        this.target = target;
        this.interceptor = interceptor;
        this.signatureMap = signatureMap;
    }

    public static Object wrap(Object target, Interceptor interceptor) {
        Map<Class<?>, Set<Method>> signatureMap = getSignatureMap(interceptor);
        Class<?> type = target.getClass();
        Class<?>[] interfaces = getAllInterfaces(type, signatureMap);
        return interfaces.length > 0 ? Proxy.newProxyInstance(type.getClassLoader(), interfaces, new Plugin(target, interceptor, signatureMap)) : target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            Set<Method> methods = (Set)this.signatureMap.get(method.getDeclaringClass());
            return methods != null && methods.contains(method) ? this.interceptor.intercept(new Invocation(this.target, method, args)) : method.invoke(this.target, args);
        } catch (Exception var5) {
            Exception e = var5;
            throw ExceptionUtil.unwrapThrowable(e);
        }
    }

	...
}

首先,invoke 方法会检测被拦截方法是否配置在插件的 @Signature 注解 中,若是,则执行插件逻辑,否则执行被拦截方法。插件逻辑封装在 org.apache.ibatis.plugin.Interceptor 的 intercept 方法中,该方法的参数类型为 Invocation ,主要用于存储目标类,方法以及方法参数列表。

public interface Interceptor {
    Object intercept(Invocation var1) throws Throwable;

    default Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    default void setProperties(Properties properties) {
    }
}

分页插件分享

MyBatis 可以使用第三方的插件来对功能进行扩展,分⻚助手 PageHelper 就是其中一个非常优秀的插件。它将分⻚的复杂操作进行封装,使用简单的方式即可获得带分⻚的数据。

开发步骤:

  1. 导入通用 PageHelper 的坐标

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.github.jsqlparser</groupId>
        <artifactId>jsqlparser</artifactId>
        <version>4.0</version>
    </dependency>
    
  2. 在 mybatis 核心配置文件中配置 PageHelper 插件并测试分⻚数据获取

    配置文件

    <!--注意:分⻚助手的插件 配置在通用馆mapper之前-->
    <plugin interceptor="com.github.pagehelper.PageHelper">
    <!—指定方言 —>
      <property name="dialect" value="mysql"/>
    </plugin>
    

测试:

   @Test
    public void testPageHelper() {
        //设置分⻚参数
        // PageHelper.startPage(1, 2);
        List<User> select = userMapper.findAll();
        for (User user : select) {
            System.out.println(user);
        }
    }

没有分页的结果

Total: 4
User{id=1, username='lisi'}
User{id=2, username='tom'}
User{id=8, username='测试2'}
User{id=9, username='测试3'}

分页的结果

Total: 2
User{id=1, username='lisi'}
User{id=2, username='tom'}

分页实例代码

mybatis-pager-demo

标签:插件,target,Object,pageHelper,signatureMap,源码,User,interceptor
From: https://www.cnblogs.com/tangyouwei/p/18454929/plug-in-source-code-further-analysis-and-pag

相关文章

  • 插件源码进一步分析与pageHelper分页插件介绍
    知识回顾上一篇自定义MyBatis插件。我们实习了自定义插件,接下来我们先分析一下他的执行逻辑。Plugin实现了InvocationHandler接口,因此它的invoke方法会拦截所有的方法调用。invoke方法会对所拦截的方法进行检测,以决定是否执行插件逻辑。我们看看org.apache.ibatis.plu......
  • Maven常用插件
    Maven常用插件主要介绍maven工程常用插件。1、官网查找插件官网:https://maven.apache.org/plugins/index.html2、maven-compiler-pluginhttps://maven.apache.org/plugins/maven-compiler-plugin/作用:该插件用于编译项目的源代码。<plugin><groupId>org.apache.......
  • 基于Springboot房屋租赁管理系统【附源码+文档】
    ......
  • 探讨微服务治理场景中,Sermant Backend如何管理插件动态配置
    本文分享自华为云社区《SermantBackend配置管理功能在微服务治理场景中的应用》,作者:华为云开源。一、背景Sermant是基于Java字节码增强技术的无代理服务网格,业务应用通过JavaAgent的方式将Sermant挂载至目标进程中。其中动态配置是Sermant框架中的关键能力,它能够在微服务挂载Se......
  • MyBatis-Plus 的核心插件及其使用介绍
    MyBatis-Plus是基于MyBatis的增强工具,为简化MyBatis的开发提供了诸多功能扩展。它的目标是减少重复代码、提高开发效率,提供了CRUD(Create,Read,Update,Delete)操作的简化方法以及多种实用插件。以下是MyBatis-Plus的核心插件及其使用介绍:1.分页插件(PaginationInt......
  • 基于nodejs+vue移动购物管家app[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着移动互联网技术的迅猛发展,智能手机已成为人们日常生活中不可或缺的一部分。在这一背景下,移动购物逐渐取代了传统购物方式,成为现代消费的主流模式。消费......
  • 基于nodejs+vue移动互联时代的设备管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,各类智能设备在日常生产和生活中的应用日益广泛。从智能手机到可穿戴设备,从工业控制设备到智能家居系统,这些设备极大地提升了......
  • 基于nodejs+vue颐心家政服务网站[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快,越来越多的家庭面临着时间管理和家务分配的挑战。传统的家政服务虽然在一定程度上缓解了这一压力,但信息不对称、服务质量参差不齐、......
  • 【源码+文档+调试讲解】基于安卓的小餐桌管理系统springboot框架
    摘 要相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低运营人员成本,实现了小餐桌的标准化、制度化、程序化的管理,有效地防止了小餐桌的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正餐桌信息、餐桌预订、入座信息、菜品信息、点餐信息、书籍......
  • 基于nodejs+vue易逛漫展[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着动漫文化的日益普及,漫展作为一种集动漫展示、互动体验、商品交易于一体的综合性文化活动,受到了广大动漫爱好者的热烈追捧。然而,传统的漫展参与方式往往......