Springboot上传excel并将表格数据导入或更新mySql数据库[通俗易懂]

Springboot上传excel并将表格数据导入或更新mySql数据库[通俗易懂]本文主要描述,Springboot-mybatis框架下上传excel,并将之导入mysql数据库的过程,如果用户id已存在,则进行更新修改数据库中该项信息,由于用到的是前后端分离技术,这里记录的主要是后端java部分,通过与前端接口进行对接实现功能1.在pom.xml文件中导入注解,主要利用POI<dependency><groupId>org.a…

大家好,又见面了,我是你们的朋友全栈君。

本文主要描述,Springboot-mybatis框架下上传excel,并将之导入mysql数据库的过程,如果用户id已存在,则进行更新修改数据库中该项信息,由于用到的是前后端分离技术,这里记录的主要是后端java部分,通过与前端接口进行对接实现功能

1.在pom.xml文件中导入注解,主要利用POI

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.9</version>
</dependency>
<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
</dependency>
<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
</dependency>

2.entity实体类

public class User implements Serializable {
    private Integer id;

    private String name;

    private String phone;

    private String address;

    private Date enrolDate;

    private String des;

    private static final long serialVersionUID = 1L;

    public User(Integer id, String name, String phone, String address, Date enrolDate, String des) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.enrolDate = enrolDate;
        this.des = des;
    }

    public User() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone == null ? null : phone.trim();
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address == null ? null : address.trim();
    }

    public Date getEnrolDate() {
        return enrolDate;
    }

    public void setEnrolDate(Date enrolDate) {
        this.enrolDate = enrolDate;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des == null ? null : des.trim();
    }

    @Override
    public boolean equals(Object that) {
        if (this == that) {
            return true;
        }
        if (that == null) {
            return false;
        }
        if (getClass() != that.getClass()) {
            return false;
        }
        User other = (User) that;
        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
            && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
            && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))
            && (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress()))
            && (this.getEnrolDate() == null ? other.getEnrolDate() == null : this.getEnrolDate().equals(other.getEnrolDate()))
            && (this.getDes() == null ? other.getDes() == null : this.getDes().equals(other.getDes()));
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
        result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());
        result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode());
        result = prime * result + ((getEnrolDate() == null) ? 0 : getEnrolDate().hashCode());
        result = prime * result + ((getDes() == null) ? 0 : getDes().hashCode());
        return result;
    }
}

3.Controller接口

@RestController
@RequestMapping("/test/")
public class TestController {

    @Autowired
    private ITestService testService;

    @PostMapping("/import")
    public boolean addUser(@RequestParam("file") MultipartFile file) {
        boolean a = false;
        String fileName = file.getOriginalFilename();
        try {
             a = testService.batchImport(fileName, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  a;
    }

}

4.服务层接口

public interface ITestService {

    boolean batchImport(String fileName, MultipartFile file) throws Exception;
    
}

5.业务层实现类

@Service
@Transactional(readOnly = true)
public class TestServiceImpl implements ITestService {

    @Autowired
    private UserMapper userMapper;


    @Transactional(readOnly = false,rollbackFor = Exception.class)
    @Override
    public boolean batchImport(String fileName, MultipartFile file) throws Exception {

        boolean notNull = false;
        List<User> userList = new ArrayList<User>();
        if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
            throw new MyException("上传文件格式不正确");
        }
        boolean isExcel2003 = true;
        if (fileName.matches("^.+\\.(?i)(xlsx)$")) {
            isExcel2003 = false;
        }
        InputStream is = file.getInputStream();
        Workbook wb = null;
        if (isExcel2003) {
            wb = new HSSFWorkbook(is);
        } else {
            wb = new XSSFWorkbook(is);
        }
        Sheet sheet = wb.getSheetAt(0);
        if(sheet!=null){
            notNull = true;
        }
        User user;
        for (int r = 1; r <= sheet.getLastRowNum(); r++) {
            Row row = sheet.getRow(r);
            if (row == null){
                continue;
            }

            user = new User();
            
            if( row.getCell(0).getCellType() !=1){
                throw new MyException("导入失败(第"+(r+1)+"行,姓名请设为文本格式)");
            }
            String name = row.getCell(0).getStringCellValue();

            if(name == null || name.isEmpty()){
                throw new MyException("导入失败(第"+(r+1)+"行,姓名未填写)");
            }

            row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
            String phone = row.getCell(1).getStringCellValue();
            if(phone==null || phone.isEmpty()){
                throw new MyException("导入失败(第"+(r+1)+"行,电话未填写)");
            }
            String add = row.getCell(2).getStringCellValue();
            if(add==null){
                throw new MyException("导入失败(第"+(r+1)+"行,不存在此单位或单位未填写)");
            }

            Date date;
            if(row.getCell(3).getCellType() !=0){
                throw new MyException("导入失败(第"+(r+1)+"行,入职日期格式不正确或未填写)");
            }else{
                date = row.getCell(3).getDateCellValue();
            }

            String des = row.getCell(4).getStringCellValue();

            user.setName(name);
            user.setPhone(phone);
            user.setAddress(add);
            user.setEnrolDate(date);
            user.setDes(des);

            userList.add(user);
        }
        for (User userResord : userList) {
            String name = userResord.getName();
            int cnt = userMapper.selectByName(name);
            if (cnt == 0) {
                userMapper.addUser(userResord);
                System.out.println(" 插入 "+userResord);
            } else {
                userMapper.updateUserByName(userResord);
                System.out.println(" 更新 "+userResord);
            }
        }
        return notNull;
    }
}

6.mapper层

@Mapper
public interface UserMapper {

    void addUser(User sysUser);

    int updateUserByName(User sysUser);

    int selectByName(String name);
}

7.mybatis

<?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="com.why.MyProject.mapper.UserMapper">
  <resultMap id="BaseResultMap" type="com.why.MyProject.entity.User">
    <constructor>
      <idArg column="t_id" javaType="java.lang.Integer" jdbcType="INTEGER" />
      <arg column="t_name" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="t_phone" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="t_address" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="t_enrol_date" javaType="java.util.Date" jdbcType="TIMESTAMP" />
      <arg column="t_des" javaType="java.lang.String" jdbcType="VARCHAR" />
    </constructor>
  </resultMap>

  <insert id="addUser" parameterType="com.why.MyProject.entity.User">
    insert into user
    (name,phone,address,enrol_date,des)
    values
    (
    #{name},
    #{phone},
    #{address},
    #{enrolDate},
    #{des}
    )
  </insert>

  <update id="updateUserByName" parameterType="com.why.MyProject.entity.User">
    update user
    set
    phone=#{phone},
    address=#{address},
    enrol_date=#{enrolDate},
    des=#{des}
    where name = #{name}
  </update>

  <select id="selectByName" resultType="java.lang.Integer">
    SELECT
    count(*)
    FROM user
    WHERE name=#{name}
  </select>
</mapper>

8.数据库建表语句

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `enrol_date` datetime DEFAULT NULL,
  `des` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

9.excel示例

Springboot上传excel并将表格数据导入或更新mySql数据库[通俗易懂]

demo地址:springboot上传excel导入到数据库完整demo(后端代码)_springboot导入excel到数据库,springboot上传excel存到数据库-Java文档类资源-CSDN下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154137.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • psutil的Process python获取进程信息「建议收藏」

    psutil的Process python获取进程信息「建议收藏」系统进程信息psutil.Process()1.创建指定进程号的对象s=psutil.Process(1701)2.进程PID:pids.pid3.进程名称:name()s.name()4.进程当前状态:status()s.status()5.进程是否还在运行:is_running()返回此进程是否正在运行。它还检查PID是否已被另一个进程重用…

    2022年6月9日
  • 2019 年最好用的 6 款数据库监控工具[通俗易懂]

    https://www.toutiao.com/a6654350892373901831/?tt_from=mobile_qq&amp;utm_campaign=client_share&amp;timestamp=1549354401&amp;app=news_article&amp;abtest_id=1&amp;iid=59568063679&amp;utm_medium=toutiao_a…

    2022年4月4日
  • python图像处理之scikit-image基本用法

    python图像处理之scikit-image基本用法本文介绍Python语言用于数字图像处理,那么要使用python进行各种开发和科学计算,需要对应相对的python包,python有很多的数字图像处理相关的包,像PILPillowOpenCVscikit-image等等其中PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c++库,只是提供了python接口,scikit-image…

    2022年10月9日
  • xshell连接虚拟机步骤_建立主机与vm虚拟机的网络连接

    xshell连接虚拟机步骤_建立主机与vm虚拟机的网络连接Xshell连接虚拟机1、打开虚拟机终端,输入下面命令,找到ens33对应的IP地址,如图ifconfig2、打开Xshell,打开文件–>新建3、填写名称,主机这里填入刚才的IP,点击连接4、输入登录的用户名,点击确定5、输入密码,点击确定6、连接成功,可以开始使用…

    2022年4月19日
  • c语言编木马程序,肿么用C语言编写木马.病毒等程序

    c语言编木马程序,肿么用C语言编写木马.病毒等程序嘿嘿给你个类病毒C程序源码,看下方法吧#defineSVCHOST_NUM6#include#includechar*autorun={“[autorun]\nopen=SVCHOST.exe\n\nshell\\1=打开\nshell\\1\\Command=SVCHOST.exe\nshell\\2\\=Open\nshell\\2\\Command=SVCHOST.exe\nshel…

    2022年6月22日
  • java链表打印_java链表打印

    java链表打印_java链表打印链表类packagecom.demo;publicclassNode{privateStringdata;privateNodenext;publicNode(Stringdata){this.data=data;}publicStringgetData(){returndata;}publicvoidsetData(Stringdata){this.data…

    2022年5月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号