MyBatis中MapperProxy类中的isDefaultMethod方法的作用及接口的default方法

在MapperProxy类中的isDefaultMethod方法的作用?

因为JDK1.8的新特性 接口中可以定义默认方法,是为了解耦,因为过去接口的方法器实现了都需要重写,对于接口的修改就变得复杂和难,所以引入了default默认实现方法,也就是说只需要在接口中定义了default修饰的方法,其子类不需要去重写也可以使用。

interface InterfaceA {
    default void foo() {
        System.out.println("InterfaceA foo");
    }
}

而MyBatis中的isDefaultMethod()方法就是用来过滤Mapper接口中的default方法的,应为MyBatis这个框架只是为了动态代理Mapper接口从而获取到对于需要执行的sql语句,而MapperProxy这个代理触发类的invoke方法中只是为了拿到sql语句(至于原理,可以去学习一下MyBatis的源码),而并不会真正的执行方法。但是如果用户执行的是接口中的default方法的话,MyBatis就需要为用户提供正常的代理流程。

MapperProxy类的invoke方法

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    try {
      if (Object.class.equals(method.getDeclaringClass())) {
        return method.invoke(this, args);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis MapperProxy 的 invoke 方法是一个用来执行 SQL 语句的方法。它通过反射来调用接口声明的方法,并将参数传递给 SQL 语句,然后执行该 SQL 语句并返回结果。 invoke 方法作用是将接口方法的调用转化为对底层数据库的调用。 ### 回答2: MybatisMapperProxyMybatis框架用于代理Mapper接口的类,它的invoke方法是用来处理Mapper接口方法调用的。 MapperProxy的invoke方法会接收到代理对象的方法调用,并且包装成一个MapperMethod对象,然后通过SqlSession的selectOne、selectList、update、insert和delete等方法来执行SQL语句。 在invoke方法,首先会判断方法是否为Object类的方法(如toString、hashCode等),如果是,则直接调用代理对象的相应方法。 接下来,会从configuration获取到对应的MapperMethod对象,并且将方法调用相关的参数传递给MapperMethod对象的execute方法MapperMethod的execute方法会根据方法调用的类型(查询、更新、插入或删除),调用相应的SQL语句执行方法。 在执行SQL语句之前,还会对参数进行处理。对于查询方法,会根据方法参数是否含有RowBounds和ResultHandler参数,来决定是否使用分页查询和结果处理器。 执行SQL语句后,会根据返回结果的类型,调用相应的处理方法。对于查询方法,会判断是否需要延迟载结果,如果需要,则封装成代理对象返回。 最后,在invoke方法,会根据MapperMethod的返回类型,将执行结果返回给调用者。 总的来说,MybatisMapperProxy的invoke方法主要是根据方法的调用类型,来获取对应的MapperMethod对象,并且将方法调用的参数传递给MapperMethod对象的execute方法,最后返回执行结果给调用者。 ### 回答3: MybatisMapperProxy是一个动态代理类,用于实现Mapper接口方法调用。其核心方法是invoke方法。 invoke方法首先判断被调用的方法是否为Object类中方法,如果是,则直接调用原始对象的方法。这是为了避免代理对象自身的方法调用被拦截。 接着,invoke方法根据被调用的方法所属的类和方法名,从MapperRegistry获取对应的MappedStatement对象。MappedStatement包含了定义在Mapper接口方法上的注解信息,以及与之对应的SQL语句。 然后,invoke方法根据MappedStatement的配置信息,决定执行查询、插入、更新、删除等具体操作。 在执行操作前,invoke方法会利用MapperMethod对象解析方法参数,并将参数与SQL语句的占位符进行匹配,生成完整的SQL语句。 接下来,invoke方法会调用SqlSession的相关方法,执行SQL语句,并将执行结果返回给调用者。 最后,invoke方法会根据MapperMethod的配置信息,将返回结果进行适配,转化为最终的返回值。 值得一提的是,MybatisMapperProxy是基于JDK动态代理实现的,它将Mapper接口方法的调用转发给SqlSession对象进行处理。这样的设计使得Mybatis能够实现面向接口编程,并将代码的SQL语句与Java逻辑进行解耦。 总之,MybatisMapperProxy的invoke方法是实现Mapper接口方法调用的核心逻辑,通过动态代理在运行时生成代理对象,并通过SqlSession完成具体的数据库操作。它为Mybatis提供了强大的灵活性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值