说明
- 项目说明:在公司中做了某一个项目,这个项目的作用就是做文档的导入导出
- 有的数据文档的数据是直接导入AND更新
- 有的数据是直接导入
- 期间的关联关系是某一个值
项目
采用的springboot、mybatos-plus、easyexcel
思路
- 先把导入的所有数据放入到List中
- 将要查询的值封装成一个对象,
- 进行批量查询
- 将查出来的数据转换成Map<特定值,T>
- 把所有要查询的数据也转换成Map<特定值,T>
- 数据转换
- 批量更新and插入
代码
- 批量查询和批量插入
- 代码是特定的代码,但是实现思路是差不多的,
/**
* @param <T>
*/
public class ExcetListener<T extends BaseDo<T>> extends AnalysisEventListener<T> {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcetListener.class);
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 30;
List<T> addList = new ArrayList<>();
List<T> updataList = new ArrayList<>();
private IBaseDao<T> iBaseDao;
private Boolean isUpData = Boolean.FALSE;
public ExcetListener(IBaseDao<T> iBaseDao) {
this.iBaseDao = iBaseDao;
}
public ExcetListener(IBaseDao<T> iBaseDao, Boolean isUpData) {
this(iBaseDao);
this.isUpData = isUpData;
}
/**
* 这个每一条数据解析都会来调用
*
* @param testCategory
* @param analysisContext
*/
@SneakyThrows
@Override
public void invoke(T testCategory, AnalysisContext analysisContext) {
if (isUpData) {
updataList.add(testCategory);
} else {
addList.add(testCategory);
}
if (addList.size() >= BATCH_COUNT || updataList.size() >= BATCH_COUNT) {
saveData();
addList.clear();
updata();
updataList.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param analysisContext
*/
@SneakyThrows
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
saveData();
updata();
}
/**
* 加上存储数据库
*/
private void saveData() {
if (addList.isEmpty()) {
return;
}
iBaseDao.saveBatch(addList, BATCH_COUNT);
}
private void updata() throws Exception {
if (updataList.isEmpty()) {
return;
}
//这些是要进行更新的
Map<String, T> updataMap = iBaseDao.listBatchByEntityList(getQueryList()).stream()
.collect(Collectors.toMap(T::getOnlyCode, Function.identity()));
//所有数据
Map<String, T> collect = updataList.stream().collect(Collectors.toMap(T::getOnlyCode, Function.identity()));
collect.forEach((key, value) -> {
T t = updataMap.get(key);
if (t != null) {
value.setId(t.getId());
}
});
updataList = new ArrayList<>(collect.values());
iBaseDao.saveOrUpdateBatch(updataList);
}
public List<T> getQueryList() throws Exception {
List<T> queryList = Lists.newArrayList();
for (T t : updataList) {
try {
Class<? extends BaseDo> aClass = t.getClass();
T baseDo = (T) aClass.newInstance();
baseDo.setOnlyCode(t.getOnlyCode());
queryList.add(baseDo);
} catch (Exception e) {
e.printStackTrace();
}
}
return queryList;
}
}