控制器
因为如何想要在读数据的时候操作数据库,就必须使用构造方法传dao 或者service,因为这个不归spring管理,不能自动注入,所以参数里需要传递service 或者 dao
java
@Autowired
IEduSubjectService subjectService;
添加课程分类的方法 (文件本身不用保存到服务器,只是要将文件中的内容解析出来保存到数据库)
@RequestMapping("/addSubject")
public R addSubject(@RequestPart MultipartFile file) {
subjectService.saveSubject(file,subjectService);
return R.ok();
}
service层
java
public interface IEduSubjectService extends IService<EduSubject> {
//添加课程分类的方法 (文件本身不用保存到服务器,只是要将文件中的内容解析出来保存到数据库)
void saveSubject(MultipartFile file, IEduSubjectService subjectService);
//查询所有课程分类信息
List<OneSubject> findAllSubject();
}
impl
核心代码在监听器,控制器传递的service或者dao 就在这里传递给监听器,让监听器在里面通过构造方法进行调用
java
public void saveSubject(MultipartFile file, IEduSubjectService subjectService){
try {
//取得文件的输入流对象
InputStream inputStream = file.getInputStream();
//解析文件中的内容,解析之后要将内容赋值给Customer类对对象
// 第一个参数:输入流对象
// 第二个参数:文件中的内容要解析指定的实体类对象
// 第三个参数:是一个监听器ImportCustomerListener
EasyExcel.read(inputStream, SubjectData.class, new SubjectExcelListener(subjectService)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
监听器
核心逻辑就在监听器中,继承 的监听器的泛型是 读取的Excel文件对应的实体类,每读一行都会触发invoke
java
public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {
private IEduSubjectService subjectService;
//使用构造方法初始化 subjectService
public SubjectExcelListener() {
}
public SubjectExcelListener(IEduSubjectService subjectService) {
this.subjectService = subjectService;
}
//将文件中的内容一行一行的读取--->将读取到的数据每次都存入SubjectData对象中
@Override
public 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);
}
// 处理二级标题
//获取添加一级分类后的id
String 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);
}
}
@Override
public 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);
}
}