千家信息网

MyBatis @Param注解怎么实现

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本文小编为大家详细介绍"MyBatis @Param注解怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"MyBatis @Param注解怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
千家信息网最后更新 2026年11月03日MyBatis @Param注解怎么实现

本文小编为大家详细介绍"MyBatis @Param注解怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"MyBatis @Param注解怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

先说结论:

当输入参数只有一个且没有使用@Param注解时,MyBatis会直接传递这个参数;当输入参数多于一个,或者使用了@Param注解时,MyBatis会将参数封装在Map中传递,这时的Map的key分为以下几种可能:

  • Map中会有param1, param2这样的key,其顺序对应输入参数的顺序。无论是否有@Param注解。

  • 对于@Param注解的参数,Map中会保存注解中给定的名字作为key

  • 对于没有用@Param注解的参数,Map中会用1、2、3 ..这样的数字作为key,按顺序保存输入参数。

下面来看一下源码。

首先,判断一个方法中是否有用@Param注解的参数:

    private boolean hasNamedParams(Method method) {      final Object[][] paramAnnos = method.getParameterAnnotations();      for (Object[] paramAnno : paramAnnos) {        for (Object aParamAnno : paramAnno) {          if (aParamAnno instanceof Param) {            return true;          }        }      }      return false;    }

如果有用@Param注解的参数,取出注解中给出的参数名:

    private String getParamNameFromAnnotation(Method method, int i, String paramName) {      final Object[] paramAnnos = method.getParameterAnnotations()[i];    // 获取第i个参数的注解      for (Object paramAnno : paramAnnos) {        if (paramAnno instanceof Param) {          paramName = ((Param) paramAnno).value();          break;        }      }      return paramName;    }

注意方法的输入参数,method表示是哪个方法上,i 表示第几个参数, paramName是传进来的参数名,如果该参数没有用@Param注解,则返回传进来的paramName。

下面这个方法返回一个TreeMap(有序),其key表示参数的顺序,比如key=0代表第0个参数;value表示参数的名字,如果有用@Param注解标注,则为标注的参数名,否则和key相等,即用参数的序号作为参数的名字。

    private SortedMap getParams(Method method, boolean hasNamedParameters) {      final SortedMap params = new TreeMap();      final Class[] argTypes = method.getParameterTypes();      for (int i = 0; i < argTypes.length; i++) {        if (!RowBounds.class.isAssignableFrom(argTypes[i]) && !ResultHandler.class.isAssignableFrom(argTypes[i])) {          String paramName = String.valueOf(params.size());    // 参数名,默认为参数的序号          if (hasNamedParameters) {    //如果有使用@Param注解,则获取注解标注的参数名            paramName = getParamNameFromAnnotation(method, i, paramName);    // 这里paramName作为参数传进来,表示默认值          }          params.put(i, paramName);        }      }      return params;    }

其中hasNamedParameters只是从整个方法的维度,给出该方法是否有使用@Param注解的参数;即使其值为true,具体到某一个参数上面,可能没有使用@Param注解,因此调用getParamNameFromAnnotation传入的paramName就作为默认值返回,即参数的序号。

最后将调用方法的参数转换为MyBatis内部使用的参数:

 public Object convertArgsToSqlCommandParam(Object[] args) {      final int paramCount = params.size();      if (args == null || paramCount == 0) {        return null;      } else if (!hasNamedParameters && paramCount == 1) {        return args[params.keySet().iterator().next().intValue()];      } else {        final Map param = new ParamMap();        int i = 0;        for (Map.Entry entry : params.entrySet()) {          param.put(entry.getValue(), args[entry.getKey().intValue()]);          // issue #71, add param names as param1, param2...but ensure backward compatibility          final String genericParamName = "param" + String.valueOf(i + 1);          if (!param.containsKey(genericParamName)) {            param.put(genericParamName, args[entry.getKey()]);          }          i++;        }        return param;      }    }

其中args为Dao方法的输入参数,这里已经转换成了数组,其实就是动态代理的invoke方法传入的参数。

该方法首先对输入参数进行计数,使用的params就是前面介绍的getParams方法的返回值。

if (!hasNamedParameters && paramCount == 1)

上面的条件判断,即方法没有使用@Param注解,且只有一个参数,这时返回

args[params.keySet().iterator().next().intValue()]

即直接将其作为Object返回。

如果上面的条件不满足的话,首先新建一个Map作为返回值:

final Map param = new ParamMap();

然后,设置map的key和value:

param.put(entry.getValue(), args[entry.getKey().intValue()]);

然后为了兼容性,做了如下操作

final String genericParamName = "param" + String.valueOf(i + 1);if (!param.containsKey(genericParamName)) {    param.put(genericParamName, args[entry.getKey()]);}

即设置param1、param2这样的key。

到此为止,需要的参数对象Object就构建完成,其中封装了Dao传入的多个参数,并根据参数是否有@Param注解,影响了参数对象的类型(是否是map)。

参数封装完成之后,下一步将其传递给SqlSession。

读到这里,这篇"MyBatis @Param注解怎么实现"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

参数 注解 方法 输入 有用 顺序 名字 序号 文章 封装 内容 只有 对象 就是 条件 面的 妥当 有序 到此为止 代表 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 苏州找大状互联网科技有限公司 广州百单互联网科技有限公司 科技赋能下的互联网金融 科技平台互联网 科技信息互联网 合肥互联网科技公司 为想互联网科技 礼当家互联网科技 广州凡科互联网科技 互联网经济与金融科技 花神(南京)互联网科技有限公司 成都互联网科技公司工作好不好 互联网公司黑科技创始人 上海科技产业互联网平台 怎样加入科技互联网 万物互联网智能科技 数字互联网科技有限公司 广西泛欧互联网科技有限公司 互联网科技创业计划的风险分析 博彦科技互联网金融 科技赋能下的互联网金融 互联网科技logo 伴你行互联网科技有限公司 迪庆互联网科技招生 工业互联网展湾科技股份有限公司 广州燕处互联网科技有限公司 数字互联网科技有限公司 数字科技和互联网金融哪个好 小牛互联网科技有限公司地址
0