在日常开发中会遇到这样的情景,前端页面编辑了一个数据库中的列表信息,然后将编辑完的列表数据一次性发送到后端,后端将获得的列表数据与数据库中的进行对比然后更新到数据库中。这种情况下每次都要进行重复性的编码工作,为了优化这个情况,本人抽象出了一个工具来处理这种情况。
/**
*
* @param pageList 从页面获取的数据列表
* @param dbList 从数据库查询获得的数据列表
* @param compareFunc 函数式接口,第一个参数是数据库的实体对象,第二个参数是页面的实体对象
* @param merge 函数式接口,第一个参数是页面的实体对象,第二个参数是数据库的实体对象 用来合并页面实体对象的信息到数据库实体对象上
* @param <T> 实体泛型
* @return 返回增,删,改的三个列表
*/
import java.util.*;
import java.util.function.BiPredicate;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
public class UpdateListToDb {
public static <T> List<List<T>> compareAndUpdate(List<T> pageList,List<T> dbList, BiPredicate<T,T> compareFunc, BinaryOperator<T> merge) {
//定义三个列表,分别表示需要在数据库中进行删除的列表deleteList,需要在数据库中进行更新的列表updateList,需要在数据库进行新增的列表insertList
List<T> deleteList = new ArrayList<>();
List<T> updateList = new ArrayList<>();
List<T> insertList = new ArrayList<>();
//遍历dbList,找出需要删除或更新的对象
for (T dbObj : dbList) {
//定义一个标志变量,表示是否在pageList中找到了相同的对象
boolean found = false;
//遍历pageList,查找相同的对象
for (T pageObj : pageList) {
//使用compareFunc比较两个对象是否相等
if (compareFunc.test(pageObj, dbObj)) {
//如果相等,则说明是同一个对象
//将标志变量设为true
found = true;
//跳出内层循环
break;
}
}
//如果没有找到相同的对象,则说明需要删除
if (!found) {
//将dbObj添加到deleteList中
deleteList.add(dbObj);
}
}
//遍历pageList,找出需要新增或更新的对象
for (T pageObj : pageList) {
//定义一个标志变量,表示是否在dbList中找到了相同的对象
boolean found = false;
//遍历dbList,查找相同的对象
for (T dbObj : dbList) {
//使用compareFunc比较两个对象是否相等
if (compareFunc.test(pageObj, dbObj)) {
//如果相等,则说明是同一个对象
//将标志变量设为true
found = true;
//使用update方法更新dbObj的属性为pageObj的属性
dbObj = merge.apply(pageObj,dbObj);
//将dbObj添加到updateList中
if (dbObj!=null){
updateList.add(dbObj);
}
//跳出内层循环
break;
}
}
//如果没有找到相同的对象,则说明需要新增
if (!found) {
//将pageObj添加到insertList中
insertList.add(pageObj);
}
}
//返回三个列表组成的列表作为结果
return Arrays.asList(insertList,deleteList, updateList);
}
public static <T> List<List<T>> compareAndUpdateToDb(
List<T> pageList,
List<T> dbList,
BiPredicate<T, T> compareFunc,
BinaryOperator<T> merge,
Consumer<List<T>> insertAction,
Consumer<List<T>> deleteAction,
Consumer<List<T>> updateAction
) {
//定义三个列表,分别表示需要在数据库中进行删除的列表deleteList,需要在数据库中进行更新的列表updateList,需要在数据库进行新增的列表insertList
List<T> deleteList = new ArrayList<>();
List<T> updateList = new ArrayList<>();
List<T> insertList = new ArrayList<>();
//遍历dbList,找出需要删除或更新的对象
for (T dbObj : dbList) {
//定义一个标志变量,表示是否在pageList中找到了相同的对象
boolean found = false;
//遍历pageList,查找相同的对象
for (T pageObj : pageList) {
//使用compareFunc比较两个对象是否相等
if (compareFunc.test(pageObj, dbObj)) {
//如果相等,则说明是同一个对象
//将标志变量设为true
found = true;
//跳出内层循环
break;
}
}
//如果没有找到相同的对象,则说明需要删除
if (!found) {
//将dbObj添加到deleteList中
deleteList.add(dbObj);
}
}
//遍历pageList,找出需要新增或更新的对象
for (T pageObj : pageList) {
//定义一个标志变量,表示是否在dbList中找到了相同的对象
boolean found = false;
//遍历dbList,查找相同的对象
for (T dbObj : dbList) {
//使用compareFunc比较两个对象是否相等
if (compareFunc.test(pageObj, dbObj)) {
//如果相等,则说明是同一个对象
//将标志变量设为true
found = true;
//使用update方法更新dbObj的属性为pageObj的属性
dbObj = merge.apply(pageObj, dbObj);
//将dbObj添加到updateList中
if (dbObj != null) {
updateList.add(dbObj);
}
//跳出内层循环
break;
}
}
//如果没有找到相同的对象,则说明需要新增
if (!found) {
//将pageObj添加到insertList中
insertList.add(pageObj);
}
}
// 若insertAction不为null,则执行数据库插入操作
if (insertAction != null) {
insertAction.accept(insertList);
}
// 若updateAction不为null,则执行数据库更新操作
if (updateAction != null) {
updateAction.accept(updateList);
}
// 若deleteAction不为null,则执行数据库删除操作
if (deleteAction != null) {
deleteAction.accept(deleteList);
}
//返回三个列表组成的列表作为结果
return Arrays.asList(insertList, deleteList, updateList);
}
public static <T> List<List<T>> processUpdateList(
List<T> updateList,
BiPredicate<T, T> compareFunc,
Consumer<List<T>> deleteAction,
Consumer<List<T>> updateAction
) {
List<T> toBeDeleted = new ArrayList<>();
List<T> toBeUpdated = new ArrayList<>();
Set<T> encountered = new HashSet<>();
for (T currentItem : updateList) {
boolean isDuplicate = false;
// 检查当前项目是否已经遇到过
for (T encounteredItem : encountered) {
if (compareFunc.test(currentItem, encounteredItem)) {
isDuplicate = true;
break;
}
}
if (isDuplicate) {
// 如果这个元素是重复的,则添加到删除列表
toBeDeleted.add(currentItem);
} else {
// 否则,添加到更新列表并标记为已遇到
toBeUpdated.add(currentItem);
encountered.add(currentItem);
}
}
if (!toBeDeleted.isEmpty() && deleteAction != null) {
deleteAction.accept(toBeDeleted);
}
if (!toBeUpdated.isEmpty() && updateAction != null) {
updateAction.accept(toBeUpdated);
}
return Arrays.asList(toBeUpdated, toBeDeleted);
}
}