springboot+mybatis+mysql将excel表内容导入到数据库

本文介绍了如何在Spring Boot项目中利用MyBatis和Apache POI库实现从Excel文件导入数据到MySQL数据库的过程,包括配置依赖、接口设计、DAO与Service实现以及错误处理。
摘要由CSDN通过智能技术生成

废话不多说,直接上代码(先做第三步,添加依赖包):
也可以参考这个链接:链接
1、myMapper.java

package com.gcb.Students;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 继承自己的MyMapper
 */
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
    //TODO
    //FIXME 特别注意,该接口不能被扫描到,否则会出错
}

2、StudentsApplication.java

package com.gcb.Students;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

import tk.mybatis.spring.annotation.MapperScan;


@SpringBootApplication
@MapperScan(basePackages = "com.gcb.Students.Dao")
@ComponentScan(basePackages= {"com.gcb.Students"})
public class StudentsApplication {

	public static void main(String[] args) {
		SpringApplication.run(StudentsApplication.class, args);
	}

}

3、pom.xml依赖

<!--新项目能正常启动的基础  -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		<!--mybatis -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.1</version>
		</dependency>
		<!--mapper -->
		
		<dependency>
			<groupId>tk.mybatis</groupId>
			<artifactId>mapper-spring-boot-starter</artifactId>
			<version>1.2.4</version>
		</dependency>
		
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.40</version>
		</dependency>
		
        <!--xls(03)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        
        <!--xlsx(07)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        

4、controller

package com.gcb.Students.Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.gcb.Students.Po.AddStudentsInfoReqVo;
import com.gcb.Students.Po.AutoInsertInfoReqVo;
import com.gcb.Students.Po.AvailableResult;
import com.gcb.Students.Po.excelDataToMYSQLReqVo;
import com.gcb.Students.Service.StudentsService;

@RestController
@RequestMapping("/Students/")
public class StudentsController {
	
	@Autowired
	private StudentsService studentsservice;
	
	//插入excel表的内容
	@RequestMapping("excelDataToMYSQL")
	public AvailableResult excelDataToMYSQL(@RequestBody excelDataToMYSQLReqVo reqVo) {
		return studentsservice.excelDataToMYSQL(reqVo);
	}
	
}

5、dao

package com.gcb.Students.Dao;

import com.gcb.Students.MyMapper;
import com.gcb.Students.Po.Studentsinfo;

public interface StudentsinfoMapper extends MyMapper<Studentsinfo> {
}

4、po

package com.gcb.Students.Po;

import java.io.Serializable;

public class excelDataToMYSQLReqVo implements Serializable{
	//文件的绝对路径
	private String filepath;

	public String getFilepath() {
		return filepath;
	}

	public void setFilepath(String filepath) {
		this.filepath = filepath;
	}

	@Override
	public String toString() {
		return "excelDataToMYSQLReqVo [filepath=" + filepath + "]";
	}
	
}

这个也是放在po下

package com.gcb.Students.Po;

import java.util.List;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * @Description: 自定义响应数据结构 
 */
public class AvailableResult {

	// 定义jackson对象
	private static final ObjectMapper MAPPER = new ObjectMapper();

	// 响应业务状态
	private Integer status;

	// 响应消息
	private String msg;

	// 响应中的数据
	private Object data;

	private String ok; // 不使用

	public static AvailableResult build(Integer status, String msg, Object data) {
		return new AvailableResult(status, msg, data);
	}

	public static AvailableResult ok(Object data) {
		return new AvailableResult(data);
	}

	public static AvailableResult ok() {
		return new AvailableResult(null);
	}

	public static AvailableResult errorMsg(String msg) {
		return new AvailableResult(500, msg, null);
	}

	public static AvailableResult errorMap(Object data) {
		return new AvailableResult(501, "error", data);
	}

	public static AvailableResult errorTokenMsg(String msg) {
		return new AvailableResult(502, msg, null);
	}

	public static AvailableResult errorException(String msg) {
		return new AvailableResult(555, msg, null);
	}

	public AvailableResult() {

	}

	// public static LeeJSONResult build(Integer status, String msg) {
	// return new LeeJSONResult(status, msg, null);
	// }

	public AvailableResult(Integer status, String msg, Object data) {
		this.status = status;
		this.msg = msg;
		this.data = data;
	}

	public AvailableResult(Object data) {
		this.status = 200;
		this.msg = "OK";
		this.data = data;
	}

	public Boolean isOK() {
		return this.status == 200;
	}

	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}

	/**
	 * 
	 * @Description: 将json结果集转化为LeeJSONResult对象 需要转换的对象是一个类
	 * @param jsonData
	 * @param clazz
	 * @return
	 * 
	 * 
	 * @date 2016年4月22日 下午8:34:58
	 */
	public static AvailableResult formatToPojo(String jsonData, Class<?> clazz) {
		try {
			if (clazz == null) {
				return MAPPER.readValue(jsonData, AvailableResult.class);
			}
			JsonNode jsonNode = MAPPER.readTree(jsonData);
			JsonNode data = jsonNode.get("data");
			Object obj = null;
			if (clazz != null) {
				if (data.isObject()) {
					obj = MAPPER.readValue(data.traverse(), clazz);
				} else if (data.isTextual()) {
					obj = MAPPER.readValue(data.asText(), clazz);
				}
			}
			return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 
	 * @Description: 没有object对象的转化
	 * @param json
	 * @return
	 * 
	 * 
	 * @date 2016年4月22日 下午8:35:21
	 */
	public static AvailableResult format(String json) {
		try {
			return MAPPER.readValue(json, AvailableResult.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 
	 * @Description: Object是集合转化 需要转换的对象是一个list
	 * @param jsonData
	 * @param clazz
	 * @return
	 * 
	 * 
	 * @date 2016年4月22日 下午8:35:31
	 */
	public static AvailableResult formatToList(String jsonData, Class<?> clazz) {
		try {
			JsonNode jsonNode = MAPPER.readTree(jsonData);
			JsonNode data = jsonNode.get("data");
			Object obj = null;
			if (data.isArray() && data.size() > 0) {
				obj = MAPPER.readValue(data.traverse(),
						MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
			}
			return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
		} catch (Exception e) {
			return null;
		}
	}

	public String getOk() {
		return ok;
	}

	public void setOk(String ok) {
		this.ok = ok;
	}

}

6、service

package com.gcb.Students.Service;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.gcb.Students.Dao.StudentsinfoMapper;
import com.gcb.Students.Po.AvailableResult;
import com.gcb.Students.Po.Studentsinfo;
import com.gcb.Students.Po.excelDataToMYSQLReqVo;

@Service
public class StudentsService {

	//添加提示变量
	Logger logger = LoggerFactory.getLogger(StudentsService.class);
	
	//学生信息
	@Autowired
	private StudentsinfoMapper studentsinfoMapper;

	//插入excel数据
	public AvailableResult excelDataToMYSQL(excelDataToMYSQLReqVo reqVo) {
		try {
			logger.info(">>>>>>>>>>开始添加excel表内容");
			
			//判断参数是否为空
			if(reqVo == null) {
				logger.info(">>>>>>>>>>请求参数为空");
				AvailableResult.errorException("请求参数为空");
			}
			
			if(StringUtil.nullAndEmpty(reqVo.getFilepath())) {
				logger.info(">>>>>>>>>>文件绝对路径为空");
				AvailableResult.errorException("文件绝对路径为空");
			}
			
			logger.info(">>>>>>>>>>请求参数为:"+reqVo.toString());
			
			//将路径进行转义
			String filepath = reqVo.getFilepath().replace("##", "\\");
			
			logger.info(">>>>>>>>>>新请求参数为:"+reqVo.toString());
			
			//定义流对象
			InputStream is = new FileInputStream(filepath);
			
			//创建excel表对象
			Workbook wb = new XSSFWorkbook(is);
			
			//获取第一个表格
			Sheet sheet = wb.getSheetAt(0);
			
			if(sheet!=null) {
				
				//创建一个新的List对象
				List<Studentsinfo> studentsList = new ArrayList<Studentsinfo>();
				
				for(int rowNum = 1;rowNum<=sheet.getLastRowNum();rowNum++) {
					//创建一个新的学生对象
					Studentsinfo studentsinfo = new Studentsinfo();
					
					//获取每一行
					Row row = sheet.getRow(rowNum);
					
					//获取单元格的值
					studentsinfo.setName(row.getCell(0).getStringCellValue());
					studentsinfo.setPassword(row.getCell(1).getStringCellValue());
					
					//将每一个学生信息加入到List里
					studentsList.add(studentsinfo);
				}
				
				//将List插入到数据库
				studentsinfoMapper.insertList(studentsList);
				
			}
			return AvailableResult.ok();
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(">>>>>>>>>>添加学生信息异常,原因为:" + e.getMessage());
			return AvailableResult.errorException(e.getMessage());
		}
	}
}

7、mapper

<?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.gcb.Students.Dao.StudentsinfoMapper" >
  <resultMap id="BaseResultMap" type="com.gcb.Students.Po.Studentsinfo" >
    <!--
      WARNING - @mbg.generated
    -->
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
  </resultMap>
</mapper>

8、application.properties

server.port=8768
mybatis.mapper-locations=classpath:mapper/*.xml

mapper.mappers=com.gcb.Students.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL

spring.datasource.driverClassName=com.mysql.jdbc.Driver
#\u5e7f\u5dde\u94f6\u884c\u6d4b\u8bd5\u73af\u5883
spring.datasource.url=jdbc:mysql://localhost:3306/students?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=rootroot

9、组织图:
在这里插入图片描述
10、postman请求参数:

{"filepath":"f:\\test.xlsx"}

11、test.xlsx内容
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是SpringBoot+Mybatis-plus整合easyExcel批量导入Excel数据库+导出Excel的方法。 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <!-- easyExcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 创建实体类 创建一个实体类,用于映射 Excel 格中的数据。 ```java @Data public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; @ExcelProperty("性别") private String gender; } ``` 3. 创建Excel读取器 创建一个 Excel 读取器,用于读取 Excel 格中的数据,并将数据存储到数据库中。 ```java @Component public class ExcelReader { @Autowired private UserService userService; /** * 读取 Excel 格中的数据,并将数据存储到数据库中 */ public void readExcel(String fileName) { EasyExcel.read(fileName, User.class, new UserExcelListener()).sheet().doRead(); } /** * 用户Excel监听器 */ private class UserExcelListener extends AnalysisEventListener<User> { /** * 每读取一行数据,就会调用该方法 */ @Override public void invoke(User user, AnalysisContext context) { userService.save(user); } /** * 读取完整个 Excel 格后,会调用该方法 */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // do nothing } } } ``` 4. 创建Excel导出器 创建一个 Excel 导出器,用于从数据库中获取数据,并将数据导出到 Excel 格中。 ```java @Component public class ExcelWriter { @Autowired private UserService userService; /** * 将用户数据导出到 Excel 格中 */ public void writeExcel(String fileName) { List<User> userList = userService.list(); EasyExcel.write(fileName, User.class).sheet().doWrite(userList); } } ``` 5. 创建Controller 创建一个 Controller,用于接收前端请求,并调用相应的方法处理请求。 ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private ExcelReader excelReader; @Autowired private ExcelWriter excelWriter; /** * 批量导入用户数据 */ @PostMapping("/import") public void importExcel(@RequestParam("file") MultipartFile file) throws IOException { excelReader.readExcel(file.getInputStream()); } /** * 导出用户数据Excel */ @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { String fileName = "用户信息.xlsx"; response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.setContentType("application/vnd.ms-excel"); excelWriter.writeExcel(response.getOutputStream()); } } ``` 6. 配置文件 在 application.yml 文件中添加数据库连接信息。 ```yaml spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root mybatis-plus: mapper-locations: classpath:/mapper/*.xml type-aliases-package: com.example.demo.domain ``` 7. 测试 启动应用程序,并在浏览器中访问以下地址: - http://localhost:8080/user/export :导出 Excel 格 - http://localhost:8080/user/import :导入 Excel 格 以上就是 SpringBoot+Mybatis-plus整合easyExcel批量导入Excel数据库+导出Excel 的方法了,希望能帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值