//查询表中的数据并保存在lastResult lastResult = jxMjKhTxService.getLastData(constantProperties.getJsbh()); // 获取当前接口查询结果 List<Map<String, Object>> result = jxMjKhTxService.selectJxMjkhTxData(constantProperties.getJsbh()); // 待插入的数据 List<Map<String, Object>> toBeInserted = new ArrayList<>(); // 待更新的数据 List<Map<String, Object>> toBeUpdated = new ArrayList<>(); // 待删除的数据 List<Map<String, Object>> toBeDeleted = new ArrayList<>(); // 遍历上一次查询结果,看看是否需要更新或删除 for (Map<String, Object> last : lastResult) { 第一次运行这个getLastData 没数据怎么办
时间: 2023-06-27 21:04:04 浏览: 113
如果第一次运行 `getLastData` 没有数据,那么 `lastResult` 就会是一个空列表。在这种情况下,你可以直接跳过遍历 `lastResult` 的步骤,直接将当前查询结果作为待插入的数据。例如:
```
lastResult = jxMjKhTxService.getLastData(constantProperties.getJsbh());
if (lastResult.isEmpty()) {
toBeInserted = result;
} else {
// 遍历上一次查询结果,看看是否需要更新或删除
for (Map<String, Object> last : lastResult) {
// ...
}
}
```
相关问题
package wffz.jxmjkh.controller; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import wffz.common.contants.ConstantProperties; import wffz.jxmjkh.service.JxMjKhTxService; import java.util.ArrayList; import java.util.List; import java.util.Map; public class SaveResultTask implements Runnable { private JxMjKhTxService jxMjKhTxService; // 上一次查询结果 private static List<Map<String, Object>> lastResult = new ArrayList<>(); private ConstantProperties constantProperties; public SaveResultTask(JxMjKhTxService jxMjKhTxService) { this.jxMjKhTxService = jxMjKhTxService; run(); } @SneakyThrows @Override public void run() { //查询表中的数据并保存在lastResult lastResult = jxMjKhTxService.getLastData(constantProperties.getJsbh()); // 获取当前接口查询结果 List<Map<String, Object>> result = jxMjKhTxService.selectJxMjkhTxData(constantProperties.getJsbh()); // 待插入的数据 List<Map<String, Object>> toBeInserted = new ArrayList<>(); // 待更新的数据 List<Map<String, Object>> toBeUpdated = new ArrayList<>(); // 待删除的数据 List<Map<String, Object>> toBeDeleted = new ArrayList<>(); // 遍历上一次查询结果,看看是否需要更新或删除 for (Map<String, Object> last : lastResult) { boolean found = false; for (Map<String, Object> current : result) { if (StringUtils.equals((CharSequence) current.get("jsbh"), (CharSequence) last.get("jsbh")) && StringUtils.equals((CharSequence) current.get("txxId"), (CharSequence) last.get("txxId")) && StringUtils.equals((CharSequence) current.get("sm"), (CharSequence) last.get("sm"))) { found = true; break; } } if (!found) { toBeDeleted.add(last); } } // 遍历当前查询结果,看看是否需要插入或更新 for (Map<String, Object> current : result) { boolean found = false; for (Map<String, Object> last : lastResult) { if (StringUtils.equals((CharSequence) current.get("jsbh"), (CharSequence) last.get("jsbh")) && StringUtils.equals((CharSequence) current.get("txxId"), (CharSequence) last.get("txxId")) && StringUtils.equals((CharSequence) current.get("sm"), (CharSequence) last.get("sm"))) { found = true; break; } } if (found) { toBeUpdated.add(current); } else { toBeInserted.add(current); } } // 批量插入 if (!toBeInserted.isEmpty()) { jxMjKhTxService.batchInsert(toBeInserted); } // 批量更新 if (!toBeUpdated.isEmpty()) { jxMjKhTxService.batchUpdate(toBeUpdated); } // 批量删除 if (!toBeDeleted.isEmpty()) { jxMjKhTxService.batchDelete(toBeDeleted); } // 保存本次查询结果 lastResult = result; } }代码不运行
这段代码是一个定时任务,会定时查询数据库中的数据,并与上一次查询结果进行比较,根据比较结果进行插入、更新或删除操作。具体实现逻辑为:
1. 查询上一次查询结果并保存在 `lastResult` 中。
2. 获取当前的查询结果。
3. 遍历上一次查询结果,如果在当前查询结果中找不到该条数据,则将其添加到待删除列表 `toBeDeleted` 中。
4. 遍历当前查询结果,如果在上一次查询结果中找到了该条数据,则将其添加到待更新列表 `toBeUpdated` 中;否则将其添加到待插入列表 `toBeInserted` 中。
5. 批量插入 `toBeInserted` 中的数据。
6. 批量更新 `toBeUpdated` 中的数据。
7. 批量删除 `toBeDeleted` 中的数据。
8. 保存本次查询结果到 `lastResult` 中。
需要注意的是,这段代码中使用了 Lombok 注解 `@SneakyThrows`,表示在方法中使用了可能会抛出异常的代码,但是不需要显式地使用 try-catch 块进行处理。同时,这段代码没有在类上添加 `@Controller` 或 `@Service` 等注解,无法被 Spring 容器扫描和管理,因此不会执行。
List<Map<String, Object>> toBeInserted = new ArrayList<>(); // 获取当前接口查询结果 List<Map<String, Object>> result = jxMjKhTxService.selectJxMjkhTxData(constantProperties.getJsbh()); // 待插入的数据 // 待更新的数据 List<Map<String, Object>> toBeUpdated = new ArrayList<>(); // 待删除的数据 List<Map<String, Object>> toBeDeleted = new ArrayList<>(); if (lastResult.isEmpty()) { toBeInserted.addAll(result); } else { // 遍历上一次查 can not find local varialbl 如何修改
你需要先声明一个变量 `lastResult` 并将其赋值为上一次查询的结果,然后才能在代码中使用。可以像下面这样修改代码:
```
List<Map<String, Object>> toBeInserted = new ArrayList<>();
// 获取当前接口查询结果
List<Map<String, Object>> result = jxMjKhTxService.selectJxMjkhTxData(constantProperties.getJsbh());
// 上一次查询结果
List<Map<String, Object>> lastResult = ... // 这里需要根据实际情况来获取
// 待更新的数据
List<Map<String, Object>> toBeUpdated = new ArrayList<>();
// 待删除的数据
List<Map<String, Object>> toBeDeleted = new ArrayList<>();
if (lastResult.isEmpty()) {
toBeInserted.addAll(result);
} else {
// 遍历上一次查询结果,判断哪些数据需要插入、更新或删除
for (Map<String, Object> last : lastResult) {
String id = last.get("id").toString();
boolean exist = false;
for (Map<String, Object> cur : result) {
if (id.equals(cur.get("id").toString())) {
exist = true;
if (!last.equals(cur)) {
toBeUpdated.add(cur);
}
break;
}
}
if (!exist) {
toBeDeleted.add(last);
}
}
// 处理新增数据
for (Map<String, Object> cur : result) {
String id = cur.get("id").toString();
boolean exist = false;
for (Map<String, Object> last : lastResult) {
if (id.equals(last.get("id").toString())) {
exist = true;
break;
}
}
if (!exist) {
toBeInserted.add(cur);
}
}
}
// 插入待插入的数据
for (Map<String, Object> insert : toBeInserted) {
// TODO: 插入数据的操作
}
// 更新待更新的数据
for (Map<String, Object> update : toBeUpdated) {
// TODO: 更新数据的操作
}
// 删除待删除的数据
for (Map<String, Object> delete : toBeDeleted) {
// TODO: 删除数据的操作
}
```
请注意,这里只是一个示例代码,具体的实现需要根据实际情况进行调整。
阅读全文