🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:JavaWeb开发
🌠 首发时间:2024年3月12日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
新增员工
需求
思路
实现
EmpController.java
@PostMapping
public Result save(@RequestBody Emp emp) {
log.info("新增员工,emp: {}", emp);
empService.save(emp);
return Result.success();
}
EmpServiceImpl.java
@Override
public void save(Emp emp) {
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.save(emp);
}
EmpMapper.java
/**
* 新增员工
*
* @param emp
*/
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
"VALUES (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
void save(Emp emp);
测试
测试数据:
{
"image": "1.jpg",
"username": "linpinzhi",
"name": "林平之",
"gender": 1,
"job": 1,
"entrydate": "2015-09-18",
"deptId": 1
}
文件上传
简介
- 文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
- 文件上传在项目中应用非常广泛,我们发微博、发微信朋友圈都用到了文件上传功能。
前端页面三要素
本地存储
- 在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。
将资料中 “文件上传” 目录下的 upload.html 复制到 resources 下的目录下:
接下来,我们在 controller 目录下写一个程序来接收前端页面上传的文件并将文件存储在本地:
UploadController.java
import com.xixi.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws Exception {
log.info("文件上传:{}, {}, {}", username, age, image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
//将文件存储在服务器的磁盘目录中
image.transferTo(new File("D:\\images\\" + originalFilename));
return Result.success();
}
}
然后,我们进行测试,在D盘下创建文件夹images,启动服务,在Postman中进行测试:
现在这个程序还是有bug的,当我们再上传一张同名的图片后,会发现原来的图片被覆盖了,所以下面我们要解决如何给每个文件构造一个唯一的文件名
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws Exception {
log.info("文件上传:{}, {}, {}", username, age, image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
//构造唯一的文件名,使用uuid(通用唯一标识码)
int index = originalFilename.lastIndexOf("."); //定义原始文件名中最后一个点的下标
String extname = originalFilename.substring(index); //将点及其后面的内容截取出来,也就是获取到文件的后缀
String newFileName = UUID.randomUUID() + extname;
log.info("新的文件名:{}", newFileName);
//将文件存储在服务器的磁盘目录中
image.transferTo(new File("D:\\images\\" + newFileName));
return Result.success();
}
}
当我们上传了一张超过1M的图片时,会出现以下情形:
意思就是文件太大了,服务器接收不了
在SpringBoot中,文件上传,默认单个文件允许最大大小为 1M。如果需要上传大文件,可以进行如下配置:
#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(因为一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
重启服务,再测试,就可以了:
本地存储的缺点:
阿里云OSS
阿里云
-
阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商
阿里云OSS
-
阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
第三方服务-通用思路
SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。
阿里云OSS-使用步骤
Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。
具体步骤:
点击访问阿里云官网 https://www.aliyun.com/ ,登录并认证后按照下列步骤操作
开通后:
创建Bucket:
获取秘钥:
记得保存秘钥,后面无法再查看创建的秘钥:
参照官方SDK,编写入门程序:
返回 OSS 界面:
找到Java,按照教程操作即可:
引入依赖:
接下来找到官方文档中关于Java如何上传文件的教程,我们来入门OSS:
复制全部代码,粘贴到测试目录下:
将内容改成自己的:
注意:配置完环境变量后,记得重启一下IDEA
右键运行,然后到Bucket查看,可以看到图片已经上传成功:
阿里云OSS-集成:
- 引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
- 开发上传图片接口
创建包 utils 用来存放工具类,将资料中的工具类 AliOSSUtils 粘贴到包下,并将信息修改为自己的:
开发文件上传接口:
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public Result upload(MultipartFile image) throws Exception {
log.info("文件上传,文件名:{}", image.getOriginalFilename());
//调用阿里云OSS工具类进行文件上传
String url = aliOSSUtils.upload(image);
log.info("文件上传完成,文件访问的url:{}", url);
return Result.success(url);
}
}
测试:
我们再来到前端页面,添加一个员工:
修改员工
查询回显
当我们点击编辑时,页面会将该员工的信息展示出来供我们修改,这个功能称为查询回显
需求
思路
实现
EmpController.java
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
log.info("根据ID查询员工信息,id:{}", id);
Emp emp = empService.getById(id);
return Result.success(emp);
}
EmpMapper.java
/**
* 根据ID查询员工
* @param id
* @return
*/
@Select("select * from emp where id = #{id}")
Emp getById(Integer id);
测试
修改员工
需求
思路
实现
EmpController.java
@PutMapping
public Result update(@RequestBody Emp emp) {
log.info("更新员工信息:{}", emp);
empService.update(emp);
return Result.success();
}
EmpServiceImpl.java
@Override
public void update(Emp emp) {
emp.setUpdateTime(LocalDateTime.now());
empMapper.update(emp);
}
EmpMapper.xml
<!-- 更新员工信息-->
<update id="update">
update emp
<set>
<if test="username != null and username != ''">
username = #{username},
</if>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="gender != null">
gender = #{gender},
</if>
<if test="entrydate != null">
entrydate = #{entrydate},
</if>
<if test="image != null and image != ''">
image = #{image},
</if>
<if test="job != null">
job = #{job},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="deptId != null">
dept_id = #{deptId}
</if>
</set>
where id = #{id}
</update>
测试
修改前:
修改后:
配置文件
参数配置化
问题分析
在前面导入的工具类中,我们硬性地将OSS的各种参数设置在类中:
当我们使用的技术或服务多了之后,每个技术都有其参数,我们想要修改参数的时候,是挺麻烦的
问题解决
-
将参数配置在工程的配置文件中
-
需要使用的时候,通过
@Value
注解引入@Value
注解通常用于外部配置的属性注入,具体用法为:@Value("${配置文件中的key}")
在之后,我们遇到类似的问题,都可以采用这种方法来解决
yml配置文件
配置格式
SpringBoot提供了多种属性配置方式
-
application.properties
server.port=8080 server.address=127.0.0.1
-
application.yml
server: port: 8080 address: 127.0.0.1
-
application.yaml
server: port: 8080 address: 127.0.0.1
常见配置文件格式对比
-
XML(臃肿)
<server> <port>8080</port> <address>127.0.0.1</address> </server>
-
properties(层级结构不清晰)
server.port=8080 server.address=127.0.0.1
-
yml / yaml(简洁,数据为中心,推荐)
server: port: 8080 address: 127.0.0.1
yml
基本语法
- 大小写敏感
- 数值前边必须有空格,作为分隔符
- 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略
yml数据格式
-
对象/Map集合:
user: name: zhangsan age: 18 password: 123456
-
数组/List/Set集合:
hobby: - java - game - sport
yml配置
创建配置文件 application.yml,在 application.yml 中的配置案例相关的配置项
配置完成后,就可以将 application.properties 删掉了
@ConfigurationProperties
问题分析
@ConfigurationProperties
我们定义一个类 AliOSSProperties,在其中定义OSS的各个参数,这个类可以复用:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
再修改一下 AliOSSUtils 类,注入 AliOSSProperties 对象并获取其参数:
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
@Component
public class AliOSSUtils {
@Autowired
private AliOSSProperties aliOSSProperties;
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
//获取阿里云OSS参数
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
发现有报红,只要添加下面这个依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
@ConfigurationProperties 与 @Value 对比