目录

1、实体类层:Student

2、Mapper层:StudentMapper

3、StudentMapper.xml

4、service层:StudentService

5、实现类层 :StudentServiceImpl

6、Controller层:StudentController

7、Dto:添加上传由此类先进行解析

8、工具类:Utils

8.1:ResponseResult

8.2:ValidatorUtils

8.3:Exception

9、准备数据和Postman测试

9.1:准备数据

9.2:Postman测试

注意!!!:pom.xml配置,需要导入的Maven在这里


以学生表为例:解析Excel表中Name、Age的值保存到数据库

1、实体类层:Student

package coo.entity;import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;import java.util.Date;@Data
@TableName("STUDENT_DEMO")
public class Student {@TableId(value = "ID", type = IdType.ASSIGN_ID)private Long id;@TableField("NAME")private String name;@TableField("AGE")private String age;@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)private Date createTime;@TableField(value = "UPDATE_TIME", fill = FieldFill.INSERT_UPDATE)private Date updateTime;@TableField(value = "DELETED_FLAG", fill = FieldFill.INSERT)@TableLogicprivate Integer deletedFlag;/*** 业务主键* @return String*/public String getBusinessPrimaryKey(){return this.age+this.name;}}

2、Mapper层:StudentMapper

package coo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import coo.entity.Student;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface StudentMapper extends BaseMapper<Student> {}

3、StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="coo.mapper.StudentMapper"></mapper>

4、service层:StudentService

package coo.service;import com.baomidou.mybatisplus.extension.service.IService;
import coo.entity.Student;import java.util.List;public interface StudentService extends IService<Student> {boolean isNotExists(Student student) throws Exception;void uploadStudent(List<Student> stdProducts) throws Exception;
}

5、实现类层 :StudentServiceImpl

package coo.service.impl;import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import coo.entity.Student;
import coo.mapper.StudentMapper;
import coo.service.StudentService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.transaction.annotation.Transactional;import javax.xml.rpc.ServiceException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {@Overridepublic boolean isNotExists(Student student) throws Exception {if (ObjectUtil.isEmpty(student) || ObjectUtil.isEmpty(student.getName())) {throw new ServiceException("Name 不能为空");}LambdaQueryWrapper<Student> queryWrapper = new LambdaQueryWrapper();queryWrapper.eq(Student::getDeletedFlag,0);queryWrapper.eq(StringUtils.isNotBlank(student.getAge()),Student::getAge, student.getAge());queryWrapper.eq(StringUtils.isNotBlank(student.getName()),Student::getName, student.getName());return this.count(queryWrapper) < 1;}@Override@Transactional(rollbackFor = Exception.class)public void uploadStudent(List<Student> students) throws Exception {List<Student> addList = new ArrayList<>();for (Student student : students) {//判断主键是否重复if (this.isNotExists(student)) {//新增student.setCreateTime(new Date());student.setUpdateTime(new Date());student.setDeletedFlag(0);addList.add(student);} else {//更新student.setUpdateTime(new Date());LambdaQueryWrapper<Student> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StringUtils.isNotBlank(student.getAge()), Student::getAge, student.getAge());queryWrapper.eq(StringUtils.isNotBlank(student.getName()), Student::getName, student.getName());queryWrapper.eq(Student::getDeletedFlag, 0);this.update(student, queryWrapper);}}if (!addList.isEmpty()) {//新增this.saveBatch(addList);}}
}

6、Controller层:StudentController

package coo.controller;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.ExcelReader;
import io.swagger.annotations.ApiOperation;
import coo.dto.StudentDto;
import coo.entity.Student;
import coo.exception.BusinessException;
import coo.service.StudentService;
import coo.utils.ResponseResult;
import coo.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/student")
public class StudentController {@Autowiredprivate StudentService studentService;/*** student数据文件上传* @param file* @return ResponseResult<Void>*/@PostMapping("/upload")@ApiOperation(tags = "student页面操作", value = "student数据文件上传")public ResponseResult uploadProductId(MultipartFile file) throws Exception {if (ObjectUtil.isNull(file)) {throw new BusinessException("请检查Excel是否有数据");}// 文件名的获取 并判断是否是excelString originalFilename = file.getOriginalFilename();if (StringUtils.isBlank(originalFilename)) {throw new BusinessException("上传的文件名为空");}String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);if (!"xls".equals(fileSuffix) && !"xlsx".equals(fileSuffix)) {throw new BusinessException("文件格式不正确,请检查后重新上传!");}// 设置表头别名Map<String, String> headerAlis = new HashMap<>(16);String[] studentColumns = {"Name#name", "Age#age"};for (String stuExcelExportColumn : studentColumns) {String[] split = stuExcelExportColumn.split("#");headerAlis.put(split[0], split[1]);}// 将excel中的数据读取成listExcelReader reader = new ExcelReader(file.getInputStream(), 0);reader.setHeaderAlias(headerAlis);List<StudentDto> studentDtos = reader.readAll(StudentDto.class);// 判断必填项for (int i = 0; i < studentDtos.size(); i++) {StudentDto studentDto = studentDtos.get(i);try {// 校验必填项ValidatorUtils.validateFast(studentDto);}catch (Exception e){int j = i+2;throw new BusinessException("第" + j + "行 " + e.getMessage());}}List<String> checkList = new ArrayList<>();List<Student> students = BeanUtil.copyToList(studentDtos, Student.class);for (int i = 0; i < students.size(); i++)  {Student student = students.get(i);String businessPrimaryKey = student.getBusinessPrimaryKey();if (checkList.contains(businessPrimaryKey)){int oldRow = checkList.indexOf(businessPrimaryKey) +2;int nowRow = i+2;throw new BusinessException("第"+nowRow+"行数据和第"+oldRow+"行数据重复,请修改后上传!");}checkList.add(businessPrimaryKey);}studentService.uploadStudent(students);return ResponseResult.success();}
}

7、Dto:添加上传由此类先进行解析

package coo.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.NotBlank;@Data
public class StudentDto {@ApiModelProperty(value = "name",required = true)@NotBlank(message = "Name不能为空,请调整后重新上传!")private String name;private String age;
}

8、工具类:Utils

8.1:ResponseResult

package coo.utils;import lombok.Data;@Data
public class ResponseResult<T> {private static final ResponseResult<Void> OK = new ResponseResult<>();/*** 创建成功对象。* @return 返回创建的ResponseResult实例对象*/public static ResponseResult<Void> success() {return OK;}
}

8.2:ValidatorUtils

package coo.utils;import coo.exception.BusinessException;
import org.hibernate.validator.HibernateValidator;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;public class ValidatorUtils {private static Validator validatorFast = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();/*** 校验遇到第一个不合法的字段直接返回不合法字段,后续字段不再校验*/public static <T> Set<ConstraintViolation<T>> validateFast(T domain) throws Exception {Set<ConstraintViolation<T>> validateResult = validatorFast.validate(domain);if (validateResult.size() > 0) {throw new BusinessException(validateResult.iterator().next().getPropertyPath() + ":" + validateResult.iterator().next().getMessage());}return validateResult;}
}

8.3:Exception

package coo.exception;public class BusinessException extends Exception {private static final long serialVersionUID = -3804995326646218863L;private String errCode;private String errMsg;public BusinessException(String errMsg) {super(errMsg);this.errMsg = errMsg;}
}

9、准备数据和Postman测试

9.1:准备数据

9.2:Postman测试

注意!!!:pom.xml配置,需要导入的Maven在这里

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>name.remal.gradle-plugins.lombok</groupId><artifactId>lombok</artifactId><version>2.0.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>crab-core</artifactId><version>0.2</version></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.5.Final</version></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.0.Final</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>3.4.2</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.6.6</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.5.0</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.16</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.6</version></dependency><dependency><groupId>org.ifinalframework.annotation</groupId><artifactId>final-annotation-web</artifactId><version>1.4.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.axis</groupId><artifactId>axis-jaxrpc</artifactId><version>1.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency></dependencies><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes><filtering>false</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.8</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

Java后端:Excel文件上传,解析数据到数据库相关推荐

  1. SSM项目的excel文件上传并添加到数据库

    SSM项目的excel文件上传并添加到数据库(新手,不足之处请多多指教) 基于学校的课设,要用到excel文件的上传和数据库导入,在网上找了好多demo,最后找到一篇使用poi的,经过修改后,可以正常 ...

  2. java实现excel文件上传并解析内容保存到数据库中

    基于struts框架的web项目中excel文件的上传导入到数据库中的java代码 原理:将要上传的文件已流的形式传到服务器,服务器中接收到文件数据流并生成文件到服务器指定位置,java解析服务器生成 ...

  3. Springboot+thymeleaf实现excel文件上传+后台数据搜索

    废话不多说,直接上代码 先说excel文件上传 用的是poi框架 先贴maven配置 <!-- poi导入excel文件--><dependency><groupId&g ...

  4. java中excel文件上传

    java文件上传 excel文件上传的两种方式 1.使用ExcelsUtils上传文件 2.把文件转换成流上传(支持多sheet) 代码实现 第一种方式 ExcelsUtils.ReadMultipa ...

  5. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  6. java实现Excel文件上传下载(模板)-hutool

    引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</arti ...

  7. 7.3 MASS批量修改数据(Excel文件上传数据)

    7.3 MASS批量修改数据(Excel文件上传数据) 步骤1:输入事务码MASS进入 1处,输入需要修改的对象类型(参见对象类型清单) 2处,点击"执行"按钮 步骤2:选择需要修 ...

  8. java接受formdata文件上传_java后端发送formdata上传文件

    今天想实现 java 后端发送 formdata 上传文件,为了以后查找方便,特此记录下来 上一次使用 WebClient 实现远程调用 (一个非阻塞.响应式的HTTP客户端,它以响应式被压流的方式执 ...

  9. java语言 文件上传,java中实现文件上传的方法

    java中实现文件上传的方法 发布时间:2020-06-19 10:29:11 来源:亿速云 阅读:86 作者:Leah 这篇文章给大家分享的是java中实现文件上传的方法,相信大部分人都还没学会这个 ...

  10. java里面的文件上传与下载

    java里面的文件上传与下载 文件的上传与下载主要用到两种方法: 1.方法一:commons-fileupload.jar commons-io.jar apache的commons-fileuplo ...

最新文章

  1. flex图表数据动态更新效果示例
  2. linux之安装软件出现Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)解决总结
  3. [原创]Silverlight与PostgreSQL数据库的互操作(CURD完全解析)
  4. [渝粤教育] 西南政法大学 法理学 参考 资料
  5. axios网络请求框架源码解析
  6. cuSPARSE库:(一)函数的异步执行
  7. matplotlib之contours等高线、3D图(笔记五)
  8. mac 使用js打开计算器_Numi for Mac(mac计算器软件)
  9. py导入包异常跳出_马克的Python学习笔记#模块和包
  10. 普林斯顿微积分读本篇十五:积分方法
  11. Service com.android.exchange.ExchangeService has leaked ServiceConnection
  12. 现货黄金和纸黄金的区别?
  13. 《大象--Thinking in UML 第二版》已于近日在当当首发,同时邀请各位加入新浪微博[大象-thinkinginUml群]:http://q.weibo.com/1483929
  14. 时间复杂度的三种常见表示符号
  15. Android检测仪开发---BleBluetooth 多连接
  16. nRF24L01--2.4G无线通信模块(1)(51单片机和51单片机通信)
  17. Oracle Data purge(Oracle一键数据删除)
  18. python中时间转换错误:时间戳转换|带有时区的转换 如何解析ISO 8601格式的日期? 2018-06-25T20:59:31.757+08:00
  19. 用于C U I应用程序:/ S U B S Y S T E M : C O N D O L E,而用于G U I :S U B S Y S T E M : W
  20. 【miscellaneous】最新HEVC/H.265 4K视频,显卡解码测试

热门文章

  1. css实例之简单好看的导航栏
  2. 油猴插件 | JS实现当前网页添加固定按钮
  3. 为什么有的人知识渊博,但总成不了事?告诉你3点原因
  4. VMware超详细安装完整教程
  5. matlab GUI(2)
  6. 2023年要想翻身赚大钱,网络安全是你必须要知道的“薪”机遇
  7. android 休眠唤醒机制分析(一)
  8. 风靡日本的《赛马娘》手游和日本的赛马文化
  9. 如何重新排列数组使得数组左边为奇数,右边为偶数
  10. 用html和css怎么做出点击关注红心,页面点击小红心js实现代码