项目中统计数据按照每天96个点统计,每15分钟统计一次,但是到采集时间点以后数据不会完全收集到,数据会在后续不断补充并趋于完整,为了尽可能的充分统计到准确的数据我们每一个时刻进行批量更新已经统计过的字段。
对于需要批量统计的数据我们放到fieldNameList里面,把对应字段的数值放到totalLoadList。
表中需要添加对应的唯一索引用于更新数据
valList批量插入或者修改的数据
fieldNameList批量修改的字段名称列表
void batchSaveOrUpdateDuplicate(@Param("valList") List<ValVO> valList,
@Param("fieldNameList") List<String> fieldNameList);
totalLoadList批量修改的字段值,必须和fieldNameList.size一样
@Data
@EqualsAndHashCode(callSuper = false)
public class ValVO{
@ApiModelProperty("统计类型")
private String statisType;
@ApiModelProperty("区域等级1省2市3区县")
private int areaLevel;
@ApiModelProperty("区域编号")
private String areaCode;
@ApiModelProperty("区域名称")
private String areaName;
@ApiModelProperty("统计的数值")
private List<BigDecimal> totalLoadList;
}
xml
<insert id="batchSaveOrUpdateDuplicate">
INSERT INTO `data_statistics` (`level`, `area_code`, `area_name`, `data_date`, `data_type`,
<foreach collection="fieldNameList" item="item" index="index" separator=",">
${item}
</foreach>
)
VALUES
<foreach collection="valList" item="item" index="index" separator=",">
( #{item.areaLevel},#{item.areaCode}, #{item.areaName},#{date}, #{item.statisType},
<foreach collection="item.totalLoadList" item="val" index="index1" separator=",">
#{val}
</foreach>
)
</foreach>
ON DUPLICATE KEY UPDATE
<foreach collection="fieldNameList" item="item" index="index" separator=",">
${item}=VALUES(${item})
</foreach>
</insert>