有需求如下:共導入3級產品類,每級對應多個下級;通過前端頁面添加時不同上級可以對應相同的下級且同級名稱可重複,通過導入功能添加的數據同級品類名稱重複的示爲一個品類。
並且在導入的時候只需要關注此次需要導入的數據,而不需要關注數據庫表中原有數據,即使原數據有名字相同的,也不必合併。
excel表中數據如圖所示:
對應的數據爲:
excel表中的數據導入了之後爲List:
[TestLevelDTO{firstLevelName='電腦', secondLevelName='臺式機', thirdLevelName='神舟'},
TestLevelDTO{firstLevelName='電腦', secondLevelName='臺式機', thirdLevelName='聯想'},
TestLevelDTO{firstLevelName='電腦', secondLevelName='手提電腦', thirdLevelName='戴爾'},
TestLevelDTO{firstLevelName='電腦', secondLevelName='臺式機', thirdLevelName='蘋果'},
TestLevelDTO{firstLevelName='電腦', secondLevelName='手提電腦', thirdLevelName='華爲'},
TestLevelDTO{firstLevelName='紙', secondLevelName='打印紙', thirdLevelName='A3'},
TestLevelDTO{firstLevelName='紙', secondLevelName='打印紙', thirdLevelName='A4'}]
三級數據都有確定的上下級關係,二級類目的父id爲一級類目的id,因爲原數據有可能有一級品類名稱爲“電腦”或者“紙”的,所以將第一條數據導入到數據庫後,查詢一級類目名稱爲“電腦”的數據並不能準確得知對應的一級品類。所以如果插入數據庫的話,需要在一級數據插入之後,就將對應的二級插入數據庫,三級類目也同理。所以將以上List數據轉換爲以下數據格式:
Map<String, List<Map<String, Set<String>>>>
一級品類作爲Map的key,不重複。而二級類目可能有多個,所以設置爲List。
二級類目和三級類目的關係也設置爲Map,二級類目的名字作爲key,三級類目的名字放在Set裏面,保證二級類目和三級類目的名字都不重複。
代碼示例如下:
public class TestLevelDTO {
//一級類目名稱
private String firstLevelName;
//二級類目名稱
private String secondLevelName;
//三級類目名稱
private String thirdLevelName;
public String getFirstLevelName() {
return firstLevelName;
}
public void setFirstLevelName(String firstLevelName) {
this.firstLevelName = firstLevelName;
}
public String getSecondLevelName() {
return secondLevelName;
}
public void setSecondLevelName(String secondLevelName) {
this.secondLevelName = secondLevelName;
}
public String getThirdLevelName() {
return thirdLevelName;
}
public void setThirdLevelName(String thirdLevelName) {
this.thirdLevelName = thirdLevelName;
}
@Override
public String toString() {
return "TestLevelDTO{" +
"firstLevelName='" + firstLevelName + '\'' +
", secondLevelName='" + secondLevelName + '\'' +
", thirdLevelName='" + thirdLevelName + '\'' +
'}';
}
}
public class CategoryLevel {
//id
private int id;
//父級id
private int parentId;
//層級
private int level;
//品類名稱
private String categoryLevelName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getCategoryLevelName() {
return categoryLevelName;
}
public void setCategoryLevelName(String categoryLevelName) {
this.categoryLevelName = categoryLevelName;
}
@Override
public String toString() {
return "CategoryLevel{" +
"id=" + id +
", parentId=" + parentId +
", level=" + level +
", categoryLevelName='" + categoryLevelName + '\'' +
'}';
}
}
public class TestLevel {
public static void main(String[] args) {
List<TestLevelDTO> testLevelDTOArrayList = new ArrayList <>();
TestLevelDTO testLevelDTO1 = new TestLevelDTO();
testLevelDTO1.setFirstLevelName("電腦");
testLevelDTO1.setSecondLevelName("臺式機");
testLevelDTO1.setThirdLevelName("神舟");
TestLevelDTO testLevelDTO2 = new TestLevelDTO();
testLevelDTO2.setFirstLevelName("電腦");
testLevelDTO2.setSecondLevelName("臺式機");
testLevelDTO2.setThirdLevelName("聯想");
TestLevelDTO testLevelDTO3 = new TestLevelDTO();
testLevelDTO3.setFirstLevelName("電腦");
testLevelDTO3.setSecondLevelName("手提電腦");
testLevelDTO3.setThirdLevelName("戴爾");
TestLevelDTO testLevelDTO4 = new TestLevelDTO();
testLevelDTO4.setFirstLevelName("電腦");
testLevelDTO4.setSecondLevelName("臺式機");
testLevelDTO4.setThirdLevelName("蘋果");
TestLevelDTO testLevelDTO5 = new TestLevelDTO();
testLevelDTO5.setFirstLevelName("電腦");
testLevelDTO5.setSecondLevelName("手提電腦");
testLevelDTO5.setThirdLevelName("華爲");
TestLevelDTO testLevelDTO6 = new TestLevelDTO();
testLevelDTO6.setFirstLevelName("紙");
testLevelDTO6.setSecondLevelName("打印紙");
testLevelDTO6.setThirdLevelName("A3");
TestLevelDTO testLevelDTO7 = new TestLevelDTO();
testLevelDTO7.setFirstLevelName("紙");
testLevelDTO7.setSecondLevelName("打印紙");
testLevelDTO7.setThirdLevelName("A4");
testLevelDTOArrayList.add(testLevelDTO1);
testLevelDTOArrayList.add(testLevelDTO2);
testLevelDTOArrayList.add(testLevelDTO3);
testLevelDTOArrayList.add(testLevelDTO4);
testLevelDTOArrayList.add(testLevelDTO5);
testLevelDTOArrayList.add(testLevelDTO6);
testLevelDTOArrayList.add(testLevelDTO7);
System.out.println(testLevelDTOArrayList);
Map<String, List<Map<String, Set<String>>>> map = new HashMap <>();
for (TestLevelDTO testLevelDTO : testLevelDTOArrayList) {
doMsg(testLevelDTO, map);
System.out.println(map.toString());
System.out.println(map.size());
}
int idCount = 1;
for (String firstCategoryLevelName : map.keySet()) {
doImport(map, firstCategoryLevelName, idCount);
//模擬id自增
idCount ++;
}
}
public static boolean doMsg(TestLevelDTO testLevelDTO,
Map<String, List<Map<String, Set<String>>>> map) {
//如果包含第一級的key
if (map != null && map.containsKey(testLevelDTO.getFirstLevelName())) {
List<Map<String, Set<String>>> mapListnew = map.get(testLevelDTO.getFirstLevelName());
boolean isHaveFlag = false;
for (Map<String, Set<String>> stringSetMap : mapListnew){
//如果list中包含以第二級部門名稱爲key的數據,則只需要修改第三級的set即可
if (stringSetMap.containsKey(testLevelDTO.getSecondLevelName())){
Set <String> newSet = stringSetMap.get(testLevelDTO.getSecondLevelName());
newSet.add(testLevelDTO.getThirdLevelName());
Map<String, Set<String>> stringSetMap2 = stringSetMap;
stringSetMap2.put(testLevelDTO.getSecondLevelName(), newSet);
//移除舊的
mapListnew.remove(stringSetMap);
//將新的再添加進去
mapListnew.add(stringSetMap2);
map.put(testLevelDTO.getFirstLevelName(),mapListnew);
isHaveFlag = true;
break;
}
}
//如果list中不包含以第二級部門名稱爲key的數據,則需要新增一個list
if (!isHaveFlag){
Map<String, Set<String>> stringSetMap2 = new HashMap <>();
Set <String> newSet = new HashSet <>();
newSet.add(testLevelDTO.getThirdLevelName());
stringSetMap2.put(testLevelDTO.getSecondLevelName(),newSet);
mapListnew.add(stringSetMap2);
map.put(testLevelDTO.getFirstLevelName(),mapListnew);
}
} else {
//全新的一條map數據
Set<String> setNew = new HashSet <>();
setNew.add(testLevelDTO.getThirdLevelName());
Map<String, Set<String>> stringMapNew = new HashMap <>();
stringMapNew.put(testLevelDTO.getSecondLevelName(),setNew);
List<Map<String, Set<String>>> mapListNew = new ArrayList <>();
mapListNew.add(stringMapNew);
map.put(testLevelDTO.getFirstLevelName(),mapListNew);
}
return true;
}
public static void doImport(Map<String, List<Map<String, Set<String>>>> map, String firstCategoryLevelName, int idCount){
// 一級類目
CategoryLevel firstCategoryLevel = new CategoryLevel();
firstCategoryLevel.setCategoryLevelName(firstCategoryLevelName);
firstCategoryLevel.setLevel(1);
firstCategoryLevel.setParentId(0);
//模擬插入一級類目
firstCategoryLevel.setId(idCount);
System.out.println("插入的一級類目信息爲:" + firstCategoryLevel);
//模擬id自增
idCount++;
// 獲取所有的二級信息
List<Map<String, Set<String>>> mapList = map.get(firstCategoryLevelName);
for (Map<String, Set<String>> mapListString : mapList) {
String secondCategoryLevelName = mapListString.keySet().iterator().next();
// 二級導航信息
CategoryLevel secondCategoryLevel = new CategoryLevel();
secondCategoryLevel.setCategoryLevelName(secondCategoryLevelName);
secondCategoryLevel.setLevel(2);
secondCategoryLevel.setParentId(firstCategoryLevel.getId());
//模擬插入二級類目
secondCategoryLevel.setId(idCount);
System.out.println("插入的二級類目信息爲:" + secondCategoryLevel);
//模擬id自增
idCount++;
Set<String> stringSet = mapListString.get(secondCategoryLevelName);
for (String thirdLevelName : stringSet) {
String thirdCategoryLevelName = mapListString.keySet().iterator().next();
// 二級導航信息
CategoryLevel thirdCategoryLevel = new CategoryLevel();
thirdCategoryLevel.setCategoryLevelName(thirdCategoryLevelName);
thirdCategoryLevel.setLevel(3);
thirdCategoryLevel.setParentId(secondCategoryLevel.getId());
//模擬插入二級類目
thirdCategoryLevel.setId(idCount);
System.out.println("插入的三級類目信息爲:" + thirdCategoryLevel);
//模擬id自增
idCount++;
}
}
}
}
執行結果如下:
可以看出,最後的數據爲:{電腦=[{臺式機=[聯想, 蘋果, 神舟]}, {手提電腦=[華爲, 戴爾]}], 紙=[{打印紙=[A3, A4]}]}。原來的List已經轉化爲Map,然後遍歷Map,將數據依次插入到數據庫中。
可以看到,上級id已經一一對應好。第一個Map中有8條類目信息,第二個Map中有4條類目信息。模擬的id不是很成功,但是可以看到,上下級關係已經一一對應好。