![6c4d4e4ce3a2de9c72dd6e5bcad7021c.png](https://i-blog.csdnimg.cn/blog_migrate/004076717130feb3eac40bdfd884556e.jpeg)
目的:
通过点击批量导入用户信息的按钮,跳转至一个可以添加上传文件的页面,然后用户信息添加进数据库中
![351fa7304859e8bdb4fb9da6836c654b.png](https://i-blog.csdnimg.cn/blog_migrate/4e8d3ffd2b64a920c5916616e1eba6d3.jpeg)
![f3a8e1d1750fed399426a4ef70e47df3.png](https://i-blog.csdnimg.cn/blog_migrate/fe33dfa065be9b8a46510379b0d9d92d.jpeg)
首先,设计到文件的上传,我们需要准备文件上传的前提
1. 依赖的jar包
commons-fileupload.jar
commons-io.jar
2、准备上传文件的表单域:
![d183bac3cd8256518389c09df72e0469.png](https://i-blog.csdnimg.cn/blog_migrate/511409eceb70c1e36e6afc165e9aac52.png)
3、表单的提交方式:
![584b55a01cdca163b6917b116b22f3e8.png](https://i-blog.csdnimg.cn/blog_migrate/c35da5fb9052f0ff159016593d4f20ab.jpeg)
这里需要注意一下: post方式支持二进制文件(字节流),get地址栏,字符流
设置表单数据的编码方式: enctype="multipart/form-data"
enctype的可选值:
> application/x-www-form-urlencoded: 默认值. 表示表单数据的编码形式为: name1=value2&name2=value2...
> multipart/form-data: 以二进制数据的形式提交表单数据, 用于文件上传.
> text/plain: 以纯文本的形式提交数据.
SpringMVC实现文件上传,添加用户的信息
使用Apache提供的文件上传包, 简化了操作, 可以通过配置文件配合MutipartFile对象实现文件的上传操作.
commons-fileupload.jar
commons-io.jar
在SpringMVC的配置文件中需要提前配置文件上传解析器(多部件解析器, MutipartResolver), 该解析器背后依赖Apache的包.
<!--
当我们点击--->批量用户导入用户的信息时,给一个后端控制器发送了一个post方式的请求
![211c78c89be7c6d8afc8e485491f49dc.png](https://i-blog.csdnimg.cn/blog_migrate/c76de272e83cf013a4a0806f23fa64da.jpeg)
访问了user控制器的这个方法
![837e8dee49c743afc4d4e102931e34b6.png](https://i-blog.csdnimg.cn/blog_migrate/b3b0d7a8c7dd5912d5e882cdbff73616.jpeg)
注意:接收的参数是一个MultipartFile类型的参数,指代的就是传递过来的文件对象
因为批量导入用户信息属于添加操作,这里是需要try-catch来进行一下事务的处理的,因为Spring的配置文件中已经配置了声明式事务
![0d8c1c0398864ae3d59a96e15ef24384.png](https://i-blog.csdnimg.cn/blog_migrate/3c1b1a68949eabb1f9b612a9bd7a06a9.jpeg)
当这个try-cathch有异常是会进行事务的回滚的,如果没有异常则说明添加成功,成功的跳转至分页查询的操作,失败的话请求转发到批量添加的页面。
接着控制层调用业务层:
业务层的接口:
//批量导入
业务层的实现类:使用了流的方式来读取了文件
//批量导入用户的信息
比如:下面的这个文档就是要上传的文件信息:
每一行每一行的读,有空格就跳过继续读
![81c22a1292b1e5831ba858fce4b2662b.png](https://i-blog.csdnimg.cn/blog_migrate/7e41adad1426f6f609ed4fd0876d5c9c.jpeg)
业务层读取完的数据封装到List集合中传递到mapper层:
先定义接口中的方法:
![b061c30ceeb1f333cda5eaefae782ae1.png](https://i-blog.csdnimg.cn/blog_migrate/214c6b0eea063e4c75bd5c16e4cc40e3.jpeg)
再mapper.xml中书写批量添加操作的sql:
![e7824ddaefe2df87a8f47b3a8ad1b4e9.png](https://i-blog.csdnimg.cn/blog_migrate/7a78296fea71d58c455163137c7f4dad.jpeg)
这里需要注意的是foreach标签,这里会进行迭代,
因为添加操作values后面有很多的(),(),()....每个括号代表一个添加的用户信息,所以separator的意思就是以逗号,进行分割
如上就完成了文件批量导入用户的信息操作