记一次因为int类型引起的Mybatis生产事故的解决

事故原因

实体类的field类型是int时, 尽管没有赋值, 但是mybatis查询得到的是0,
在update时, 没有判断为0时不要更新, 导致state更新为0

表DDL

CREATE TABLE `t_xxx` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `state` tinyint(4) NOT NULL DEFAULT '1' COMMENT '催收状态. 1: 状态A, 2: 状态B, 3: 状态C, 4: 状态D',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15189 DEFAULT CHARSET=utf8 COMMENT='xx表';

生产事故的Mybatis Xml

<update id="updateCollectionOverdue" parameterType="com.xxx.Pojo">  
        <foreach collection="list" separator=";" item="element">  
            UPDATE t_xxx SET 
                <if test="element.state != null>
                state = #{element.state},
                </if>
                update_time = CURRENT_TIMESTAMP,
            WHERE id = #{element.id}
        </foreach>  
    </update>

实体类

public class Pojo {
    private Long id;
    private int state;
    // getter and setter is omitting
}

修复后的Mybatis Xml

<update id="updateCollectionOverdue" parameterType="com.xxx.Pojo">  
        <foreach collection="list" separator=";" item="element">  
            UPDATE t_xxx SET 
                <if test="element.state != null and element.state != 0 " >
                state = #{element.state},
                </if>
            WHERE id = #{element.id}
        </foreach>  
    </update>

猜你喜欢

转载自blog.csdn.net/caib1109/article/details/79560153