MyBatis 批量更新数据时,发现所有数据全部更新为最后一条数据了
问题描述:
数据集合中的数据没有问题,ID也不重复,数据都是没有问题的,问题就是调用方法后,总是把所有数据全部更新为集合中最后一条了,代码又很少,还出现这个问题,心塞! 查了不少资料都没有发现问题。
baseMapper.batchUpdateHisData(tblCollectdataDailyHisList);
最后,把数据库日志打开,看详细的sql语句,发现犯了一个 “要打自己耳光”的问题,
就是:java 实体Bean定义的ID数据类型为:Long型,而数据库ID定义的是Varchar类型,编译运行都是没有问题的。
但是,在做查询和更新的时候就有问题了,如下:
语句1:select * from tbl_collectdata_daily_his where id =1119096228680642561
能查询到所有数据
语句2:select * from tbl_collectdata_daily_his where id =“1119096228680642561”
只能查询一条数据.
分析到这里就水落石出了^_^
1.表结构,如下:
表数据,如下:
2.以下是Mapper.xml配置文件中批量更新数据的语句
<update id="batchUpdateHisData" parameterType="java.util.List">
<foreach collection="list" item="item" separator=";">
update tbl_collectdata_daily_his
<set>
<if test="item.reportDate != null">
report_date = #{item.reportDate},
</if>
<if test="item.reportTimes != null">
report_times = #{item.reportTimes},
</if>
<if test="item.temperature != null">
temperature = #{item.temperature},
</if>
<if test="item.humidity != null">
humidity = #{item.humidity},
</if>
<if test="item.electricity != null">
electricity = #{item.electricity},
</if>
<if test="item.synstatus != null">
synstatus = #{item.synstatus},
</if>
</set>
where id= #{item.id}
</foreach>
</update>
3.实体Bean对象,如下:
@TableName("tbl_collectdata_daily_his")
public class TblCollectdataDailyHis extends BaseDomain {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 租户ID
*/
@TableField("domain_id")
private String domainId;
/**
* imei设备ID
*/
private String imei;
/**
* 上报时间
*/
@TableField("report_date")
private Date reportDate;
/**
* 上报次数
*/
@TableField("report_times")
private String reportTimes;
/**
* 预定时间,这个预定时间用于与采集时间进行对比并且进行计算来运用.
*/
@TableField("preset_time")
private Date presetTime;
/**
* 预定时间字符串:用于展示,如设备每隔30分钟上报一次,而一天是24个小时,则需要预先划分48个时段.
*/
@TableField("preset_time_str")
private String presetTimeStr;
...........................
public abstract class BaseDomain implements Serializable{
private static final long serialVersionUID = -1604919010316594986L;
@JsonSerialize(using=ToStringSerializer.class)
@TableId(type = IdType.ID_WORKER)
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}