五、案例
1. 开发规范—Restful
REST(Representational State Transfer),表述性状态转换,是一种软件架构风格
注:
- REST是风格,是约定方式,不是规定,可以打破
- 描述模块的功能通常使用复数,表示此类资源,而非单个资源。如:users、emps、books
2. 部门管理的查询、删除、新增以及前后端联调
体会:🌅
- 虽然之前的学习过程中已经跟着视频教程一边敲了代码,但是实际案例会把之前学习的内容连贯起来,自己再写的时候还是不是很熟悉,多多练习
- 注解可以简化代码,要牢记;每个注解的英文也对应着其功能的语义
本质:三层架构+IOC(控制反转)+DI(依赖注入)
新知识:
- @Slf4j/@Xslf4j可以代替创建日志对象,直接使用
- @RequestMapping(“父级”);如果后面的方法上的都要调用这级,可以把他单另出来,注解在类的上方
- @Mapping()可以根据请求类型,细分为@GetMapping()、@PostMapping、@DeleteMapping()等
流程:
Controller接受请求(,以及参数)——>Service处理数据(修改格式或者添加一些字段)——>Mapper与数据库交互(增删改查)——>Serveive——>Controller响应请求
3. 员工管理
分页查询
普通实现以及PageHelper分页插件实现
分页插件引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
@Mapper
public interface EmpMapper {
// // 查询总记录数
// @Select("select count(*) from emp")
// public long count();
//
// // 分页查询获取列表数据
//
// @Select("select * from emp limit #{start}, #{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);
// 使用分页插件实现
@Select("select * from emp")
public List<Emp> list();
}
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1. 获取总记录数
// long count = empMapper.count();
// // 2. 获取分页查询结果列表
Integer start = (page - 1) * pageSize;
List<Emp> empList = empMapper.page(start, pageSize);
// List<Emp> empList = empMapper.page((page - 1) * pageSize, pageSize);
// // 3. 封装PageBean对象
// PageBean pageBean = new PageBean(count, empList);
// return pageBean;
// }
@Override
public PageBean page(Integer page, Integer pageSize) {
//1. 设置分页参数
PageHelper.startPage(page, pageSize);
//2. 执行查询
List<Emp> empList = empMapper.list();
Page<Emp> p = (Page<Emp>) empList;
// 3. 封装PageBean对象
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}
}
@RestController
public class EmpController {
@Autowired
private EmpService empService;
// 分页查询
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize) {
// 调用service分页查询
PageBean pageBean = empService.page(page, pageSize);
return Result.success(pageBean);
}
}
分页条件查询——只要把select放在xml文件中,进行相应的修改就可以
删除员工——数组<foreach>遍历
新增员工——没有特殊的点
注意: 熟悉三层架构的流程就好
4. 文件上传
概念: 文件上传是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程
前端准备工作:
后端准备工作:
Controller中参数添加MultipartFile image(MutipartFile是类型,image是名字,与前端一致,不一致的话使用@RequestParam)
MultiPartfile常用方法
错误:
Whitelabel Error Page
解决:
<dependency>
<groupId>org.apache.portals.pluto.templating</groupId>
<artifactId>thymeleaf-mvc-portlet-api</artifactId>
<version>3.1.1</version>
</dependency>
注意:
在SpringBoot中,文件上传,默认单个文件允许最大大小为1M。如需上传大文件,可以进行如下配置
# 配置单个文件文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
# 配置单个请求最大大小的限制(一次请求中上传的多个文件)
spring.servlet.multipart.max-request-size=100MB
1)本地存储上传文件的实例
@RestController
public class UploadController {
@PostMapping("/upload")
public Result uploda(String username, Integer age, MultipartFile image) throws Exception {
log.info("文件上传:{},{},{}", username, age, image);
// 使用MutiparFile中的方法获取文件的名字
String originalFilename = image.getOriginalFilename();
// 构造唯一的文件名(不能重复)——uuid(通用唯一识别码,长度固定的字符串)
// 首先获取原始文件的扩展名
int index = originalFilename.lastIndexOf(".");
String extname = originalFilename.substring(index);
// 其次生成UUID并与原始文件后缀名进行拼接
String newFileName = UUID.randomUUID().toString() + extname;
// 将文件存储在服务器的磁盘目录中E:\want\JAVA\tempImage
image.transferTo(new File("E:\\want\\JAVA\\tempImage\\" + newFileName));
return Result.success();
}
}
2)阿里云OSS(对象存储服务,Object Storage Service)
概念: 云存储服务
作用: 通过网络随时存储和调用包括文本、图片、音频和视频在内的各种文件
使用第三方服务的通用思路:
- 准备
- 参照官方SDK编写入门程序(Software Development Kit,软件开发工具包),包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。Bucket:存储空间,就是个存储东西的容器
- 集成使用
5. 配置文件
1)properties配置文件
原问题: 参数属于硬编码——如果有需求要修改,需要修改源代码,然后重新编译,不便于维护及管理
解决:
2)yml配置文件(.yml/.yaml)
对比不同的配置文件格式:
- XML:臃肿
- properties:层次结构不清晰
- yml:简洁、数据为中心——推荐
yml基本语法:
- 大小写敏感
- 数值前面必须有空格作为分隔符
- 使用缩进表示层级关系,缩进时不能用Tab,只能用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐
- #表示注释,从这个字符一直到行尾,都会被解析器忽略
属性的自动注入:
@ConfigurationProperties(prefix=“属性的前缀”)
使用前需要引入依赖(可选)
过程:
- 将属性封装成一个实体类,加入注解@Data、@Component、@ConfigurationProperties
- 在工具类中@Autowired自动注入一个对象就可