Mybatis方法入参处理
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方法入参处理相关推荐
- Spring-AOP @AspectJ进阶之绑定连接点方法入参
文章目录 概述 实例 概述 我们前面的博文在讲解切点函数时说过args().this().target().@args().@within().@target()和@annotation()这7个函数 ...
- aspectj 获取方法入参_深入探索编译插桩技术(二、AspectJ)
本文来自jsonchao的投稿,个人微信:bcce5360 现如今,编译插桩技术已经深入 Android 开发中的各个领域,而 AOP 技术正是一种高效实现插桩的模式,它的出现正好给处于黑暗中的我们带 ...
- aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...
作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...
- 方法入参很复杂,每次调用都要构造BO入参?一招教你自动构造入参
场景 同在互联网打工的小伙伴们肯定都面临这样一种场景: 通用逻辑(被多处调用)我们通常会封装成一个方法,那这个方法入参正常来说都不会少,(在开发规范中,经常会看到一条"方法入参正常不超过3个 ...
- 新版SpringCloudGateway网关 切面修改方法入参
通过注解修改方法入参值,一般都是采用实现 org.springframework.web.method.support.HandlerMethodArgumentResolver 接口的 resolv ...
- spring特殊字符转义和方法入参检测工具类
由于 Web 应用程序需要联合使用到多种语言,每种语言都包含一些特殊的字符,对于动态语言或标签式的语言而言,如果需要动态构造语言的内容时,一个我们经常会碰到的问题就是特殊字符转义的问题.下面是 Web ...
- aspect 方法入参 获取_谈谈Spring AOP中@Aspect的高级用法示例
前言 本文主要跟大家分享介绍了关于Spring AOP中@Aspect的高级用法,下面话不多说了,来随着小编一起看看详细的介绍吧. 1 切点复合运算 支持在切点定义中加入以下运算符进行复合运算: 运算 ...
- aop 获取方法入参出参_Spring AOP获取请求URL的入参及返回值(通用方法)
以下代码为通用的代码,其中json解析使用的是fastJson,可以记录用户访问的ip.url.入参和出参 /** * @author jasonLu * @date 2017/10/26 9:57 ...
- thymeleaf 的 th:onclick js方法入参
现在的写法: <button class="btn" th:onclick="getName([[${person.name}]]);">获得名字& ...
最新文章
- “Duke选择大奖”荟萃2009最具创新的Java技术应用
- 了解JavaScript 对象的属性操作
- create maven android project
- 现金支付没落?澳大利亚一年内移除数百台ATM机
- 如何设置顶部和底部固定,中间填满
- ASP.NET MVC中权限控制的简单实现
- c++new时赋初值_C高级编程精髓之内存管理,万千码农踩过的雷,大神带你走出雷区...
- 51单片机之特殊功能寄存器SFR
- Java语言跨平台性质的优点和缺点_机器人热门编程语言及优缺点分析
- php 时间戳存储 原因,将php文件中的unix时间戳存储到mysql中(store unix timestamp from php file into mysql)...
- AI即开即用,这是悄然推出的“腾讯最新AI技术”小程序
- 【SQLSERVER】处理一对多标签的语法糖
- Java GC机制详解
- 重磅!吴恩达新书《机器学习训练秘籍》中文版来了(附PDF下载)
- 卸载vm15实用教程
- 什么是肠漏综合征,它如何影响健康?
- 效率至上 计算机使用规范
- UnityECS-初识
- 测针对精密测量的重要性
- apollo(阿波罗) 分布式部署指南
热门文章
- RGW Bucket Shard优化
- 网易魔兽怀旧服服务器型号,魔兽世界所有怀旧服服务器名称已出,你觉得哪些名称更好听呢?...
- JDK和KRE安装及其区别
- 怎么将CAJ转换成PDF
- M1 Mac使用Kitty script入库标准音源到Kontakt6
- java缺少方法主体_Java开发网 - 总是报错(缺少方法主体,或声明抽象)
- 基于KF32A156 - MCU Bug list
- STM32驱动ST7789V2 tft屏幕
- 艺赛旗RPA离线识别普通验证码
- Python 60 天 + 450 题,倾情奉献