环境
数据库: mysql
框架:mybatis-plus
场景:
数据被跳过的情况:
int pagenum = 5000;
for (int i = 0; i < pagenum; i++) {
//1000条为一页的总页数
PageHelper.startPage(i+1, 1000);
List<Items> list = baseMapper.selectList(new QueryWrapper<Items>().lambda()
.eq(Items::getBillid, imBills.getId())
.eq(Items::getState, "待处理")); // 关键代码1
for (Items item : list) {
item.setState("已处理"); // 关键代码2
baseMapper.updateById(item);
}
}
解决修复后:
int pagenum = 5000;
for (int i = 0; i < pagenum; i++) {
//1000条为一页的总页数
PageHelper.startPage(i+1, 1000);
List<Items> list = baseMapper.selectList(new QueryWrapper<Items>().lambda()
.eq(Items::getBillid, imBills.getId())
//.eq(Items::getState, "待处理")) // 关键代码1 : 去除更新字段作为条件
.orderByAsc(ImItems::getId)); // 关键代码2
for (Items item : list) {
if("待处理".equals(item.getState)) { // 关键代码3 : 在循环中过滤
item.setState("已处理");
baseMapper.updateById(item);
}
}
}
解决思路:
- 用作分页查询的字段,不可以被更新
- 分页查询条件应当根据唯一主键或唯一值的字段进行排序(ASC或DESC)。