控制器
因為如何想要在讀數據的時候操作數據庫,就必須使用構造方法傳dao 或者service,因為這個不歸spring管理,不能自動注入,所以參數里需要傳遞service 或者 dao
@AutowiredIEduSubjectService subjectService;添加課程分類的方法 (文件本身不用保存到服務器,只是要將文件中的內容解析出來保存到數據庫)@RequestMapping("/addSubject")public R addSubject(@RequestPart MultipartFile file) {subjectService.saveSubject(file,subjectService);return R.ok();}
service層
public interface IEduSubjectService extends IService<EduSubject> {//添加課程分類的方法 (文件本身不用保存到服務器,只是要將文件中的內容解析出來保存到數據庫)void saveSubject(MultipartFile file, IEduSubjectService subjectService);//查詢所有課程分類信息List<OneSubject> findAllSubject();
}
impl
核心代碼在監聽器,控制器傳遞的service或者dao 就在這里傳遞給監聽器,讓監聽器在里面通過構造方法進行調用
public void saveSubject(MultipartFile file, IEduSubjectService subjectService){try {//取得文件的輸入流對象InputStream inputStream = file.getInputStream();//解析文件中的內容,解析之后要將內容賦值給Customer類對對象// 第一個參數:輸入流對象// 第二個參數:文件中的內容要解析指定的實體類對象// 第三個參數:是一個監聽器ImportCustomerListenerEasyExcel.read(inputStream, SubjectData.class, new SubjectExcelListener(subjectService)).sheet().doRead();} catch (IOException e) {e.printStackTrace();}}
監聽器
核心邏輯就在監聽器中,繼承 的監聽器的泛型是 讀取的Excel文件對應的實體類,每讀一行都會觸發invoke
public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {private IEduSubjectService subjectService;//使用構造方法初始化 subjectServicepublic SubjectExcelListener() {}public SubjectExcelListener(IEduSubjectService subjectService) {this.subjectService = subjectService;}//將文件中的內容一行一行的讀取--->將讀取到的數據每次都存入SubjectData對象中@Overridepublic void invoke(SubjectData subjectData, AnalysisContext analysisContext) {//將解析出來的數據添加到數據庫if (subjectData == null){throw new GlobalErrorException(20001,"文件數據為空");}//判斷一級分類在數據庫中是否存在EduSubject OneSubject = this.existOneSubject(subjectData.getOneSubjectName());if (OneSubject == null){//沒有則添加一級分類OneSubject = new EduSubject();OneSubject.setTitle(subjectData.getOneSubjectName());OneSubject.setParentId("0");subjectService.save(OneSubject);
// //獲取添加一級分類后的id
// String pid = eduSubject.getId();
// //判斷二級分類在數據庫中是否存在
// EduSubject existTwoSubject = this.existTwoSubject(subjectData.getTwoSubjectName(), pid);}// 處理二級標題//獲取添加一級分類后的idString pid = OneSubject.getId();//添加二級分類//判斷二級分類是否已經存在了EduSubject existTwoSubject = this.existTwoSubject(subjectData.getTwoSubjectName(), pid);if (existTwoSubject == null){EduSubject twoSubject = new EduSubject();twoSubject.setTitle(subjectData.getTwoSubjectName());twoSubject.setParentId(pid);subjectService.save(twoSubject);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}/*** 判斷二級分類是否存在* @param twoSubjectName* @return*/private EduSubject existTwoSubject(String twoSubjectName, String oneSubjectId) {QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();wrapper.eq("title",twoSubjectName);wrapper.eq("parent_id",oneSubjectId);return subjectService.getOne(wrapper);}/*** 判斷一級分類是否存在* @param oneSubjectName* @return*/private EduSubject existOneSubject(String oneSubjectName) {QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();wrapper.eq("title",oneSubjectName);wrapper.eq("parent_id",0);return subjectService.getOne(wrapper);}
}