Mybatis参数绑定没有key时Map和List<Map>的不同

本文深入探讨Mybatis框架中Map和List<Map>作为参数时的绑定机制差异,解析Mybatis如何处理未定义的变量名,及在实际应用中如何避免潜在的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好久没见了,最近在项目中遇到个Mybatis参数绑定的坑,Mybatis在参数绑定时如果没有key,Map和List<Map>将有不同的结果。

一、参数是Map的绑定

  • 创建一个name和age为key的map。

public Object test() throws Exception {
	Map<String, Object> params = new HashMap<>();
	params.put("name", "wtao");
	params.put("age", 18);
	
	Map<String, Object> resultMap = oaMapper.test(params);
	return resultMap;
}
  • 测试用的mapper
public Map<String, Object> test(Map<String, Object> map);
  • 映射xml的sql,简单起见只将参数直接输出,关键点是map中没有abc的key,看mybatis如何生成sql
<select id="test" parameterType="map" resultType="map">
	SELECT 
		#{name,jdbcType=VARCHAR} name,
		#{age,jdbcType=VARCHAR} age,
		#{abc,jdbcType=VARCHAR} abc
	FROM DUAL
</select>

运行结果如图:可以看出Mybatis以Map为参数在绑定时如果获取的变量名称如果在map中未定义,则会赋值为null。

二、参数是List<Map>的绑定

  • 定义2个Map放到List中
public Object test() throws Exception {
	Map<String, Object> params = new HashMap<>();
	params.put("name", "wtao");
	params.put("age", 18);
	
	Map<String, Object> params1 = new HashMap<>();
	params1.put("name", "xiaoli");
	params1.put("age", 24);
	
	List<Map<String, Object>> list = new ArrayList<>();
	list.add(params);
	list.add(params1);
	
	List<Map<String, Object>> resultList = oaMapper.test(list);
	return resultList;
}
  • 修改mapper
public List<Map<String, Object>> test(List<Map<String, Object>> list);
  • 映射xml的sql,因为是List需要使用foreach标签,循环取出结果,还是没有abc的key,看生成的sql
<!-- 测试查询 -->
<select id="test" resultType="map">
  <foreach collection="list" item="item" separator=" union all ">
    SELECT 
      #{item.name,jdbcType=VARCHAR} name,
      #{item.age,jdbcType=VARCHAR} age,
      #{item.abc,jdbcType=VARCHAR} abc
    FROM DUAL
  </foreach>
</select>

运行结果如图:可以看出Mybatis以List<Map>为参数在循环绑定内部如果获取的变量名称在map中未定义,Mybatis不会设置默认值null,因此会直接抛出异常。

 处理:虽然直接取值会出异常,可用在if判断时却没问题,可以改成这样

<!-- 测试查询 -->
<select id="test" resultType="map">
  <foreach collection="list" item="item" separator=" union all ">
    SELECT 
      #{item.name,jdbcType=VARCHAR} name,
      #{item.age,jdbcType=VARCHAR} age
      <if test="item.abc != null">
	    , #{item.abc,jdbcType=VARCHAR} abc
      </if>
    FROM DUAL
  </foreach>
</select>

三、总结

在使用Mybatis时Map和List<Map>的参数绑定认为Mybatis会有相同的绑定机制,结果发现却不同,所以在使用的时候请格外注意List<Map>中没有变量名称的情况。

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值