广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis@Param注解的实现
  • 824
分享到

MyBatis@Param注解的实现

2024-04-02 19:04:59 824人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

先说结论: 当输入参数只有一个且没有使用@Param注解时,mybatis会直接传递这个参数;当输入参数多于一个,或者使用了@Param注解时,MyBatis会将参数封装在Map中传

先说结论:

当输入参数只有一个且没有使用@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注解的实现的文章就介绍到这了,更多相关MyBatis @Param注解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: MyBatis@Param注解的实现

本文链接: https://www.lsjlt.com/news/144750.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MyBatis@Param注解的实现
    先说结论: 当输入参数只有一个且没有使用@Param注解时,MyBatis会直接传递这个参数;当输入参数多于一个,或者使用了@Param注解时,MyBatis会将参数封装在Map中传...
    99+
    2022-11-13
  • MyBatis @Param注解怎么实现
    本文小编为大家详细介绍“MyBatis @Param注解怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis @Param注解怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-29
  • Mybatis中@Param注解的用法详解
    目录1、概述2、实例:实例一:@Param注解基本类型的参数实例二:@Param注解JavaBean对象3、注意点附:为什么要用@param总结1、概述 首先明确这个注解是为SQL语...
    99+
    2022-11-13
  • Mybatis中@Param注解的作用说明
    目录@Param注解的作用说明1.关于@Param2.原始的方法3.使用@Param@Param注解和参数使用1.使用@Param注解2.不使用@Param注解@Param注解的作用...
    99+
    2022-11-13
  • Mybatis省略@Param注解原理分析
    目录1、新建mybatis的Demo项目2、添加-parameters参数后的执行结果如下3、springboot项目为什么不用另外配置-parameters参数呢环境配置: jdk...
    99+
    2022-11-13
  • 解决Mybatis的@Param()注解导致分页失效的问题
    @Param注解导致分页失效—分页拦截器 问题描述 在使用mybatis分页时,使用@Param注解传入了两个对象,分页失效,查询出的总是全部的数据。出现问题时,分页策略为:分页拦截...
    99+
    2022-11-12
  • Mybatis Mapper中多参数方法不使用@param注解报错的解决
    目录问题描述寻求解决方案寻找原因拓展延伸在使用低版本的Mybatis的时候,Mapper中的方法如果有多个参数时需要使用@param注解,才能在对应xml的sql语句中使用参数名称获...
    99+
    2022-11-12
  • Mybatis中@Param的用法和作用详解
    用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中我们先来看Mapper接口中的@Select方法package Mapper; public inte...
    99+
    2023-05-31
    mybatis param
  • mybatis中@Param注解总是报取不到参数问题及解决
    目录@Param注解总是报取不到参数错误如下@Param注解详细使用方法1.@Param这个注解是用来解决接口方法有多个参数时2.可以修饰JavaBean对象、Map集合等3.@Pa...
    99+
    2022-11-13
  • mybatis中@Param注解总是报取不到参数问题如何解决
    这篇文章主要介绍“mybatis中@Param注解总是报取不到参数问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis中@Param注解总是报取不到参数问题如何解决”文章能帮助大...
    99+
    2023-07-02
  • Mybatis用注解写in查询的实现
    Mybatis注解写in查询 @Select("<script>" + "SELECT * FROM table WHERE Ord...
    99+
    2022-11-12
  • MyBatis的MapKey注解实例解析
    目录使用一、数据准备二、Mapper配置UserMapper接口三、实战实战2——注意事项原理总结使用 mybatis中有很多实用的注解,但是平时想不起来使...
    99+
    2023-02-08
    MyBatis MapKey注解 MyBatis MapKey
  • MyBatis注解实现动态SQL问题
    目录MyBatis注解实现动态SQLMyBatis动态拼接 SQL参数最后补充几个知识点总结MyBatis注解实现动态SQL 在 Mybatis 中,使用注解可以很方便的进行sql操...
    99+
    2023-02-07
    MyBatis注解 MyBatis注解实现动态SQL MyBatis动态SQL
  • Mybatis常用注解中的SQL注入实例详解
    目录前言常见注入场景2.1普通注解2.2 动态sql2.2.1 使用< script>2.2.2 使用Provider注解总结前言 MyBatis3提供了新的基于注解的配...
    99+
    2022-11-13
  • Mybatis-plus 的 @Version注解
    Mybatis-plus 的 @Version注解 1. 简单介绍2. 注解说明3. 什么是乐观锁?3.1 乐观锁简介3.2 乐观锁实例 4. 实例代码 1. 简单介绍 嗨,大家...
    99+
    2023-09-09
    java mysql intellij-idea
  • Mybatis在注解上如何实现动态SQL
    目录在注解上实现动态SQL注解的动态语句支持以下注解方式动态sql写法和注意事项判断字符串为空串 用单引号大于等于用小于等于用在注解上实现动态SQL 使用Mybatis注解实现sql...
    99+
    2022-11-13
  • Mybatis在注解上怎么实现动态SQL
    本文小编为大家详细介绍“Mybatis在注解上怎么实现动态SQL”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis在注解上怎么实现动态SQL”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在注解上实现动...
    99+
    2023-07-02
  • Springboot+mybatis-plus+注解实现数据权限隔离
    目录1.创建注解 2. 具体实现 1.创建注解 当此注解打在类上,不需要传参,该类下所有查询接口开启数据隔离;打在方法上默认开启数据隔离,传参为false则该方法关闭验证 @...
    99+
    2022-11-12
  • mybatis注解如何实现对象批量更改
    mybatis注解对象批量更改 一、介绍 当有多个对象需要进行更改时,批量修改对象集合List 二、代码 @Update("<script>" + "<fore...
    99+
    2022-11-12
  • Mybatis插件+注解实现数据脱敏方式
    目录引入问题解决思路Mybatis插件原理实现加解密注解加解密工具类插件实现使用注解在实体类上注解在参数上引入 问题 在项目中需要对用户敏感数据进行脱敏处理,例如身份证号、手机号等信...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作