我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MyBatis @Param注解怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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<Integer, String> getParams(Method method, boolean hasNamedParameters) {      final SortedMap<Integer, String> params = new TreeMap<Integer, String>();      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<String, Object> param = new ParamMap<Object>();        int i = 0;        for (Map.Entry<Integer, String> 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<String, Object> param = new ParamMap<Object>();

然后,设置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注解怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MyBatis @Param注解怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MyBatis @Param注解怎么实现

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

Mybatis在注解上怎么实现动态SQL

本文小编为大家详细介绍“Mybatis在注解上怎么实现动态SQL”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis在注解上怎么实现动态SQL”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在注解上实现动
2023-07-02

mybatis中@Param注解总是报取不到参数问题如何解决

这篇文章主要介绍“mybatis中@Param注解总是报取不到参数问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis中@Param注解总是报取不到参数问题如何解决”文章能帮助大
2023-07-02

怎么通过一个注解实现MyBatis字段加解密

这篇文章主要讲解了“怎么通过一个注解实现MyBatis字段加解密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么通过一个注解实现MyBatis字段加解密”吧!简介mybatis-crypt
2023-06-29

MyBatis中怎么实现SQL注入攻击

MyBatis中怎么实现SQL注入攻击,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、模糊查询Select * from news where title l
2023-06-20

MyBatis注解实现动态SQL问题

这篇文章主要介绍了MyBatis注解实现动态SQL问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-07

怎么用Springboot+mybatis-plus+注解实现数据权限隔离

今天小编给大家分享一下怎么用Springboot+mybatis-plus+注解实现数据权限隔离的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们
2023-06-08

MyBatis @Select注解怎么使用

这篇文章主要介绍“MyBatis @Select注解怎么使用”,在日常操作中,相信很多人在MyBatis @Select注解怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyBatis @Select
2023-07-02

mybatis中怎么配置注解

mybatis中怎么配置注解,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解与xml配置的对应关系mybatis中注解就是简单不需要写配置文件,适合简单的数据处理,理解起来比
2023-06-20

使用Mybatis注解怎么实现一个单表、多表操作

本篇文章给大家分享的是有关使用Mybatis注解怎么实现一个单表、多表操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.Mybatis注解开发单表操作 ***1.1 MyB
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录