Javaweb-day11案例(文件)
新增员工
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.在form表单中,要定义一个表单项,类型为file
2.表单的提交方式必须得是POST方式
下面是讲义里面的内容补充
上传文件的原始form表单,要求表单必须具备以下三点(上传文件页面三要素):
-
表单必须有file域,用于选择要上传的文件
<input type="file" name="image"/>
-
表单提交方式必须为POST
通常上传的文件会比较大,所以需要使用 POST 提交方式
-
表单的编码类型enctype必须要设置为:multipart/form-data
普通默认的编码格式是不适合传输大型的二进制数据的,所以在文件上传时,表单的编码格式必须设置为multipart/form-data
普通的表单项后端怎么接收呢,直接在方法中声明形参
然后接收文件呢,springboot提供了一个api,通过api就可以接收到上传上来的文件
【MultipartFile image】
如果参数名和方法形参名称不一致,可以通过注解@RequestParam进行参数绑定
实现真正的文件上传,需要将临时文件转存到磁盘目录中。
本地存储
需要构造唯一的文件名(不能重复)--UUID(通用唯一标识码-长度固定的字符串)
代码实现:
-
在服务器本地磁盘上创建images目录,用来存储上传的文件(例:E盘创建images目录)
-
使用MultipartFile类提供的API方法,把临时文件转存到本地磁盘目录下
MultipartFile 常见方法:
String getOriginalFilename(); //获取原始文件名
void transferTo(File dest); //将接收的文件转存到磁盘文件中
long getSize(); //获取文件的大小,单位:字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getInputStream(); //获取接收到的文件内容的输入流
如果直接存储在服务器的磁盘目录中,存在以下缺点:
-
不安全:磁盘如果损坏,所有的文件就会丢失
-
容量有限:如果存储大量的图片,磁盘空间有限(磁盘不可能无限制扩容)
-
无法直接访问
为了解决上述问题呢,通常有两种解决方案:
-
自己搭建存储服务器,如:fastDFS 、MinIO
-
使用现成的云服务,如:阿里云,腾讯云,华为云
阿里云OSS
阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商。
云服务指的是通过互联网对外提供的各种各样的服务
阿里云oss-使用步骤
阿里云oss对象存储服务的准备工作以及入门程序没跟,后期做项目的时候再看。
没有账户没办法引用,抄一下讲义里面的
引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.UUID; @Component public class AliOSSUtils { private String endpoint = "https://oss-cn-shanghai.aliyuncs.com"; private String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX"; private String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc"; private String bucketName = "web-framework01"; /** * 实现上传图片到OSS */ public String upload(MultipartFile multipartFile) throws IOException { // 获取上传的文件的输入流 InputStream inputStream = multipartFile.getInputStream(); // 避免文件覆盖 String originalFilename = multipartFile.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的路径返回 } }
修改UploadController代码:
import com.itheima.pojo.Result; import com.itheima.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.IOException; @Slf4j @RestController public class UploadController { @Autowired private AliOSSUtils aliOSSUtils; @PostMapping("/upload") public Result upload(MultipartFile image) throws IOException { //调用阿里云OSS工具类,将上传上来的文件存入阿里云 String url = aliOSSUtils.upload(image); //将图片上传完成后的url返回,用于浏览器回显展示 return Result.success(url); } }
修改员工
查询回显
代码实现
-
EmpMapper
@Mapper public interface EmpMapper { //根据ID查询员工信息 @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time " + "from emp " + "where id = #{id}") public Emp findById(Integer id); //省略... }
-
EmpService
public interface EmpService { /** * 根据ID查询员工 * @param id * @return */ public Emp getById(Integer id); //省略... }
-
EmpServiceImpl
@Slf4j @Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; @Override public Emp getById(Integer id) { return empMapper.findById(id); } //省略... }
-
EmpController
@Slf4j @RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; //根据id查询 @GetMapping("/{id}") public Result getById(@PathVariable Integer id){ Emp emp = empService.getById(id); return Result.success(emp); } //省略... }
修改员工
代码实现
-
EmpMapper
@Mapper public interface EmpMapper { //修改员工信息 public void update(Emp emp); //省略... }
-
EmpMapper.xml
<?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.itheima.mapper.EmpMapper"> <!--更新员工信息--> <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"> gender = #{gender}, </if> <if test="image != null and image != ''"> 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> <!-- 省略... --> </mapper>
-
EmpService
public interface EmpService { /** * 更新员工 * @param emp */ public void update(Emp emp); //省略... }
-
EmpServiceImpl
@Slf4j @Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; @Override public void update(Emp emp) { emp.setUpdateTime(LocalDateTime.now()); //更新修改时间为当前时间 empMapper.update(emp); } //省略... }
-
EmpController
@Slf4j @RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; //修改员工 @PutMapping public Result update(@RequestBody Emp emp){ empService.update(emp); return Result.success(); } //省略... }
配置文件
参数配置化
项目当中的一些参数配置过于分散,不方便集中管理和维护的
思路是通用的,如果在项目开发当中,需要用到一些技术或者是服务,就可以将其在运行时所需要的参数直接配置在配置文件当中,交给配置文件统一的进行管理和维护
这个也没跟
yml配置文件
.yml和.yaml配置形式都是相同的,仅仅是后缀名不同而已
在springboot当中,仅支持properties和yml格式【推荐】的配置
简单的了解过springboot所支持的配置文件,以及不同类型配置文件之间的优缺点之后,接下来我们就来了解下yml配置文件的基本语法:
-
大小写敏感
-
数值前边必须有空格,作为分隔符
-
使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
-
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
-
#
表示注释,从这个字符一直到行尾,都会被解析器忽略
了解完yml格式配置文件的基本语法之后,接下来我们再来看下yml文件中常见的数据格式。在这里我们主要介绍最为常见的两类:
-
定义对象或Map集合
-
定义数组、list或set集合
优先级规则
- YAML 文件优先于 Properties 文件:Spring Boot会先加载
application.yml
文件,然后再加载application.properties
文件。如果有相同的配置项,YAML 文件中的值会覆盖 Properties 文件中的值。 - 环境特定配置文件:如果你有环境特定的配置文件(如
application-dev.yml
和application-dev.properties
),Spring Boot也会按照同样的优先级规则加载这些文件。例如,application-dev.yml
会优先于application-dev.properties
。
@ConfigurationProperties
区分一下@ConfigurationProperties注解以及我们前面所介绍的另外一个@Value注解:
相同点:都是用来注入外部配置的属性的。
不同点:
-
@Value注解只能一个一个的进行外部属性的注入。
-
@ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中。
如果要注入的属性非常的多,并且还想做到复用,就可以定义这么一个bean对象。通过 configuration properties 批量的将外部的属性配置直接注入到 bin 对象的属性当中。在其他的类当中,我要想获取到注入进来的属性,我直接注入 bin 对象,然后调用 get 方法,就可以获取到对应的属性值了
这part稍微有点水but后面做项目会复敲的