若依系统导入Excel时如果有字典字段,最好加校验判断该字典字段的值是否能够匹配到,如果匹配失败证明该值填错呢,要么生成错误报告提示要么直接提示导入失败不让导入。
如果当有很多列都是字典字段时,而且Excel数据量特别大,如果用若依默认提供的方法判断,个人感觉耗时比较长,因为一个字典字段校验就得查库一次,如果能够查到就证明该填写的在该字典数据里能匹配到,查不到就证明填写有误。
/**
* 根据字典类型和字典键值查询字典数据信息
*
* @param dictType 字典类型
* @param dictValue 字典键值
* @return 字典标签
*/
public String selectDictLabel(String dictType, String dictValue);
于是我写了个简单判断方法
private boolean judgeDictData(String dictType, String dictValue) {
String str = iSysDictDataService.selectDictLabel(dictType, dictValue);
if (StringUtils.isNull(str)) {
return false;
}
return true;
}
最后发现导入对每列校验这块特别耗时,光校验这就用了128秒
后来我想耗时的一大部分原因是这样写校验枚举字段的方法得每个字段每次都得查一遍数据库,于是我就想着干脆查一次,就是进入导入方法后就查一次,先把那张表的所有数据封装到集合里,然后再在这集合里进行筛选校验枚举字段,代码如下。
SysDictDataMapper.xml
增加查询整个表
<select id="selectAllDictDataList" resultMap="SysDictDataResult" >
select * from sys_dict_data
</select>
SysDictDataMapper.java
/**
* 查询表里所有数据
*/
public List<SysDictData> selectAllDictDataList();
ISysDictDataService.java
/**
* 查询表里所有数据
*/
public List<SysDictData> selectAllDictDataList();
SysDictDataServiceImpl.java
@Override
public List<SysDictData> selectAllDictDataList() {
return dictDataMapper.selectAllDictDataList();
}
校验方法如下:
得先查到sysDictDataList
sysDictDataList = iSysDictDataService.selectAllDictDataList();
private boolean judgeDictData(String dictType, String dictValue) {
List<SysDictData> dictDatas = sysDictDataList.stream().filter(s->s.getDictType().equals(dictType) && s.getDictValue().equals(dictValue)).collect(Collectors.toList());
if (dictDatas.size()==0) {
return false;
}
return true;
}
用这个校验方法后,时间确实缩短了好多,从128秒缩短到了27秒