mybatis的ParamNameResolver参数名称解析

 更新时间:2023年08月28日 09:50:46   作者:codecraft  
这篇文章主要为大家介绍了mybatis的ParamNameResolver参数名称解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

在mybatis的interceptor获取MapperMethod.ParamMap这种参数类型时,经常会多出param1,param2,collection,list,array这些参数,这些不是接口自己定义的,而是ParamNameResolver自动添加的

ParamNameResolver

org/apache/ibatis/reflection/ParamNameResolver.java

public class ParamNameResolver {
  public static final String GENERIC_NAME_PREFIX = "param";
  /**
   * <p>
   * A single non-special parameter is returned without a name.
   * Multiple parameters are named using the naming rule.
   * In addition to the default names, this method also adds the generic names (param1, param2,
   * ...).
   * </p>
   *
   * @param args
   *          the args
   * @return the named params
   */
  public Object getNamedParams(Object[] args) {
    final int paramCount = names.size();
    if (args == null || paramCount == 0) {
      return null;
    } else if (!hasParamAnnotation && paramCount == 1) {
      Object value = args[names.firstKey()];
      return wrapToMapIfCollection(value, useActualParamName ? names.get(0) : null);
    } else {
      final Map<String, Object> param = new ParamMap<>();
      int i = 0;
      for (Map.Entry<Integer, String> entry : names.entrySet()) {
        param.put(entry.getValue(), args[entry.getKey()]);
        // add generic param names (param1, param2, ...)
        final String genericParamName = GENERIC_NAME_PREFIX + (i + 1);
        // ensure not to overwrite parameter named with @Param
        if (!names.containsValue(genericParamName)) {
          param.put(genericParamName, args[entry.getKey()]);
        }
        i++;
      }
      return param;
    }
  }
  //......
}

getNamedParams方法针对单个参数没有加@Param的场景会调用wrapToMapIfCollection,其他的则使用param1,param2这种,这里用了contains,也就是如果本身命名就有包含param1,param2这种则不会添加

wrapToMapIfCollection

org/apache/ibatis/reflection/ParamNameResolver.java

/**
   * Wrap to a {@link ParamMap} if object is {@link Collection} or array.
   *
   * @param object a parameter object
   * @param actualParamName an actual parameter name
   *                        (If specify a name, set an object to {@link ParamMap} with specified name)
   * @return a {@link ParamMap}
   * @since 3.5.5
   */
  public static Object wrapToMapIfCollection(Object object, String actualParamName) {
    if (object instanceof Collection) {
      ParamMap<Object> map = new ParamMap<>();
      map.put("collection", object);
      if (object instanceof List) {
        map.put("list", object);
      }
      Optional.ofNullable(actualParamName).ifPresent(name -> map.put(name, object));
      return map;
    } else if (object != null && object.getClass().isArray()) {
      ParamMap<Object> map = new ParamMap<>();
      map.put("array", object);
      Optional.ofNullable(actualParamName).ifPresent(name -> map.put(name, object));
      return map;
    }
    return object;
  }

wrapToMapIfCollection对于collection类型添加collection,对于list类型还会添加list参数,如果是array类型则会添加array参数,不过这里使用了ifPresent,也就是如果本身参数名包含了则不会添加

小结

mybatis的ParamNameResolver针对单个参数没有加@Param的场景会调用wrapToMapIfCollection,最多会添加collection、list、array这些参数;其他的则多添加param1,param2这类参数。

以上就是mybatis的ParamNameResolver参数名称解析的详细内容,更多关于mybatis ParamNameResolver的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

相关文章

  • 解决@PathVariable参数接收不完整的问题

    解决@PathVariable参数接收不完整的问题

    这篇文章主要介绍了解决@PathVariable参数接收不完整的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring Security 实现多种登录方式(常规方式外的邮件、手机验证码登录)

    Spring Security 实现多种登录方式(常规方式外的邮件、手机验证码登录)

    本文主要介绍了Spring Security 实现多种登录方式(常规方式外的邮件、手机验证码登录),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 浅谈Java StringBuilder为什么线程不安全

    浅谈Java StringBuilder为什么线程不安全

    这篇文章主要介绍了浅谈Java StringBuilder为什么线程不安全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • SpringBoot启动过程逐步分析讲解

    SpringBoot启动过程逐步分析讲解

    这篇文章主要介绍了SpringBoot启动过程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • java父类和子类初始化顺序的深入理解

    java父类和子类初始化顺序的深入理解

    本篇文章是对java父类和子类初始化顺序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Java内部类的继承(全)

    Java内部类的继承(全)

    这篇文章主要介绍了Java内部类的继承,大家都知道JAVA内部类的构造器必须连接指向其外围类对象的引用,所以在继承内部类的时候,需要在导出类的构造器中手动加入对基类构造器的调用,需要的朋友可以参考下
    2015-07-07
  • JAVA中实现链式操作(方法链)的简单例子

    JAVA中实现链式操作(方法链)的简单例子

    这篇文章主要介绍了JAVA中实现链式操作的例子,模仿jQuery的方法链实现,需要的朋友可以参考下
    2014-04-04
  • 详解mybatis 批量更新数据两种方法效率对比

    详解mybatis 批量更新数据两种方法效率对比

    这篇文章主要介绍了详解mybatis 批量更新数据两种方法效率对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • SpringBoot文件上传与下载功能实现详解

    SpringBoot文件上传与下载功能实现详解

    文件上传与下载是Web应用开发中常用的功能之一。接下来我们将讨论如何在Spring Boot的Web应用开发中,如何实现文件的上传与下载,感兴趣的可以了解一下
    2022-10-10
  • Reactive反应式编程及使用介绍

    Reactive反应式编程及使用介绍

    这篇文章主要介绍了为什使用Reactive反应式编程的原因分析,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步,早日升职加薪
    2022-02-02

最新评论