关于当批量保存数据到数据库中时一直只有一条数据的问题
@Override@Transactional(rollbackFor = Exception.class)
public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyData) {
String IotId = iotMsgNotifyData.getHeader().getDeviceId();
LambdaQueryWrapper deviceLambdaQueryWrapper = new LambdaQueryWrapper();
deviceLambdaQueryWrapper.eq(Device::getIotId, IotId);
// 查到设备信息
Device device = deviceMapper.selectOne(deviceLambdaQueryWrapper);
if (ObjectUtil.isEmpty(device)) {
throw new BaseException("设备不存在");
}
// 从设备实体中获取数据,赋值到设备数据实体中
// 把IOT获取到设备数据复制到设备数据实体中
List dataList = new ArrayList();
DeviceData deviceData = BeanUtil.toBean(device, DeviceData.class);
iotMsgNotifyData.getBody().getServices().forEach(item -> {
// 把字符串格式化成LocalDateTime
LocalDateTime time = LocalDateTimeUtil.parse(item.getEventTime(), "yyyyMMdd'T'HHmmss'Z'");
LocalDateTime alarmTime = time.atZone(ZoneId.from(ZoneOffset.UTC))
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"))
.toLocalDateTime();
item.getProperties().forEach((k, v) -> {
deviceData.setFunctionId(k);
deviceData.setAccessLocation(device.getRemark());
deviceData.setDataValue(v.toString());
deviceData.setAlarmTime(alarmTime);
// 批量保存数据
dataList.add(deviceData);
});
});
// saveBatch(dataList);
if (!saveBatch(dataList)) {
throw new BaseException("保存设备数据失败");
}
}
如上代码,没有将bean放置于循环之中,在经过下面的循环语句进行其他数据添加时一直都是修改的一个数据导致只能添加一个数据进入数据库
应将加粗的代码放置于循环之中
@Override
@Transactional(rollbackFor = Exception.class)
public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyData) {
String IotId = iotMsgNotifyData.getHeader().getDeviceId();
LambdaQueryWrapper deviceLambdaQueryWrapper = new LambdaQueryWrapper();
deviceLambdaQueryWrapper.eq(Device::getIotId, IotId);
// 查到设备信息
Device device = deviceMapper.selectOne(deviceLambdaQueryWrapper);
if (ObjectUtil.isEmpty(device)) {
throw new BaseException("设备不存在");
}
// 从设备实体中获取数据,赋值到设备数据实体中
// 把IOT获取到设备数据复制到设备数据实体中
List dataList = new ArrayList();
iotMsgNotifyData.getBody().getServices().forEach(item -> {
// 把字符串格式化成LocalDateTime
LocalDateTime time = LocalDateTimeUtil.parse(item.getEventTime(), "yyyyMMdd'T'HHmmss'Z'");
LocalDateTime alarmTime = time.atZone(ZoneId.from(ZoneOffset.UTC))
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"))
.toLocalDateTime();
DeviceData deviceData = BeanUtil.toBean(device, DeviceData.class);
item.getProperties().forEach((k, v) -> {
deviceData.setFunctionId(k);
deviceData.setAccessLocation(device.getRemark());
deviceData.setDataValue(v.toString());
deviceData.setAlarmTime(alarmTime);
// 批量保存数据
dataList.add(deviceData);
});
});
// saveBatch(dataList);
if (!saveBatch(dataList)) {
throw new BaseException("保存设备数据失败");
}
}
最后批量保存数据至数据库一直都只有四条,因将原来的数据转为一个bean,在bean中的id在数据库中是固定的所以后面修改的数据都是替换之前的数据并未一同保存至数据库中故再次修改代码如下:
@Override
@Transactional(rollbackFor = Exception.class)
public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyData) {
String IotId = iotMsgNotifyData.getHeader().getDeviceId();
LambdaQueryWrapper deviceLambdaQueryWrapper = new LambdaQueryWrapper();
deviceLambdaQueryWrapper.eq(Device::getIotId,IotId);
//查到设备信息
Device device = deviceMapper.selectOne(deviceLambdaQueryWrapper);
if (ObjectUtil.isEmpty(device)){
thrownew BaseException("设备不存在");
}
ListdataList=new ArrayList();
//如果存在的话 把设备的信息 加到 传入的数据里
iotMsgNotifyData.getBody().getServices().forEach(item->{
//把字符串格式化成LocalDateTime
LocalDateTime time = LocalDateTimeUtil.parse(item.getEventTime(), "yyyyMMdd'T'HHmmss'Z'");
LocalDateTime alarmTime = time.atZone(ZoneId.from(ZoneOffset.UTC))
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"))
.toLocalDateTime();
item.getProperties().forEach((k,v)->{
DeviceData build = DeviceData.builder().iotId(device.getIotId())
.deviceName(device.getDeviceName())
.productKey(device.getProductKey())
.productName(device.getProductName())
.functionId(k)
.dataValue(v.toString())
.alarmTime(alarmTime)
.accessLocation(device.getRemark())
.locationType(device.getLocationType())
.physicalLocationType(device.getPhysicalLocationType())
.deviceDescription("")
.build();
dataList.add(build);
});
//批量保存
if (!saveBatch(dataList)) {
throw new BaseException("保存设备数据失败");
}
});
}最终可以批量保存数据
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 这个好,看起来很实用 新版吗?好像是停更了吧。 收藏一下 不知道什么时候能用到 感谢分享,学习下。 懂技术并乐意极积无私分享的人越来越少。珍惜 谢谢分享,辛苦了 谢谢分享,试用一下 yyds。多谢分享 喜欢鼓捣这些软件,现在用得少,谢谢分享! 分享、互助 让互联网精神温暖你我 这个有用。 感谢发布原创作品,程序园因你更精彩 过来提前占个楼 谢谢分享,试用一下 东西不错很实用谢谢分享 收藏一下 不知道什么时候能用到 鼓励转贴优秀软件安全工具和文档! 喜欢鼓捣这些软件,现在用得少,谢谢分享! 不错,里面软件多更新就更好了
页:
[1]
2