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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 初中英语语法(015)-附加疑问句

    初中英语语法(015)-附加疑问句附加疑问句附加疑问句由陈述句加简短附加问句构成,用以要求对方证实所述之事。附加疑问句主要有两种:一类是反意的附加疑问句,另一类是非反意附加疑问句。例如:1、附加疑问句句尾上升语调,表示询问。(1)YouarefromJapan,aren’tyou?-你来自日本,对吗?AreyoufromJapan?-这句话等同于上句回答方法也相同Yes/No,Iam/I…

    2022年7月16日
    16
  • window计算机日志分析详解,windows系统日志分析

    window计算机日志分析详解,windows系统日志分析一、Windows日志文件的保护日志文件对我们如此重要,因此不能忽视对它的保护,防止发生某些“不法之徒”将日志文件清洗一空的情况。1.修改日志文件存放目录Windows日志文件默认路径是“%systemroot%system32config”,我们可以通过修改注册表来改变它的存储目录,来增强对日志的保护。点击“开始→运行”,在对话框中输入“Regedit”,回车后弹出注册表编辑器,依次展开“HK…

    2022年9月8日
    0
  • mysql优化 面试_数据库优化工具

    mysql优化 面试_数据库优化工具点赞是一种积极的生活态度!有支持才有动力!微信搜索公众号【达摩克利斯之笔】获取更多资源,文末有二维码!前言数据库优化是一个老生常谈的问题,刚入门的小白或者工作N年的光头对这个问题应该都不陌生,你要面试一个中高级工程师那么他就想”哥俩好”一样那么粘,面试官肯定会问这个问题,这篇文章我们就和它哥俩好!而且这个问题就是一个送分题,数据库的优化方案基本就是那些,答案也都是固定的,大家只要好好…

    2022年10月24日
    0
  • maven学习系列——(七)Dependency

    Dependency介绍本文转自:Maven简介(六)——Dependency,并加上自己在实际使用中的总结和说明!1、依赖的传递性依赖传递对版本的选择假设A依赖于B和C,然后B依赖于D,D又依赖于E1.0,C直接依赖于E2.0,那么这个时候A依赖的是E1.0还是E2.0,还是这两个都依赖呢?两个都依赖是肯定不行的,因为它们可能会有冲突的地方。这个时候就涉及到Maven中依赖传递对…

    2022年2月27日
    36
  • ip addr 和 ifconfig「建议收藏」

    ip addr 和 ifconfig「建议收藏」你知道怎么查看IP地址吗?当面试听到这个问题的时候,面试者常常会觉得走错了房间。我面试的是技术岗位啊,怎么问这么简单的问题?的确,即便没有专业学过计算机的人,只要倒腾过电脑,重装过系统,大多也会知道这个问题的答案:在Windows上是ipconfig,在Linux上是ifconfig。那你知道在Linux上还有什么其他命令可以查看IP地址吗?答案是ipad…

    2022年7月28日
    19
  • 六、小程序|App抓包-移动端抓包app-抓包「建议收藏」

    六、小程序|App抓包-移动端抓包app-抓包「建议收藏」小程序|App抓包移动端抓包app-抓包 ———-IOS设备系统———一、IOS抓包IOS(thor+anubis)app应用市场下载即可:首次安装需要配置证书:抓包:简单测试抓取部分数据包:查看详细数据包内容:点击数据包查看详情:一直摁着,选择重放可进行重放测试thor跳转anubisanubis相关功能点和界面:重放记录:可修改重放:也可进行其他的导出操作:可以将数据包导出联合burp重放———-Android设备系统———二、android移动

    2022年5月27日
    37

发表回复

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

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