需求:
数据库中存在导入记录,新导入的数据只导入数据库中不存在的,对于存在的,直接忽略。
例如下面demo,
List<String>telephoneList存放的是从数据库查询出来的不重复的电话号码,
List<TrainPerson>trainPersonList存放的是即将要导入到数据库中的数据,由于trainPersonList中有的数据已存在数据库中(以电话号,telephone字段判断属性的唯一性)
通过泛型、反射,利用Set集合特性,对数据过滤的一个通用方法。
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import cn.xdf.wlyy.domain.TrainPerson;
public class DataUtil<T> {
/**
* 去除重复记录
* @param list 要去重的数据
* @param idList 已存在的数据
* @param methodStr 以T的哪个属性值做为重复数据的判断
* @return
* @throws Exception
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T>List<T> removeDBData(List<T> list, List<String> idList, String methodStr) throws Exception {
if (idList != null && !idList.isEmpty()) {//说明之前存在导入记录
List<T> tmpList = new ArrayList<T>();
if (list != null && !list.isEmpty()) {
//利用hashset特性,进行重复元素的过滤
Set<String> idSet = new HashSet<String>();
for (String id : idList) {
idSet.add(id);
}
for (T tmp : list) {
Class clazz = tmp.getClass();
Method method = clazz.getDeclaredMethod(methodStr);
String telephone = (String) method.invoke(tmp);
if (idSet.add(telephone)) {
tmpList.add(tmp);
}
}
}
return tmpList;
} else {//之前没有导入过记录
//那么不用操作,list全部都是要导入的记录
return list;
}
}
public static void main(String[] args) {
List<TrainPerson> trainPersonList = DataUtil.removeDBData(trainPersonList, telephoneList, "getTelephone");
}
}