上节我们说到了删除员工,接下来我们继续实现员工管理的后续功能
目录
员工管理
1新增员工
接下来我们继续讲员工管理模块的新增员工,因为还要涉及到头像上传的部分内容,所以我们主要分四部分来写
1.1新增员工
首先是新增员工,我们先来明确新增员工具体的需求
当点击新增员工之后,我们需要填写以上信息,我们明确填写的信息之后,接下来查看一下接口文档
最终请求的数据以json的格式响应
然后我们来分析一下思路
接下来参照思路来完成代码实现
首先是controller层
@PostMapping
public Result save(@RequestBody Emp emp){
log.info("新增员工,emp:{}",emp);
empService.save(emp);
return Result.success();
}
因为在最上方我们已经生成了其requestMapping,所以postMapping后面无序加入请求路径了
然后是service层以及其impl实现类
//service层
/**
* 新增员工
* @param emp
*/
void save(Emp emp);
//impl类
@Override
public void save(Emp emp) {
//补充实体基础属性
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.insert(emp);
}
}
最后是mapper接口
/**
* 新增员工
* @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 insert(Emp emp);
之后代码就编写完成了,接下来我们打开postman做一个测试
启动程序代码之后,点击发送,我们可以根据响应回来的数据发现添加数据成功,最后在emp表中查找到了插入的案例林平之
1.2文件上传
完成了新增员工的功能之后,接下来我们来完成文件上传,文件上传分三部分进行讲解
1.2.1简介
首先,我们要了解什么是文件上传
所谓的文件上传,就是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览和下载的过程
文件上传需要涉及到两个部分,一个是前端程序,一个是服务端程序
前端要想上传,必须要先定义一个form表单,然后form表单里面必须有一个表单项file,且表单的提交方式必须是post,最后需要通过enctype指定其编码格式为multipart/form-data,因为普通的编码格式不适合传输图片这种大的二进制数据。上面三项即为前端页面上传三要素,具体形式如下所示
之后我们在resources/static下进行前端代码upload.html的编写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
姓名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
头像: <input type="file" name="image"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
我们进行测试可以发现,把enctype设置为multipart之后/form-data,表单的数据在提交时将分为多个部分提交
接下来我们看一下服务端如何接收上传上来的文件
首先需要定义一个controller来接收,同时定义一个方法,其他的姓名、年龄依旧按照之前的方法去接收,我们需要注意的是第三个文件如何去接收,在spring中提供了一个api叫做MultiPartFile,通过这个api就可以接收到上传上来的文件,不过我们需要保证参数名和方法形参名保持一致,如果不一致,我们需要通过一个注解进行参数绑定,即@ReuquestParam,但通常不会这么做,我们只需要保证名字一致就好了
接下来我们在controller层创建一个uploadController
package com.ittaotao.controller;
import com.ittaotao.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;
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username , Integer age , MultipartFile image){
log.info("文件上传:{},{},{}", username , age , image);
return Result.success();
}
}
之后,我们在Tomcat上进行测试,我们可以发现文件已经上传上来
将其更改为txt可以发现我们获取的姓名、年龄、以及上传的文件
最后,直接放行结束程序,可以发现之前的三个临时文件已经不存在了,所以接下来我们需要进行文件的存储
1.2.2本地存储
文件上传时,服务器端会产生一个临时文件,请求响应之后,这个文件被自动删除,并没有保存下来。接下来我们会讲解两种存储方案,一种是服务器本地存储,另一种是云存储
首先我们讲一下本地存储,其定义为:在服务端,接收到上传的文件之后,将文件存储在本地服务器磁盘上
我们可以先在磁盘中建立一个目录images,接下来复制磁盘路径,打开之前的controller代码
@PostMapping("/upload")
public Result upload(String username , Integer age , MultipartFile image) throws Exception {
log.info("文件上传:{},{},{}", username , age , image);
//获得原始文件名
String originalFilename = image.getOriginalFilename();
//将文件存储在服务器的磁盘目录"E:\Java\images"
image.transferTo(new File("E:\\Java\\images\\" + originalFilename));
return Result.success();
}
按照上面代码进行更改之后,我们尝试通过postman进行上传操作
我们发现已经上传上去了,我们点击放行之后,发现图片依然保存在images目录下面
这样我们就完成了文件存储,接下来我们想一下,如果采用了原始文件名进行存储的话,如果a用户上传完了之后,b用户又上传了以同样原始文件名命名的文件到images目录下,这样就会造成文件覆盖
此时我们就可以采用uuid来解决,uuid(通用唯一识别码)
我们通过测试来看一下生成的uuid长什么样子
package com.ittaotao;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.UUID;
@SpringBootTest
class TliasWebManagementApplicationTests {
@Test
public void testUuid(){
for (int i = 0; i < 1000 ; i++) {
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
}
}
}
444ad7fc-65cb-4d9b-ac58-ce2a42fc91f9
我们可以发现,所有的uuid长度都是固定的,且都是唯一的,所以我们就可以用uuid来表示我们的文件名
其具体代码实现如下
@PostMapping("/upload")
public Result upload(String username , Integer age , MultipartFile image) throws Exception {
log.info("文件上传:{},{},{}", username , age , image);
//获得原始文件名 -1.jgp
String originalFilename = image.getOriginalFilename();
//构造唯一的文件名(不能重复) - uuid (通过唯一识别码)
int index = originalFilename.lastIndexOf(".");
String extname = originalFilename.substring(index);
String newFileName = UUID.randomUUID().toString() + extname;
log.info("新的文件名:{}",newFileName);
//将文件存储在服务器的磁盘目录"E:\Java\images"
image.transferTo(new File("E:\\Java\\images\\" + newFileName));
return Result.success();
}
然后我们进行上传,可以发现文件名已经发生变化
此时我重复进行send发送,文件依然会保存下来,不会覆盖
我们需要知道,这里面上传的照片最大不能超过1M,如果超过(视频或音频必定超过),那么我们只需要做一个配置即可
如果要接收多个文件,我们可以利用数组或者集合来进行接收
在application.properties中进行配置
#配置单个文件上传大小的限制
spring.servlet.multipart.max-file-size= 10MB
#配置单个请求最大大小限制(一次请求中是可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
以上就是本地存储的全部内容了,但是在平常的开发中,本地存储并不常用。
ok,经典白雪又来了,原因主要是如果所有的文件全部存储到磁盘目录当中,那么这些文件在前端页面当中无法直接访问,第二个原因,如果我们项目中大量的文件都存储在本地磁盘当中,而服务器的磁盘容量又是有限,如果服务器磁盘容量满了,是不容易扩容的,特别是一些大型的互联网项目,其文件图片,音频,视频都非常大。第三个原因,加入磁盘坏了,那么存储在磁盘上的所有文件都丢失了,此时损失就非常大了。所以本地存储在日常开发中就很少见了
最后我们来总结一下本地存储用到的一些方法
1.3阿里云OSS
1.3.1准备
既然本地存储存在上方的缺点,那么现在基本上项目开发也不会在使用了,现在项目开发上传文件基本上就是两种方案。第一种就是项目组自己搭建一套文件存储服务来存储上传文件,比如FastDfs、MinIO这种存储服务解决当前问题,但是比较繁琐,需要自己买服务器,自己搭建。第二种则是使用现成的、别的公司提供好的云服务器来存储服务,这种使用起来方便且安全可靠,只不过需要支付一定费用
接下来我们就来使用一下阿里云OSS
首先,简单介绍一下阿里云。阿里云是阿里巴巴旗下全球领先的云计算公司,也是国内最大的云服务提供商。诸如语音服务、短信服务、视频点播等等等等的云服务,我们都不需要自己开发,直接使用阿里云提供好的即可。
简单了解上述知识以后,接下来我们来介绍今天的主角,阿里云OSS
使用阿里云oss,可以很方便的进行文件的存储,且安全可靠
然后,我们来看一下使用第三方服务的通用思路
要想使用阿里云oss,我们需要进行一下步骤:注册阿里云、充值、开通对象存储服务(oss)、创建bucket(存储空间是用户用于存储对象(object,就是文件)的容器,所有的对象都必须隶属于某个存储空间)、获取AccessKey、参照官方SDK(Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK)编写入门程序、案例集成OSS
1.3.2入门
首先,创建bucket
然后,获取accesskey(秘钥)
AccessKey ID - LTAI5tP1ExeeQB6W1XpSwepc
AccessKey Secret - diODsWYVmyhcIe46S4f19D3ldkZjP8
我们现在只需要将本地的图片上传到阿里云oss,交给oss管理即可
那么我们如何进行上传呢,我们需要查看阿里云的官方文档-sdk示例
这就是阿里云oss的官方文档,这里面有对oss的详细说明,接下来,我们直接找到sdk示例下方的java,进行oss的操作
首先,先找到依赖的配置
接下来,找到上传文件,然后一字不差地复制到idea中对其进行改造
package com.ittaotao;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tP1ExeeQB6W1XpSwepc";
String accessKeySecret = "diODsWYVmyhcIe46S4f19D3ldkZjP8";
// 填写Bucket名称,例如examplebucket。
String bucketName = "webzzt-tilas";
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String objectName = "1.jpg";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
String filePath= "C:\\Users\\张祖滔\\Pictures\\qinqin.jpeg";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
try {
InputStream inputStream = new FileInputStream(filePath);
// 创建PutObject请求。
ossClient.putObject(bucketName, objectName, inputStream);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (Exception ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
我们只需要把上方参数改成我们自己的即可
最后运行此main方法,即可上传到阿里云oss
最后,在阿里云oss后台找到该图片即可
1.3.3集成
当我们进行新增员工的填写的时候,录入员工基本信息,需要上传头像,当我们点击图片的时候,就会让我们来选择上传的图片,当我们选择某一张图片的时候,就会进行文件上传操作,就会进行uploadController操作:1.接收上传的图片2.将图片存储起来(oss)3.返回图片访问的url
接下来我们就来完成文件上传接口的实现,我们先来看一下接口文档
接下来我们看一下具体的操作步骤
1.引入阿里云oss上传文件工具类(由官方的示例代码改造而来)
2.上传图片接口开发
我们首先要在com.ittaotao下面建一个包Util
之后创建AliOSSUtils.java
package com.ittaotao.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
public class AliOSSUtils {
private String endpoint = "https://oss-cn-beijing.aliyuncs.com";
private String accessKeyId = "LTAI5tP1ExeeQB6W1XpSwepc";
private String accessKeySecret = "diODsWYVmyhcIe46S4f19D3ldkZjP8";
private String bucketName = "webzzt-tilas";
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
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的路径返回
}
}
注意,我们在上面可以发现文件的访问路径就是endpoint与bucketname+文件名的部分拼接完成
接下来我们进行上传图片接口的开发,我们先把本地存储的代码进行注释
package com.ittaotao.controller;
import com.ittaotao.pojo.Result;
import com.ittaotao.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Slf4j
@RestController
public class UploadController {
//直接注入进来
@Autowired
private AliOSSUtils aliOSSUtils;
//本地存储
/*@PostMapping("/upload")
public Result upload(String username , Integer age , MultipartFile image) throws Exception {
log.info("文件上传:{},{},{}", username , age , image);
//获得原始文件名 -1.jgp
String originalFilename = image.getOriginalFilename();
//构造唯一的文件名(不能重复) - uuid (通过唯一识别码)
int index = originalFilename.lastIndexOf(".");
String extname = originalFilename.substring(index);
String newFileName = UUID.randomUUID().toString() + extname;
log.info("新的文件名:{}",newFileName);
//将文件存储在服务器的磁盘目录"E:\Java\images"
image.transferTo(new File("E:\\Java\\images\\" + newFileName));
return Result.success();
}*/
@PostMapping("/upload")
public Result upload(MultipartFile image) throws IOException {
log.info("文件上传,文件名:{}",image.getOriginalFilename());
//调用阿里云oss工具类进行文件上传
String url = aliOSSUtils.upload(image);
log.info("文件上传完成,文件访问的URL:{}",url);
return Result.success(url);
}
}
接口编写完成之后,接下来我们利用postman来进行一个测试
测试之后我们发现data里面即为路径url,我们打开阿里云看一下
可以发现,我们的文件列表多了一个文件,也就是我们刚刚测试上传出来的文件
最后,我们进行前后端联调测试
最后,我们发现新增员工连带着图片一起保存进来了
以上即是文件上传的所有内容了·
2.修改员工
2.1查询回显
接下来我们来完成员工管理的最后一个功能——修改员工,也就是界面上的编辑功能
当我们点击编辑之后,首先,先要根据id将员工内容查询出来显示在表单上,这个内容我们就叫做查询回显
首先,我们先来看一下查询回显的接口文档信息
响应数据依然是json格式
接下来我们看一下查询回显的思路
同样地,注意一下注解@GetMapping(查询操作)@PathVariables(接收路径参数)
好的,思路捋清之后,我们接下来直接开始代码开发
这块代码还是比较简单的
首先是controller
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){
log.info("根据ID查询员工信息,id:{}",id);
Emp emp = empService.getById(id);
return Result.success(emp);
}
然后是service及其实现类
//service
/**
* 根据ID查询员工
* @param id
* @return
*/
Emp getById(Integer id);
//impl
@Override
public Emp getById(Integer id) {
return empMapper.getById(id);
}
最后是mapper接口
/**
* 根据ID查询员工
* @param id
* @return
*/
@Select("select * from emp where id = #{id}")
Emp getById(Integer id);
最后我们来重新启动服务做一个测试,我们发现1号员工金庸的信息已经返回出来了
以上就是修改员工的第一步,查询回显,稍后我们继续来进行修改员工的修改操作
2.2修改员工
接下来,我们完成第二步操作,修改员工,当数据回显之后,就会在表单当中展示原来的数据,我们就可以在原来的数据基础上修改员工的基本信息,修改完点击保存,提交到服务端,最终再修改数据表中的数据,以上就是修改员工的需求,接下来我们来看一下接口文档
同样的,请求的参数是一个json格式的数据,那我们需要考虑一下,把这些数据提交给服务端,服务端该怎样更新这个员工?
答案是应该根据ID更新,因为在更新员工当中,id不变,其他所有字段都有可能发送改变。
现在我们在图形化界面先完成sql语句的书写
-- 更新员工
update emp
set username = 'Tom1',
password = '123456',
name='汤姆1',
gender=1,
image='1.jpg',
job = 1,
entrydate='2005-01-01',
dept_id=1,
update_time='2022-01-01 00:00:00'
where id = 1;
接下来我们来分析一下修改员工的思路
由于是修改操作,所以要在方法上加一个注解@PutMapping,在这个方法上我们要接收请求参数并完成参数的封装,页面传递的参数是一个json格式的参数,json格式的参数在服务端需要通过一个实体类来接收,并且实体类前面要加一个注解@RequestBody,接收到请求参数之后,就可以在service中执行修改操作,在service中,我们要写补充update-time这个数据,将其设置为当前时间,然后在调用mapper接口方法执行修改数据操作,在mapper中,编写动态sql语句
接着我们来按照思路编写代码,首先是controller层
@PutMapping
public Result update(@RequestBody Emp emp){
log.info("更新员工:{}",emp);
empService.update(emp);
return Result.success();
}
然后是service以及其实现类
/**
* 更新员工
* @param emp
*/
void update(Emp emp);
@Override
public void update(Emp emp) {
//补充基础数据-updateTime
emp.setUpdateTime(LocalDateTime.now());
empMapper.update(emp);
}
最后是mapper接口,我们这次使用的是动态sql,所以使用xml进行sql语句的编写
/**
* 更新员工
* @param emp
*/
void update(Emp emp);
<!-- 更新员工 -->
<update id="update">
update emp
<set>
<if test="username != null and username != ''">
username = #{username},
</if>
<if test="password != null and password != ''">
password = #{password},
</if>
<if test="name != null and name != ''">
name= #{name},
</if>
<if test="gender != null and gender != ''">
gender = #{gender},
</if>
<if test="image != null and image != ''">
image = #{image},
</if>
<if test="job != null and job != ''">
job = #{job},
</if>
<if test="entrydate != null and entrydate != ''">
entrydate = #{entrydate} ,
</if>
<if test="dept_id != null and dept_id != ''">
dept_id = #{deptId} ,
</if>
<if test="update_time != null and update_time != ''">
update_time = #{updateTime}
</if>
</set>
where id = #{id};
</update>
然后我们来启动服务,用postman进行测试
测试完成,更新成功。最后可以进行前后端联调测试。
我们在界面上编辑一下金庸的信息,改为Tom1
2.3配置文件
以上就是修改员工的所以内容了,同时与上一篇博客联合员工管理的增删改查功能全部编写完成,最后我们对案例当中的一些配置信息进行优化,同时也是今天内容的最后一个章节。
springboot的配置文件就是我们前面一直使用的application.properties,首先配置文件会分为三部分来讲,参数配置化、yml配置文件以及@ConfigurationProperties
2.3.1参数配置化
首先,我们先看一下当前代码的问题,对其进行优化从而引出一种思想——参数配置化
我们项目的参数配置过于分散是不方便集中管理的,因为每次都要在众多代码中找到你所需要的去进行更改。
那么如何将这些参数集中管理呢?大家可以想一下,Java代码会有很多,但是对应springboot项目来说,什么东西只有一个呢?
即是我们的配置文件,我们选择的则是application.properties这一配置文件,此时我们可以考虑将阿里云的这四个参数从java代码中转移到配置文件上。形式即为key=value
#阿里云OSS配置
aliyun.oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com
aliyun.oss.accessKeyId=LTAI4GCH1vX6DKqJWxd6nEuW
aliyun.oss.accessKeySecret=yBshYweHOpqDuhCArrVHwIiBKpyqSL
aliyun.oss.bucketName=web-tlias
我们将参数写到配置文件之后,如何在原来的AliOSSUtils中进行使用呢?
强大的springboot为我们提供了一个注解@Value(通常用于外部配置的属性注入,具体用法为:@Value("${配置文件中的key}") )
@Value("${aliyun.oss.endpoint}")
private String endpoint ;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId ;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret ;
@Value("${aliyun.oss.bucketName}")
private String bucketName ;
这就代表key(aliyun.oss.endpoint)所对应的值(https://oss-cn-hangzhou.aliyuncs.com)会赋值给下面的endpoint,这样我们就解决了上面的问题,我们已经将配置的参数全部交给properties配置文件去管理,如果想要修改,直接在properties里面进行修改即可,且不用再进行编译
最后进行debug调试,看一下四个参数值是否录入进来
此时,我们的参数配置已经优化完成,接下来我们来说一下yml配置文件
2.3.2yml配置文件
在springboot当中,提供了多种配置文件,不止properties,还有另外一种配置文件,也就是yml格式的配置文件(后缀可以是yml或者yaml)
我们可以发现,三种配置文件的文件名都相同,只是后缀名不同。如果是yml形式,其书写形式为key:value,且具有层级形式,即先配置第一级server,然后配置第二级port、address
我们在resources下创建application.yml,可以发现,文件前面有一个图标,说明springboot是识别yml文件的。
我们简单更改一下端口号,运行服务,发现已经更改完成
对比我们使用过的三种配置文件,xml因为含有大量的标签,所以较为臃肿,而properties如果遇到多层级的情况也会如此,造成层级结构不清晰。如果使用yml,层级结构非常清晰,且没有一点多余的配置。
然后,我们来了解一下yml格式的基本语法
大小写敏感
- 数值前面必须有空格,作为分隔符
- 使用缩进表示层级关系,缩进时,不能使用Tab键,只能用空格(idea会自动将tab转换为空格)
- 缩进的空格数目不重要,只要相同层级的元素左侧对其即可
- #表示注释,从这个字符一直到行尾,都会被解析器忽略
然后我们来介绍yml中的一些数据格式
#定义对象/Map集合
user:
name: Tom
age: 20
address: beijing
#定义数组/List/Set
hobby:
- java
- c
- game
- sport
最后,我们来编写yml配置文件将我们之前的properties替换掉
spring:
#数据库连接信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/tlias
username: root
password: 123456
#文件上传的配置
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
# mybatis配置
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
#阿里云OSS配置
aliyun:
oss:
endpoint: https://oss-cn-beijing.aliyuncs.com
accessKeyId: LTAI5tP1ExeeQB6W1XpSwepc
accessKeySecret: diODsWYVmyhcIe46S4f19D3ldkZjP8
bucketName: webzzt-tilas
最后,我们备份完properties文件后删除掉,重启服务,打开浏览器刷新,如果没问题说明我们配置成功。也就是我们所以配置都移动到了yml文件中了
2.3.3@ConfigurationProperties
讲解完了yml配置文件,最后我们来讲解一个注解
首先说一下问题,我们前面利用了@value注解对那四个参数进行值的声明,四个参数还好,如果是100个呢?是不是感觉很繁琐,那么,经典白学来了,我们是否可以不用再每一个成员变量上加入value注解就可以自动的将配置项当中的值直接注入给这个对象的属性值呢?
答案是肯定的,在spring中就给我们提供了一种简化的方式,但是他是有前提条件的,首先,配置文件当中key的名字必须一样。并且需要为实体类属性提供get/set方法,所以在实体类上面加上注解(@Data),第二点,需要将这个类交给IOC容器管理,成为IOC容器的bean对象,所以实体类上加上注解(@Component),最后,我们可以发现四个配置项有一个共同的前缀(aliyun.oss),所以我们要利用新学习的注解@ConfigrationProperties(prefix = "aliyun.oss")指定四个配置项的前缀。此时,这四个配置项的值就可以自动的注入到bean对象的四个属性当中。如果其他的类想要获取对应的值,那么只需要去注入对应的bean对象,然后调用其get方法,就可以拿到其属性值。
我们现在开始代码实现
package com.ittaotao.utils;
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.java里面的代码进行修改,并且进行注入以及利用get方法获取对应的值
@Autowired
private AliOSSProperties aliOSSProperties;
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的路径返回
}
最后,我们进行debug,发现四个属性的值已经拿到了
以上就是这片博文的所有内容了,是对于上一篇员工管理的补充,如有疑问,还请各位评论区多多指教!