mybatis参数处理

mybatis的参数处理详解 使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,使用实体类的包装类作为参数传递。 阅读详情

单个参数:mybatis不会做特殊处理,
#{参数名/任意名}:取出参数值。

多个参数:mybatis会做特殊处理。
多个参数会被封装成 一个map,
key:param1…paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值;

异常:
org.apache.ibatis.binding.BindingException: 
Parameter 'id' not found. 
Available parameters are [1, 0, param1, param2]
操作:
	方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
	取值:#{id},#{lastName}

【命名参数】:明确指定封装参数时map的key;@Param(“id”)
多个参数会被封装成 一个map,
key:使用@Param注解指定的值
value:参数值
#{指定的key}取出对应的参数值

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

Map:
如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map
#{key}:取出map中对应的值

TO:
如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象
Page{
int index;
int size;
}

思考
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}

##特别注意:如果是Collection(List、Set)类型或者是数组,
也会特殊处理。也是把传入的list或者数组封装在map中。
key:Collection(collection),如果是List还可以使用这个key(list)
数组(array)
public Employee getEmpById(List ids);
取值:取出第一个id的值: #{list[0]}

结合源码,mybatis怎么处理参数
总结:参数多时会封装map,为了不混乱,我们可以使用@Param来指定封装时使用的key;
#{key}就可以取出map中的值;

(@Param(“id”)Integer id,@Param(“lastName”)String lastName);
ParamNameResolver解析参数封装map的;
//1、names:{0=id, 1=lastName};构造器的时候就确定好了

确定流程:
1.获取每个标了param注解的参数的@Param的值:id,lastName;  赋值给name;
2.每次解析一个参数给map中保存信息:(key:参数索引,value:name的值)
	name的值:
		标注了param注解:注解的值
		没有标注:
			1.全局配置:useActualParamName(jdk1.8):name=参数名
			2.name=map.size();相当于当前元素的索引
{0=id, 1=lastName,2=2}

args【1,“Tom”,‘hello’】:

public Object getNamedParams(Object[] args) {
final int paramCount = names.size();
//1、参数为null直接返回
if (args == null || paramCount == 0) {
return null;

//2、如果只有一个元素,并且没有Param注解;args[0]:单个参数直接返回
} else if (!hasParamAnnotation && paramCount == 1) {
  return args[names.firstKey()];
  
//3、多个元素或者有Param标注
} else {
  final Map<String, Object> param = new ParamMap<Object>();
  int i = 0;
  
  //4、遍历names集合;{0=id, 1=lastName,2=2}
  for (Map.Entry<Integer, String> entry : names.entrySet()) {
  
  	//names集合的value作为key;  names集合的key又作为取值的参考args[0]:args【1,"Tom"】:
  	//eg:{id=args[0]:1,lastName=args[1]:Tom,2=args[2]}
    param.put(entry.getValue(), args[entry.getKey()]);
    
    
    // add generic param names (param1, param2, ...)param
    //额外的将每一个参数也保存到map中,使用新的key:param1...paramN
    //效果:有Param注解可以#{指定的key},或者#{param1}
    final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);
    // ensure not to overwrite parameter named with @Param
    if (!names.containsValue(genericParamName)) {
      param.put(genericParamName, args[entry.getKey()]);
    }
    i++;
  }
  return param;
}

}
}
参数值的获取
#{}:可以获取map中的值或者pojo对象属性的值;
${}:可以获取map中的值或者pojo对象属性的值;

select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?
区别:
#{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
${}:取出的值直接拼装在sql语句中;会有安全问题;
大多情况下,我们去参数的值都应该去使用#{};

	原生jdbc不支持占位符的地方我们就可以使用${}进行取值
	比如分表、排序。。。;按照年份分表拆分
		select * from ${year}_salary where xxx;
		select * from tbl_employee order by ${f_name} ${order}

#{}:更丰富的用法:
规定参数的一些规则:
javaType、 jdbcType、 mode(存储过程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);

jdbcType通常需要在某种特定的条件下被设置:
	在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);
	
	JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
	
	由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
	1、#{email,jdbcType=OTHER};
	2、jdbcTypeForNull=NULL
		<setting name="jdbcTypeForNull" value="NULL"/>
MyBatis处理多参数及原理分析 一、多参数处理方式 1.1使用@Param注解 MyBatis 允许在mapper 接口中使用@Param注解来处理多个参数。 mapper 接口: /** @Param 注解中的值可以是任意的 */ Employee getEmpByIdAndUsername(@Param("id") Integer id, @Param("username") String use... 阅读详情

相关推荐

Mybatis调用PostgreSQL存储过程实现数组入参传递

主要介绍了mybatis调用postgresql自定义函数传递数组参数的解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Mybatis参数处理总结

单个参数:mybatis不会做特殊处理, #{参数名/任意名}:取出参数值。 多个参数:mybatis会做特殊处理。 多个参数会被封装成 一个map, key:param1...paramN,或者参数的索引也可以 value:传入的参数值 #{}就是从map中获取指定的key的值; 异常: org.apache.ibatis.binding.BindingException: Parameter 'id' ...

wuningw的博客 1386

OpenClaw 快速安装与本地应用实战 —— 每一步都有截图加详细说明,本地AI助手,让打工人也有下属

《OpenClaw 2026开源智能体框架10分钟快速部署指南》摘要:本文提供OpenClaw最新版全平台部署方案,重点解决三大核心问题:1)环境配置优化,通过一键脚本实现3-8分钟快速安装(含国内镜像加速方案);2)初始化配置详解,包含大模型绑定(智普AI/本地模型)与5个高频技能安装;3)实战演示文件自动整理任务。同时总结6类常见故障解决方案,涵盖权限、端口占用等典型问题,确保用户从安装到首个自动化任务落地全程无障碍。特别强调Windows需管理员权限、禁用中文路径等关键注意事项,实现"安装即

weixin_43538316的博客 809

MyBatis中的特殊符号[20160713]

今天中午回到工位已经是12:20多了,没有时间睡觉了,本想着还能提前开始,结果看了点新闻之后,又是12:40了,所以新闻坚决不能看,执行力。 今天主要记录一下MyBatis中的特殊符号的问题,这个问题已经在面试中被问到了两回了,但都没答好,事不过三,记录下来,下一次绝对不能再在这里出问题了。 一、mybatis特点 同hibernate一样,mybatis是一个持久层框架,通...

weixin_30457065的博客 303

AD9026芯片开发实战指南:从硬件配置到射频校准

本文为AD9026芯片开发实战指南,详细解析了从硬件设计、电源时钟配置、SPI初始化到多芯片同步与JESD204高速链路建立的完整流程。重点探讨了射频校准技术,包括初始化校准与跟踪校准,以保障5G、MIMO等现代通信系统所需的射频性能。旨在帮助开发者系统掌握这颗高性能射频收发器的应用,规避常见设计陷阱。

tomato的博客 852

智能车竞赛新手必看:用AD21从零画一块英飞凌TC264核心板(附开源PCB文件)

本文详细介绍了使用Altium Designer 21(AD21)从零开始设计英飞凌TC264核心板的完整流程,涵盖原理图绘制、PCB布线到最终DRC检查的全过程。针对智能车竞赛新手,提供了实用的硬件设计技巧和开源PCB文件,帮助快速掌握TC264核心板开发。

weixin_27017211的博客 246

mybatis返回类型为map,字段因有特殊符号[]报错问题

数据库表 CREATE TABLE `ads(1)` ( `姓名` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8mb4_bin', `NR BestBeam RSRP[dB1]` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_bin' ) COMMENT='admin上次excel创建' COLLATE='utf8mb4_bin' ENGINE=InnoDB ; 表数据截图 查询 mapper package

qq_39610585的博客 835

基于three.js的室内全景3D展馆案例分享

3D场景展厅

acheng 3559

MyBatis(四)Mybatis的参数

目录Mybatis的参数一、parameterType配置参数1. 引入2. 注意事项3. 传递poji包装对象①编写QueryVo②编写持久层接口③持久层接口的映射文件④测试包装类作为参数⑤运行结果二、Mybatis的输出结果封装1. 基本类型示例① Dao接口② 映射配置2. 实体类类型示例① Dao接口② 映射配置3. 特殊情况示例① 修改实体类② Dao接口③ 映射配置④ 测试查询结果⑤ ...

刘伟佳的博客 2013

Unity WebGL发布避坑指南:从内存设置到字体打包,一次搞定所有常见问题

本文详细解析Unity WebGL发布的完整流程,从内存设置到字体打包,提供全面的避坑指南。涵盖关键检查清单、内存与性能优化配置、资源处理专项优化及平台适配技巧,帮助开发者高效解决常见问题,确保项目顺利发布。

weixin_28693309的博客 148

SVG绘制圆环进度条

在我们的大屏可视化项目中,经常会用到各种各样的图表。与传统的表格展示、枯燥的文字阐述相比,图表展示则使用户看起来更加直观、数据的展示则更加一目了然。本文基于svg绘图技术结合前端技术栈vue,以工作中常用的环形进度条为例,简单阐述一下绘制进度条的一些思路。............

qq_40289557的博客 8361

MyBatis参数处理和查询语句专题

本文详细的讲解了MyBatis参数处理和查询语句相关的知识,是MyBatis的重中之重。

???? 1798

用Python绘制DCA曲线详解及示例代码

在这篇文章中,我们将详细解释如何使用Python绘制DCA曲线,并提供示例代码。通过使用上述的示例代码和解释,你可以自己尝试不同的投资金额、期数和增长率来绘制自定义的DCA曲线。通过运行上述代码,我们将得到一个绘制了DCA曲线的图表。该图表将显示出DCA投资策略在给定投资金额、投资期数和增长率下的投资价值随时间的变化情况。在上述代码中,我们使用一个循环来计算每个投资期的DCA曲线值。现在,我们可以使用上述函数来计算DCA曲线的值,并将其绘制成图表。最后,我们返回计算得到的DCA曲线值列表。

TechPr的博客 1411

Mybatis对各种参数的处理

一. Mybatis参数的处理 在正常的开发中,参数可能是单个参数,也可能是多个参数,也可能是实体类的对象,这些是较常见的,还有一些特殊的,比如参数是map键值对,是list,除了map和list之外还有其他的多个参数。 ①单个参数(Integer empId):单个参数MyBatis不会做任何特殊处理,在SQL映射文件中使用任意的参数名称都可以取得该参数 ②多个参数(String empName,Integer pageCurrent,Integer pageSIze): 首先我们测试一下多个参数,看情况

哈哈哈 1155

CAPL自动化测试

通过本文的学习,读者应该对CAPL自动化测试有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1528

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MyBatis参数处理

MyBatis 提供了丰富的参数处理机制,包括单个参数、多个参数、对象参数和集合参数的处理。通过#{}和@Param等方式,MyBatis 实现了对 SQL 语句中的参数绑定和动态 SQL 的灵活支持。合理使用 MyBatis 的参数处理机制,能够简化数据库操作代码,同时保持 SQL 语句的灵活性和可读性。

Flying_Fish_roe的博客 766

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Mybatis如何处理参数

一、创建代理对象会进入一个MapperProxy的类 EMPDAO ed = sqlSession.getMapper(EMPDAO.class); ed//代理对象 MapperProxy类中invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throw...

haoren1994的博客 2787

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MyBatis 参数上的处理的细节内容

告诉mybatis框架,我这个方法的参数类型是什么类型的,mybatis 框架自身带有类型自动推断的机制,所以大部分情况下 parameterType 属性都是可以省略不写的。其实对于Mybatis 框架来说,简单类型对于mybatis来说都是可以自动类型识别的:在MyBatis 框架当中如下,为的类型被定义为简单类型简单类型包括:String也就是说对于mybatis来说,它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。

CTZL123456的博客 1011

Mybatis对参数的处理

文章目录Mybatis对参数的处理最简单情况:一个参数(普通类型或对象的引用)一个简单类型(或其包装类)的参数一个对象的引用多个参数Mybatis对多个参数的处理参数对应的key使用参数名作为key的有关设置多个参数中存在引用类型集合类型Map类型List数组 Mybatis对参数的处理 最简单情况:一个参数(普通类型或对象的引用) 一个简单类型(或其包装类)的参数 public College getCollegeById(Integer id); <select id="getC

qq2071114140的博客 435

mybatis之参数处理

mybatis之参数处理

m0_47743175的博客 464

MyBatis笔记——参数处理

从 MyBatis 3.5.2 版本开始,可以通过@Param注解自定义参数名称。在 XML 配置文件中的 SQL 语句中,可以通过#{name}和#{age}来引用这两个参数。

zxb的博客 1157

10、mybatis参数处理

文章目录1、单个参数:mybatis不做任何处理2、多个参数:mybatis会做特殊处理3、命名参数:明确指定封装参数时map的key:@Param("id")3.1 EmployeeMapper接口3.2 EmployeeMapper.xml3.3 Test4、POJO,5、Map5.1 EmployeeMapper5.2 EmployeeMapper.xml5.3 Test6、TO7、jdbcType通常需要在某种特定的条件下被设置 1、单个参数:mybatis不做任何处理 #{参数名}:取出参数 2

kingchengwen的专栏 203

mybatis多参数的处理方法

如果你的查询需要传递多个参数,而且这些参数有一定的逻辑关系,通常可以通过封装成一个自定义的参数对象来传递。自定义查询条件类// 构造函数、getter、setter当你使用自定义对象作为查询参数时,MyBatis 会自动通过反射访问对象的属性。如果你希望给自定义对象中的某些属性指定别名,可以结合@Param注解来达到这个目的。@Param使用@Param注解:适用于方法参数较少且每个参数都有明确名称的场景。使用Map作为参数:适用于需要传递多个参数且参数数量不固定的场景,可以使用存储查询参数。

Kloveys的博客 949

Mybatis之参数处理

在MyBatis中,参数处理是非常关键的部分,

gege_0606的博客 736
上一篇: Spring学习完个人总结
下一篇: mybatis学习完个人总结
magicproblem
博客等级 码龄7年 22粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值