0. 前言
因为太久太久没有碰项目了(上一次还是2021年8月开发个人博客的时候),所以这一次打算从头到尾把整个学习和搭建的过程记录下来。
1. 简介
这是一个基于SpringBoot和Mybatis的企业级文件上传下载的实战项目,没有太多前端和UI的东西。
2. 链接
【编程不良人】基于SpringBoot和Mybatis企业级文件上传下载项目实战
1. 设计
1. 需求
- 用户登陆,展示用户的所有文件(文件如果是图片则在页面中显示图片)
- 完成文件的下载和在线打开(在线打开不计入下载次数)
- 在一张页面中完成文件的上传功能,上传的目录要根据日期,每天创建一个文件夹(文件夹统一命名格式:“yyyy-MM-dd”),上传文成后要跳转到查询所有页面
2. 页面图
3. 库表设计
根据需求,可以简单把库表设计成:1. 用户表(用户信息:ID,用户名,密码);2. 文件表(文件信息:用户ID,文件名…)
DROP TABLE IF EXISTS `t_files`;
CREATE TABLE `t_files` (
`id` int(8) NOT NULL,
`oldFileName` varchar(200) DEFAULT NULL,
`newFileName` varchar(300) DEFAULT NULL,
`ext` varchar(20) DEFAULT NULL,
`path` varchar(300) DEFAULT NULL,
`size` varchar(200) DEFAULT NULL,
`type` varchar(120) DEFAULT NULL,
`isImg` varchar(8) DEFAULT NULL,
`downcounts` int(6) DEFAULT NULL,
`uploadTime` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `userId_idx` (`userId`),
CONSTRAINT `userId` FOREIGN KEY (`userId`) REFERENCES `t_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(8) NOT NULL,
`username` varchar(80) DEFAULT NULL,
`password` varchar(80) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
为后续方便,可以把db.sql
放到resources/
下面
2. 项目创建
因为不用华丽的前端,所以只需要创建一个简单的Springboot项目即可。
1. 依赖
在创建项目的时候导入基本依赖:
2. 没用文件
-
把用不到的文件删掉
-
本项目为了快捷演示,没有作任何测试,下面把
spring-boot-starter-test
依赖删掉了,所以可以把/test/java
下的文件都删掉
3. pom.xml(版本
SpringBoot
版本,视频教程比较老,里面用的版本是2.2.5
,现在用的是2.6.3
MySQL
版本一般用5.x
版本,这里改成5.1.47
,同时还可以把<scope>runtime</scope>
去掉,scope区别Lombok
版本用1.8.20
,同时去掉<optional>true</optional>
spring-boot-starter-test
,关于测试也可以去掉(不知道为什么)
3. 配置
application.properties
# 应用名在微服务架构中至关重要
spring.application.name=files
server.port=8989
server.servlet.context-path=/files
spring.thymeleaf.cache=false
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.prefix=classpath:/templates/
spring.web.resources.static-locations=classpath:/templates/,classpath:/static/
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/files?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=password
mybatis.mapper-locations=classpath:/com/zzw/mapper/*.xml
mybatis.type-aliases-package=com.zzw.entity
# 日志
logging.level.root=info
logging.level.com.zzw.dao=debug
-
记得添加一下数据库连接池
druid
的依赖 -
数据库
username
和password
换成自己的 -
url
里的数据库名称使用之前创建的 -
需要创建
dao
,entity
,mapper
包 -
此时运行项目,若能正常启动,说明环境没有问题
-
在main所在类上面添加
@MapperScan("com.zzw.dao")
,为了之后扫描dao所在的包
4. 三层简单开发
这个项目主要是学习文件上传和下载,所以不在前端和UI花费太多时间,一切从简。
以下的三层简单开发,代码块中实现了文件查询
和文件上传
功能。为避免重复粘贴,文件下载
,在线打开
和文件删除
功能的代码不在这一章节贴出来。
1. Entity
1. User
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors(chain = true)
public class User {
private Integer id;
private String username;
private String password;
}
注意@Accessors(chain = true)
这个注解可以实现set的链式编程:
Lombok插件@Accessors(chain = true)开启链式开发
2. UserFile
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors(chain = true)
public class UserFile {
private Integer id;
private String oldFileName;
private String newFileName;
private String ext;
private String path;
private String size;
private String type;
private String isImg;
private Integer downcounts;
private Date uploadTime;
private Integer userId;
}
2. DAO
注意DAO都是interface
,并且要记得添加@Mapper
1. UserDAO
@Mapper
public interface UserDAO {
User login(User user);
}
2. UserFileDAO
public interface UserFileDAO {
// 根据用户的ID获取用户的文件列表
List<UserFile> findByUserId(Integer id);
// 存储图片信息
void save(UserFile userFile);
}
3. Mapper
1. UserDAOMapper
<?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.zzw.dao.UserDAO">
<!-- login -->
<select id="login" parameterType="User" resultType=