1,在单个入参的情况下,mybatis不做任何处理,#{参数名} 即可,甚至连参数名都可以不需要,因为只有一个参数,或者使用 Mybatis的内置参数 _parameter。

2,多个入参:

  接口方法定义:public Employee getEmpByIdAndName(Integer id,String name);

取值:#{id},#{name}

mybatis抛出异常:org.apache.ibatis.binding.BindingException:Paramter ‘id‘ not found Available parameters are [1,0,param1,param2]

  原因如下:

  Myabtis会特殊处理多个参数,多个参数会被封装成一个Map(key:param1...paramN),或者根据参数索引获取也可以(从0开始),#{param1...paramN}就是从map中获取指定的key的值

3,命名参数,明确指定多个参数被封装成Map的可以,在方法入参上使用 @Param("id") 注解。#{id}取值id的值了。

public Employee getEmpByIdAndName(@Param("id")Integer id,@Param("name")String name);

4,POJO,如果多个参数正好是我们业务逻辑的数据模型,可以直接传入POJO,#{属性名},即可取出POJO的属性值了。

public Employee getEmpByIdAndName(Employee emp);

5,Map<String,Object>,如果多个参数不是业务逻辑的数据模型,没有对应的pojo,为了方便,可以传入一个Map。#{key},取出Map中对应的值。

public Employee getEmpByIdAndName(Map<String,Object> map);

6,TO,如果多个参数不是业务逻辑的数据模型,但是要经常使用(比如分页对象),推荐编写一个TO(Transfer Object)数据传输对象。

===============================入参为集合====================================

public Employee getEmp(@Param("id")Integer id,String lastName);

取值:id===>#{id/param1}     lastName=#{param2}

public Employee getEmp(Integer id,@Param("e")Employee emp);

取值:id===>#{param1}     lastName=#{param2.lastName/e.lastName}

###特别注意,如果单个入参的类型是为集合类型,也会特殊处理,也是把传入的List或数组封装在Map中key:Collection(collection),如果是List还可以使用这个key(list),如果是数组key为array

public Employee getEmpId(List<Integer> ids);

取值:取出第一个id的值。#{list[0]}

============================================================================================================

Mybatis参数值的获取

  #{}:可以获取Map中的值或者POJO对象属性的值;

  ${}:取值效果同上,但是有区别:

    1,#{}是以预编译的形式,将参数设置到SQL语句中;相当于使用原生的PreparedStatement;(防止SQL注入

    2,${}是以拼接字符串的形式,将参数直接拼接在SQL语句中;(会有安全隐患)

  大多数情况下,都应该去使用#{}取值;

  比如分表:按照年份分表拆分,一年一张财务表。

  select * from ${year}_工资表,表名是没有办法预编译的

  select * from emp order by ${name} ${age},排序也不支持占位符

  

  #{}:更为丰富的用法,可以指定参数的类型,类型如下:

    1,javaType,jdbcType,mode(存储过程),numericScale,

2,resultMap,typeHandler,jdbcTypeName,expression(未来准备支持的功能)

    jdbcType通常需要在某种特定的条件下被设置:

      1,在数据为null的时候,有些数据库可能不能识别Mybatis对null的默认处理,比如Oralce环境下会报错。

      2,JdbcType OTHER 无效类型:因为Mybatis对所有的null都映射的是原生Jdbc的OTHER类型,Oracle不能正确处理。(参见 org.apache.ibatis.type.JdbcType 枚举类)

      3,Oracle环境下应该这样取值:#{email,jdbcType=NULL}

    由于Mybatis的全局配置中,jdbcTypeForNull=OTHER,Oracle不支持,直接更改全局配置 jdbcTypeForNull=NULL 。(Settings标签下配置)

===============================结合源码,查看Mybatis如何处理入参====================================

1,首先我们的Mapper接口对象是一个代理对象(org.apache.ibatis.binding.MapperProxy<T>,它实现了java提供InvocationHandler接口)

  

2,被调用的Mapper代理对象的方法,被抽象成为 org.apache.ibatis.binding.MapperMethod 类型的对象,执行其 execute() 方法。它会判断方法的是insert,update,delete还是select。

  

3,最后调用MapperMethod对象的 convertArgsToSqlCommandParam(args) 方法将入参转换成一个Map。

  

  

  ①获取每个标注了 @Param 注解的参数的param值。然后复制给name。

  ②每次解析一个参数,给map中保存一个信息(key:参数索引,value:name的值)。

    name的值:

  标注了@param注解,注解的值。

  没有标注:

  1,全局配置:useActualParamName(需要jdk 1.8),name=入参参数名。

  2,name=map.size();相当于元素的索引。

  ③如果入参为null,直接返回null。

④如果names只有一个元素,并且没有 @Param 注解。直接names中的一个元素,直接返回。

⑤如果names有多个元素或者有 @Param 注解,遍历names,names集合的value作为key;names集合的key又作为取值的参考args[0]:args[1,"tom"],重新放入一个新的Map对象中。

    额外的将一个参数使用新的key:param1...paramN 保存到一个Map对象中

Mybatis方法入参处理相关推荐

  1. Spring-AOP @AspectJ进阶之绑定连接点方法入参

    文章目录 概述 实例 概述 我们前面的博文在讲解切点函数时说过args().this().target().@args().@within().@target()和@annotation()这7个函数 ...

  2. aspectj 获取方法入参_深入探索编译插桩技术(二、AspectJ)

    本文来自jsonchao的投稿,个人微信:bcce5360 现如今,编译插桩技术已经深入 Android 开发中的各个领域,而 AOP 技术正是一种高效实现插桩的模式,它的出现正好给处于黑暗中的我们带 ...

  3. aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...

    作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...

  4. 方法入参很复杂,每次调用都要构造BO入参?一招教你自动构造入参

    场景 同在互联网打工的小伙伴们肯定都面临这样一种场景: 通用逻辑(被多处调用)我们通常会封装成一个方法,那这个方法入参正常来说都不会少,(在开发规范中,经常会看到一条"方法入参正常不超过3个 ...

  5. 新版SpringCloudGateway网关 切面修改方法入参

    通过注解修改方法入参值,一般都是采用实现 org.springframework.web.method.support.HandlerMethodArgumentResolver 接口的 resolv ...

  6. spring特殊字符转义和方法入参检测工具类

    由于 Web 应用程序需要联合使用到多种语言,每种语言都包含一些特殊的字符,对于动态语言或标签式的语言而言,如果需要动态构造语言的内容时,一个我们经常会碰到的问题就是特殊字符转义的问题.下面是 Web ...

  7. aspect 方法入参 获取_谈谈Spring AOP中@Aspect的高级用法示例

    前言 本文主要跟大家分享介绍了关于Spring AOP中@Aspect的高级用法,下面话不多说了,来随着小编一起看看详细的介绍吧. 1 切点复合运算 支持在切点定义中加入以下运算符进行复合运算: 运算 ...

  8. aop 获取方法入参出参_Spring AOP获取请求URL的入参及返回值(通用方法)

    以下代码为通用的代码,其中json解析使用的是fastJson,可以记录用户访问的ip.url.入参和出参 /** * @author jasonLu * @date 2017/10/26 9:57 ...

  9. thymeleaf 的 th:onclick js方法入参

    现在的写法: <button class="btn" th:onclick="getName([[${person.name}]]);">获得名字& ...

最新文章

  1. “Duke选择大奖”荟萃2009最具创新的Java技术应用
  2. 了解JavaScript 对象的属性操作
  3. create maven android project
  4. 现金支付没落?澳大利亚一年内移除数百台ATM机
  5. 如何设置顶部和底部固定,中间填满
  6. ASP.NET MVC中权限控制的简单实现
  7. c++new时赋初值_C高级编程精髓之内存管理,万千码农踩过的雷,大神带你走出雷区...
  8. 51单片机之特殊功能寄存器SFR
  9. Java语言跨平台性质的优点和缺点_机器人热门编程语言及优缺点分析
  10. php 时间戳存储 原因,将php文件中的unix时间戳存储到mysql中(store unix timestamp from php file into mysql)...
  11. AI即开即用,这是悄然推出的“腾讯最新AI技术”小程序
  12. 【SQLSERVER】处理一对多标签的语法糖
  13. Java GC机制详解
  14. 重磅!吴恩达新书《机器学习训练秘籍》中文版来了(附PDF下载)
  15. 卸载vm15实用教程
  16. 什么是肠漏综合征,它如何影响健康?
  17. 效率至上 计算机使用规范
  18. UnityECS-初识
  19. 测针对精密测量的重要性
  20. apollo(阿波罗) 分布式部署指南

热门文章

  1. RGW Bucket Shard优化
  2. 网易魔兽怀旧服服务器型号,魔兽世界所有怀旧服服务器名称已出,你觉得哪些名称更好听呢?...
  3. JDK和KRE安装及其区别
  4. 怎么将CAJ转换成PDF
  5. M1 Mac使用Kitty script入库标准音源到Kontakt6
  6. java缺少方法主体_Java开发网 - 总是报错(缺少方法主体,或声明抽象)
  7. 基于KF32A156 - MCU Bug list
  8. STM32驱动ST7789V2 tft屏幕
  9. 艺赛旗RPA离线识别普通验证码
  10. Python 60 天 + 450 题,倾情奉献