鞭氅 发表于 2025-6-11 10:55:33

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

@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("保存设备数据失败");
      }
    });
}最终可以批量保存数据

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

茹静曼 发表于 2025-10-13 00:00:33

这个好,看起来很实用

凳舒 发表于 2025-12-18 12:06:43

新版吗?好像是停更了吧。

臧莞然 发表于 2025-12-18 16:03:58

收藏一下   不知道什么时候能用到

襁壮鸢 发表于 2025-12-23 04:20:05

感谢分享,学习下。

马璞玉 发表于 2025-12-29 06:37:55

懂技术并乐意极积无私分享的人越来越少。珍惜

句惫 发表于 2026-1-16 07:46:45

谢谢分享,辛苦了

舒菀菀 发表于 2026-1-16 09:21:29

谢谢分享,试用一下

袂沐 发表于 2026-1-24 09:39:32

yyds。多谢分享

旌磅箱 发表于 2026-1-29 08:52:14

喜欢鼓捣这些软件,现在用得少,谢谢分享!

许娴广 发表于 2026-2-2 04:00:35

分享、互助 让互联网精神温暖你我

荡俊屯 发表于 2026-2-8 09:47:22

这个有用。

思矿戳 发表于 2026-2-9 15:29:28

感谢发布原创作品,程序园因你更精彩

峰埋姚 发表于 2026-2-10 06:58:59

过来提前占个楼

史华乐 发表于 2026-2-10 13:48:20

谢谢分享,试用一下

鞣谘坡 发表于 2026-2-12 04:26:16

东西不错很实用谢谢分享

滑清怡 发表于 2026-2-12 15:51:29

收藏一下   不知道什么时候能用到

琉艺戕 发表于 2026-2-21 04:47:34

鼓励转贴优秀软件安全工具和文档!

骆熙华 发表于 2026-2-22 09:01:25

喜欢鼓捣这些软件,现在用得少,谢谢分享!

赏勿 发表于 2026-2-25 12:27:52

不错,里面软件多更新就更好了
页: [1] 2
查看完整版本: 关于当批量保存数据到数据库中时一直只有一条数据的问题