上传数据文件,解析入库,分页展示。
0.pom中引入分页插件依赖:
<!--分页插件 pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<!-- 特别注意版本问题 -->
<version>1.2.3</version>
</dependency>
0.1 application-dev.yml文件下新增如下配置:
#分页pageHelper
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
1.创建表ofs_employee:
DROP TABLE IF EXISTS `ofs_employee`;
CREATE TABLE `ofs_employee` (
`e_id` int(20) NOT NULL AUTO_INCREMENT,
`e_name` varchar(50) NOT NULL,
`e_age` int(20) NOT NULL,
PRIMARY KEY (`e_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8;
2.在resources/mapping下创建EmployeeMapping.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="org.huchao.ofs.mapper.EmployeeMapper">
<resultMap id="BaseResultMap" type="org.huchao.ofs.entity.Employee">
<result column="e_id" jdbcType="INTEGER" property="id" />
<result column="e_name" jdbcType="VARCHAR" property="name" />
<result column="e_age" jdbcType="INTEGER" property="age" />
</resultMap>
<insert id="insertBatch" parameterType="java.util.List">
insert into ofs_employee (e_id,e_name,e_age)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id,jdbcType=INTEGER}, #{item.name,jdbcType=VARCHAR}, #{item.age,jdbcType=VARCHAR})
</foreach>
</insert>
<select id="getEmployeesInfo" resultMap="BaseResultMap">
select e_id,e_name,e_age from ofs_employee
</select>
</mapper>
3.mapper下创建EmployeeMapper接口:
package org.huchao.ofs.mapper;
import org.huchao.ofs.entity.Employee;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EmployeeMapper {
void insertBatch(List<Employee> employees);
List<Employee> getEmployeesInfo();
}
4.创建实体类entity(Employee);
并生成get,set.toString和构造方法。windows生成代码快捷键alt+insert。
public class Employee {
Integer id;
String name;
Integer age;
}
5.创建controller(EmployeeController):
controller注入EmployeeService:
@Autowired
private EmployeeService employeeService;
controller中创建三个方法:
a.index()方法,用于跳转至employee.jsp页面:
@RequestMapping("index")
public String index() {
return "employee";
}
b.uploadFile()方法:
处理上传的txt文件并调用service的方法解析txt文件。
@RequestMapping(value = "uploadFile", method = RequestMethod.POST)
@ResponseBody
public String uploadFile(@RequestParam("uploadFile") MultipartFile uploadFile, HttpServletRequest req) {
if (uploadFile.isEmpty()) {
return "文件不存在";
}
File files = null;
try {
byte[] bytes = uploadFile.getBytes();
//创建文件存放位置的路径,路径可以自定义
String path = req.getServletContext().getRealPath("/file");
//根据创建的路径,生成存放的文件。
File filePath = new File(path);
//此文件夹会生成与src/main/webapp中。
filePath.mkdirs();
//生成存放的文件夹之后,再创建上传的文件的名字。名字可以自定义。getOriginalFilename()得到文
// 件上传的原始名字。UUID.randomUUID()生成一个随机的ID。
String filena = uploadFile.getOriginalFilename();
String filename = UUID.randomUUID().toString() + filena;
//生成最后一级的文件
files = new File(filePath + "/" + filename);
//写入指定文件夹
OutputStream out = new FileOutputStream(files);
out.write(bytes);
logger.debug("文件上传成功,路径:"+files.getAbsolutePath());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// service处理文件解析和导入数据库工作
long l = System.currentTimeMillis();
employeeService.batchAddEmployee(files.getAbsolutePath());
logger.info("单线程处理耗费时间:"+(System.currentTimeMillis()-l)+"毫秒");
return "success";
}
c.getEmployee()方法,分页查询数据:
@RequestMapping(value = "getEmployee")
public ModelAndView getEmployee(@RequestParam(value = "pageNum" ,defaultValue = "1") int pageNum){
ModelAndView mav = new ModelAndView("employee");
PageInfo<Employee> employeesInfo = employeeService.getEmployeesInfo(pageNum, 5);
mav.addObject("PageInfo",employeesInfo);
return mav;
}
6.创建service:
6.1 在service中注入EmployeeMapper:
@Autowired
private EmployeeMapper employeeMapper;
6.2 创建txt文件解析的方法praserTXT():
private static void praserTXT(String fileName, List<Employee> employees){
// 读取文件
BufferedReader br = null;
try {
// 这里可以控制编码
br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
StringBuffer sb = new StringBuffer();
sb.append(line);
Employee employee = strToBean(sb.toString());
employees.add(employee);
System.out.println(employee.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.3 创建将字符串转换为bean的方法strToBean():
/**
* 字符串转Employee对象
* @param str
* @return
*/
private static Employee strToBean(String str){
String[] split = str.split("\\|");
return new Employee(Integer.parseInt(split[0]), split[1], Integer.parseInt(split[2]));
}
6.4 创建batchAddEmployee()方法调用praserTXT()解析文件,并将数据入库:
public void batchAddEmployee(String fileName){
ArrayList<Employee> employees = new ArrayList<>();
praserTXT(fileName,employees);
employeeMapper.insertBatch(employees);
}
6.5 调用PageHelper插件实现分页查询数据:
public PageInfo<Employee> getEmployeesInfo(int pageNum,int pageSize){
PageHelper.startPage(pageNum, pageSize);// limit pageNum pageSize
List<Employee> employeesInfo = employeeMapper.getEmployeesInfo();
PageInfo<Employee> employeePageInfo = new PageInfo<>(employeesInfo);
return employeePageInfo;
}
7.在webapp/WEB-INF/jsp下新建employee.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<head>
<title>文件处理</title>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script type="text/javascript">
function doUpload() {
var upl = document.getElementById("upload");
upl.submit();
}
function doDownload() {
var upl = document.getElementById("download");
upl.submit();
}
</script>
</head>
<body>
<form id="upload" enctype="multipart/form-data" method="post" action="/employee/uploadFile">
<input id = "uploadFile" type="file" name="uploadFile"/>
<input type="button" value="文件上传" onclick="doUpload()"/>
</form>
<div>
<a href="/employee/getEmployee?pageNum=1">员工列表</a>
</div>
<table border="1px">
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>操作</td>
</tr>
<c:forEach items="${PageInfo.list}" var="list">
<tr>
<td>${list.id}</td>
<td>${list.name}</td>
<td>${list.age}</td>
<td>
<a onclick="">删除</a> |
<a onclick="">修改</a>
</td>
</tr>
</c:forEach>
</table>
<div>
当前第${PageInfo.pageNum}页,总共${PageInfo.pages}页,总共${PageInfo.total}条记录
</div>
<div>
<a href="/employee/getEmployee?pageNum=1">首页</a>
<c:if test="${PageInfo.pageNum != 1 }">
<a href="/employee/getEmployee?pageNum=${PageInfo.pageNum-1}">上一页</a>
</c:if>
<c:if test="${PageInfo.pageNum != PageInfo.pages }">
<a href="/employee/getEmployee?pageNum=${PageInfo.pageNum+1}">下一页</a>
</c:if>
<a href="/employee/getEmployee?pageNum=${PageInfo.pages}">尾页</a>
</div>
</body>
</html>
启动程序,在浏览器中输入:
http://localhost:8080/employee/index
进入employee页面。
点击选择文件,选择employee.txt文件并上传:
访问http://localhost:8080/employee/index回到employee页面,点击员工列表链接查询员工列表:
分页插件PageHelper官方文档https://pagehelper.github.io/docs/howtouse/