关于当批量保存数据到数据库中时一直只有一条

https://www.518cn.com   发布时间:2025-03-18 22:40   作者:网络
摘要:@Override @Transactional(rollbackFor = Exception.class) public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyData) { String IotId = iotMsgNo

@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)){
throw new BaseException("设备不存在");
}
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();
        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("保存设备数据失败");
        }
    });
}

最终可以批量保存数据

相关文章

最新评论