- 错误用法
xml
<update id="updatePropertiesBatch" parameterType="java.util.Map">
<foreach collection="codePropertiesMap.entrySet()" item="entry" separator=",">
update payment_channel
set properties = #{entry.value}
where code = #{entry.key}
</foreach>
</update>
这样会报错:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'key' in 'class java.lang.String'
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
at com.sun.proxy.$Proxy74.update(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:287)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:65)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:96)
at com.sun.proxy.$Proxy75.updatePropertiesBatch(Unknown Source)
- 正确用法
xml
<update id="updatePropertiesBatch" parameterType="java.util.Map">
<foreach collection="codePropertiesMap" item="value" index="key" separator=";">
update payment_channel
set properties = #{value}
where code = #{key}
</foreach>
</update>
使用批量更新需要加入allowMultiQueries=true
- 批量更新--没有设置allowMultiQueries=true时
xml
<update id="updatePropertiesBatch" parameterType="java.util.Map">
UPDATE payment_channel
SET properties = CASE code
<foreach collection="codePropertiesMap" index="key" item="value" separator=" " open="" close="">
WHEN #{key} THEN #{value}
</foreach>
ELSE properties -- 如果没有匹配的code,则保持原值不变
END,
update_time = NOW() -- 更新时间戳
WHERE code IN
<foreach collection="codePropertiesMap" index="key" open="(" separator="," close=")">
#{key}
</foreach>
</update>