资产信息更新:如何实现MyBatis非空字段更新避免图片被替换?
解决MyBatis更新资产图片时仅非空字段才更新的问题
开发资产信息更新页面,包含图片上传功能。目前遇到的问题是:已有图片的资产在更新时如果不更换图片,原有头像会被默认图片覆盖。核心需求很明确:只有当img和originImg不为空字符串时,才执行这两个字段的更新操作。
之前尝试用MyBatis的<choose>标签实现判断,但修改后的代码存在拼写错误和语法问题,导致方案无效。
问题代码分析
尝试的修改代码里有两处致命错误:
<when>标签的属性写错了,把test写成了tes- 嵌套了多余的
<choose>标签,导致MyBatis解析SQL时出错
正确解决方案
用<if>标签更适合这种单条件判断场景,直接在SQL的SET块里针对img和originImg添加非空判断即可。同时要注意,判断条件需要同时校验null和空字符串(因为未上传图片时这两个参数会返回空字符串"")。
修正后的完整MyBatis更新语句如下:
<update id="update_hw" parameterType="java.util.Map"> UPDATE ASSETINFO SET assetCode = #{assetCode}, assetRegGb = #{assetRegGb}, <choose> <when test="autoFlag != null"> autoFlag = #{autoFlag}, </when> </choose> rentalCode = #{rentalCode}, rentalPrice = #{rentalPrice}, receiveDate = #{receiveDate}, rentalRtnDate = #{rentalRtnDate}, item = #{item}, <choose> <when test="telecom != null"> telecom = #{telecom}, </when> </choose> <choose> <when test="phnNum != null"> phnNum = #{phnNum}, </when> </choose> maker = #{maker}, moName = #{moName}, serial = #{serial}, spec = #{spec}, purpose = #{purpose}, location = #{location}, <if test="img != null and img != ''"> img = #{img}, </if> <if test="originImg != null and originImg != ''"> originImg = #{originImg}, </if> deleteYn = #{deleteYn}, updateDate = sysdate() WHERE assetCode = #{beforeAssetCode} AND cpId = #{cpId} AND deleteYn = 'N' </update>
补充说明
- 用
<if>替代<choose>是因为我们只需要做单一条件判断,<choose>更适合多选一的场景,用<if>更简洁直观。 - 条件里同时判断
!= null和!= ''是为了覆盖参数可能为null或者空字符串的两种情况,确保只有真正有图片数据时才更新字段。 - 注意SQL语句里的逗号:每个
<if>块里的字段语句后面带逗号,因为后面还有固定的deleteYn和updateDate字段,不会出现最后一个字段多逗号的语法错误。
内容的提问来源于stack exchange,提问作者JDANK
相关产品推荐
相关产品推荐

