前言
今天在做接口实现时,报了这个错误,也是很纳闷。
- 接口
int decreaseRedPacketByVersion(Integer id, Integer version);
- 实现SQL
<update id="decreaseRedPacketByVersion">
update t_red_packet
set
stock = stock - 1,
version = version + 1
where
id = #{id}
and version = #{version}
</update>
结果运行的时候就报了上面的错误,调试发现传递的参数都是有值的,但是为什么会报这个错。
原来这与Mybatis的参数匹配机制有关,当传递多个参数的时候,映射机制并不清楚如何匹配到正确的参数。
解决办法
- 使用@Param参数
int decreaseRedPacketByVersion(@Param("id") Integer id, @Param("version") Integer version);
- 指定参数位置
<update id="decreaseRedPacketByVersion">
update t_red_packet
set
stock = stock - 1,
version = version + 1
where
id = #{0,jdbcType=INTEGER}
and version = #{1,jdbcType=INTEGER}
</update>
- 使用map方式传参
int decreaseRedPacketByVersion(Map<String, Object> map);
map 的键名对应sql中的字段名称,实质与@Param类似。