新增员工
EmpController类
@PostMapping
public Result save(@RequestBody Emp emp){
log.info("新增员工操作,emp:{}",emp);
empService.save(emp);
return Result.success();
}
EmpServiceImpl实现类
//新增员工
@Override
public void save(Emp emp) {
//补充基础属性 创建和修改属性
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.insert(emp);
}
EmpMapper接口
//新增员工
@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);
文件上传
文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程
文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能
1. 前端页面三要素、
表单项 type="file"
表单提交方式post
表单的enctype属性multipart/form-data
<!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>
2.服务端接收文件
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();
}
}
本地存储
在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中
package com.example.controller;
import com.example.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
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.nio.channels.MulticastChannel;
import java.util.UUID;
/**
* @author hyk~
*/
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件上传:{},{},{}",username,age,image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
//构造唯一文件名(不能重复) - uuid(通用唯一识别码) ad7088db-9673-433a-bc59-f280dec36fc4
int index = originalFilename.lastIndexOf(".");
String extname = originalFilename.substring(index);
//构建新的文件名
String newFileName = UUID.randomUUID().toString()+extname;
log.info("新的文件名:{}",newFileName);
//将文件存储在磁盘目录中
image.transferTo(new File("D:\\测试\\"+newFileName));
return Result.success();
}
}
在SpringBoot中,文件上传,默认单个文件允许最大大小为1M。如果需要上传大文件,可以进
行如下配置:
#配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大大小的限制(一次请求中可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
相关方法
String getOriginalFilename(); //获取原始文件名
void transferTo(File dest); //将接收的文件转存到磁盘文件中
long getSize(); //获取文件的大小,单位: 字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getlnputStream();//获取接收到的文件内容的输入流
阿里云OSS
阿里云对象存储0SS(0bject Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
阿里云OSS-使用步骤
Bucket: 存储空间是户用于存储对象 (Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间
SDK:Software Developmnt Kit 的缩写,软件开发丁具包,包括辅助软件开发的依赖 (iar包),代码示例等,都可以叫做SDK
安装SDK
方式一: 在Maven项目中加入依赖项 (推荐方式)在Maven工程中使用OSS Java SDK,只需在
pom.xml中加入相应依赖可。以3.15.1版本为例,在<dependencies>中加入如下内容:
<!--阿里云OSS依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
代码实现
package com.example.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
@Component
public class AliOSSUtils {
private String endpoint = "https://oss-cnangzhou.aliyuncs-h.com";
private String accessKeyId = "LTAI4GCH1vX6DKqJWxd6nEuW";
private String accessKeySecret = "yBshYweHOpqDuhCArrVHwIiBKpyqSL";
private String bucketName = "web-tlias";
/**
* 实现上传图片到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的路径返回
}
}
Controller类
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public Result upload(MultipartFile image) throws IOException {
log.info("文件上传,文件名:{}",image.getOriginalFilename());
//调用阿里云OSS工具类进行文件上传
String url = aliOSSUtils.upload(image);
log.info("文件上传完成:文件访问的url为:{}",url);
//将图片上传后的url返回 用于浏览器回显操作
return Result.success();
}
}
小结
1.文件上传介绍
2.前端页面三要素 (file表单项、post方式、multipart/form-data)
3.服务端接收文件(MultipartFile)
4.文件存储方式
本地存储 (无法直接访问、磁盘损坏)磁盘空间限制
云存储OSS
修改员工
数据请求处理类
//根据id查询数据
//单条数据用实体类 多条数据用List<实体类类型>集合
@GetMapping("/{id}")
public Result selectById(@PathVariable Integer id){
log.info("根据id查询员工:{}",id);
Emp emp = empService.select(id);
return Result.success(emp);
}
//修改数据 json格式数据用实体类接收 加注解@RequestBody
@PutMapping
public Result updateEmp(@RequestBody Emp emp){
log.info("需要修改的员工信息:{}",emp);
empService.updateEmp(emp);
return Result.success();
}
业务层实现类
//根据id查询员工 回显数据
@Override
public Emp select(Integer id) {
Emp emp = empMapper.selectById(id);
return emp;
}
//修改员工数据
@Override
public void updateEmp(Emp emp) {
//设置修改时间为当前
emp.setUpdateTime(LocalDateTime.now());
empMapper.updateEmp(emp);
}
动态SQL
<!--修改员工数据-->
<update id="updateEmp">
update emp
<set>
--test当中的属性判断应当与实体类中的属性一致
<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">
gender=#{gender},
</if>
<if test="image != null and image != null">
image=#{image},
</if>
<if test="job != null">
job=#{job},
</if>
<if test="entrydate != null">
entrydate=#{entrydate},
</if>
<if test="deptId != null">
dept_id=#{deptId},
</if>
<if test="updateTime != null">
update_time = #{updateTime}
</if>
</set>
where id = #{id}
</update>
小结
-
前端输入更新数据:在前端页面输入的数据以JSON格式发送到后端
-
后端映射为Java实体类:后端通过
@RequestBody
接收这个JSON数据,并将其映射为对应的Emp
实体类对象 -
判断并生成动态SQL:MyBatis在处理更新操作时,会根据实体类中的属性值进行判断(使用
<if>
标签中的test
条件)。如果某个属性为null
或空字符串,则对应的字段不会出现在SQL语句中,也就不会更新数据库中的这个字段;如果不为null
或空字符串,则生成的SQL会更新对应的数据库字段。 -
最终效果:通过这种机制,只有前端传递的非空字段才会更新数据库中的相应字段,而那些为空的字段会保持数据库中原有的值不变
-
单条数据查询:
- 当查询结果是单条记录时,可以直接用一个实体类对象来接收。这种情况下,查询的SQL语句通常使用
select ... where id = ?
或其他能确保返回唯一结果的条件。 - 在MyBatis中,对应的返回类型是
Emp
。
- 当查询结果是单条记录时,可以直接用一个实体类对象来接收。这种情况下,查询的SQL语句通常使用
-
多条数据查询:
- 当查询结果是多条记录时,用
List<实体类类型>
集合来接收。这种情况下,SQL语句可能是select ... where ...
,返回的结果集包含多条记录。 - 在MyBatis中,对应的返回类型是
List<Emp>
。
- 当查询结果是多条记录时,用
@RequestBody
和@PathVariable的区别
-
数据来源不同:
@RequestBody
:用于接收请求体中的JSON数据,并将其映射为Java对象(如Emp
)。@PathVariable
:用于从URL路径中提取单个变量(如ID或其他简单标识符)。
-
数据结构不同:
@RequestBody
:适用于复杂的对象,例如Emp
对象包含多个属性(如name
、age
、gender
等),这些属性通常通过JSON传递。@PathVariable
:适用于简单标识符,如ID或名称,通常是一两个字符串或数字。