课题提出:表格中存在大量数据,至少有1000条数据,如果想要给此1000条数据中的其中一条移动位置,一个排序字段也可以满足此功能,但是如果改变了其中一条数据,那此条数据下面的数据都需要修改,这样修改的效率就很低,如何设计才能使数据移动排序效率高呢?
我感觉最合理的方式就是用2个字段进行排序,能够效率的进行数据移动排序。
理论:
1、使用两个字段orderNo和orderNoBk进行排序。
2、新增的时候,分三种,第一种是此表格没有数据,新增第一条数据时,2个字段的值都赋值1,第二种是此表格已经存在数据,选中其中一条数据,在此条之后增加数据,新增的数据的orderNo字段和选中的数据的orderNo相同,并且orderNoBk比选中的数据+1,其他的和选中数据的orderNo相同的数据的,并且orderNoBk比选中数据的大的数据,如果这种数据存在的话,orderNoBk字段+1进行更新,新增的数据做新增操作。第三种是未选中任何数据,新增数据,这时,只需要查询出数据库中此类数据的orderNo字段最大的值,并且此值+1,新数据做新增处理。
3、排序的时候,分两种,第一种是将一条数据移动到数据的首位,那么此数据修改为orderNo和orderNoBk都是1,并且把所有orderNo是1的数据的orderNoBk字段做+1处理,错做过的数据做更新,第二种是将一条数据移动到某条数据的后面,那么移动的数据的orderNo变更为某条数据的orderNo相同,orderNoBk变更为某条数据的+1,并且查询和某条数据的orderNo相同的数据并且orderNoBk比某条数据的大的数据+1,并且移动的数据和orderNoBk比某条数据的大的数据做更新处理
新增代码如下:
public Integer save(Model model) throws Exception {
// orderNo = 1 是新增的第一条
int orderNo = model.getOrderNo();
if(orderNo == 1){
model.setOrder_no(1);
model.setOrder_no_bk(1);
return // 执行新增操作
}
// 如果orderNo = 0 selectModelId 不等于空,是选中了某一条的后面造一条
String selectModelId = model.getSelectModelId();
if(StringUtils.isNotBlank(selectModelId)){
// 查询出orderNo相同的数据,并且按照从小到大排序
List<Model> models = xxxxxx查询相同orderNo的方法;
Model selectModel = null;
Iterator<Model> modelIterator = projectModels.iterator();
Model element;
while (modelIterator.hasNext()) {
element = modelIterator.next();
// 查询到呗选中的数据,赋值
if(selectModelId.equals(element.getId())){
selectModel = element;
}
if(selectModel != null){
// orderNoBk大的留下
if(element.getOrderNoBk() > selectModel.getOrderNoBk()){
element.setOrderNoBk(element.getOrderNoBk()+1);
element.setUpdateTime(LocalDateTime.now());
element.setUpdateUser(Model.getUpdateUser());
}else{
// orderNoBk 等于的删除
modelIterator.remove();
}
}else{
// orderNoBk 小于的删除
modelIterator.remove();
}
}
if(null != selectModel){
model.setOrderNo(selectModel.getOrderOo());
model.setOrderNoBk(selectModel.getOrderNoBk()+1);
}
// models 执行更新操作
return // model 执行新增操作
}
// 如果orderNo = 0 selectModelId 不等于空,是没选中一条,在最后造一条,查询出最后一条
Model lastOne = 查询出orderNo最大的那条数据
model.setOrderNo(lastOne.getOrder_no()+1);
model.setOrderNoBk(1);
return // model 执行新增操作
}
排序的代码
public void sort(List<Model> models, String userId) throws Exception{
// 获取选中的数据
Model selectModel = models.get(0);
String type = selectModel.getType();
// 如果集合中只有一个值,说明选中的数据被挪到了第一的位置,没有前一个数据
if(1 == Models.size()){
// 查询出orderNo=1的相同的数据数据
List<Model> projectModels = xxxxxx查询相同orderNo=1的方法;
// OrderNoBk 都+1
models.forEach(any-> any.setOrderNoBk(any.getOrderNoBk()+1));
// 选中的数据初始化 orderNo(1) 和 orderNoBk(1)
selectModel.setOrderNo(1);
selectModel.setOrderNoBk(1);
models.add(selectModel);
// models 更新操作
return;
}
// 变换后,选中数据的前一个数据
Model frontModel = models.get(1);
String modelId = frontModel.getId();
List<Model> pModels = xxxx查询出和选中数据相同orderNo的数据;
Iterator<Model> modelIterator = pModels.iterator();
Model element;
while (modelIterator.hasNext()){
element = modelIterator.next();
if(element.getOrderNoBk() > frontModel.getOrderNoBk()){
// orderNoBk > frontModel的 OrderNoBk的数据数据+1,并做更新
element.setOrderNoBk(element.getOrderNoBk()+1);
}else {
// 删除掉 OrderNoBk <= frontModel的 OrderNoBk的数据数据
modelIterator.remove();
}
}
selectModel.setOrderNo(frontModel.getOrderNo());
selectModel.setOrderNoBk(frontModel.getOrderNoBk()+1);
pModels.add(selectModel);
// pModels 做更新处理
}
上面即使我所说的2个字段在数据量大的时候排序方法,非常的高效,有小伙伴有这种需求,可以按照我这种方法实行,如果有看的不懂的地方,添加微信【xia-5618】进行沟通。