什么是RESTful风格的后端接口?
-
-
REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格。
-
通过四种请求方式,来操作数据的增删改查
-
GET : 查询
-
POST :新增
-
PUT :修改
-
DELETE :删除
-
-
-
开发一个功能需要经历哪些流程?
-
查询页面原型明确需求
-
阅读接口文档(已提供)
-
思路分析
-
接口开发:就是开发后台的业务功能,一个业务功能,我们称为一个接口。
-
接口测试:功能开发完毕后,先通过Postman进行接口测试,测试通过后,和前端进行联调测试。
-
前后端联调测试:和前端开发人员开发好的前端工程一起测试。
-
开发分页功能前端至少需要传什么参数过来,后台简化分页开发的插件叫什么?怎么用?
1.前端在请求服务端时,传递的参数:
当前页码 page
每页展示记录数 pageSize
后端需要响应
总记录数
和当前页的数据
两部分数据给前端,所以在EmpMapper
接口中需要定义两个方法:page() :查询当前页的数据的方法
count() :查询总记录的方法
2.pageHelper 是Mybatis的一款功能强大、方便的分页插件,支持以任何形式的单标、多表的分页查询
3.分页实现:(1).pom.xml 引入依赖 (2).EmpMapper(实现接口)(3).EmpServicelmpl(使用分页插件API)
-
部门新增逻辑? (1). 前端发送新增部门数据 (2).后台进行开发
请求路径:/depts
请求方式:POST
接口描述:该接口用于添加部门数据
1.使用DeptMapper接口
//新增部门 @Insert("insert into dept(name, create_time, update_time) values (#{name},#{createTime},#{updateTime})") void save(Dept dept);
2调用DeptService和DeptServiccelmpl
DeptService:
/** * 新增部门 * @param dept */ void save(Dept dept);
DeptServiceImpl:
@Override public void save(Dept dept) { dept.setCreateTime(LocalDateTime.now()); dept.setUpdateTime(LocalDateTime.now()); deptMapper.save(dept); }
3.调用DeptController
@PostMapping public Result save(@RequestBody Dept dept){ deptService.save(dept); return Result.success(); }
(3). 测试
功能开发完成后,我们就可以启动项目,然后打开postman。发起POST请求,访问 :http://localhost:8080/depts,然后在请求体中传递json格式的参数。
(4).前后端联调
在vscode中导入资料中提供好的前端工程,然后点击 npm 脚本运行。
-
部门删除逻辑?
(1). 前端发送新增部门数据 (2).后台进行开发
请求路径:/depts
请求方式:DELETE
接口描述:该接口用于添加部门数据
然后来开发对应的功能:
1.使用DeptMapper接口
//删除部门 @Delete("delete from dept where id = #{id}") void delete(Integer id);
2调用DeptService和DeptServiccelmpl
DeptService
/** * 删除部门 * @param id */ void delete(Integer id);
DeptServiccelmpl
@Override public void delete(Integer id) { //1. 删除部门 deptMapper.delete(id); }
3.调用DeptController
@DeleteMapping("/{id}") public Result delete(@PathVariable Integer id) { deptService.delete(id); return Result.success(); }
(3). 测试
功能开发完成后,我们就可以启动项目,然后打开postman。发起DELETE请求,访问 :http://localhost:8080/depts/5
(4).前后端联调
在vscode中导入资料中提供好的前端工程,然后点击 npm 脚本运行。
-
部门查询逻辑?
(1). 前端发送新增部门数据
(2).开发
请求路径:/depts
请求方式:GET
接口描述:该接口用于部门列表数据查询
然后来开发对应的功能:
1). DeptMapper
@Mapper public interface DeptMapper { //查询全部部门数据 @Select("select * from dept") List<Dept> list(); }
2). DeptService / DeptServiceImpl
DeptService
public interface DeptService { /** * 查询所有的部门数据 * @return */ List<Dept> list(); }
DeptServiceImpl
@Slf4j @Service public class DeptServiceImpl implements DeptService { @Autowired private DeptMapper deptMapper; @Override public List<Dept> list() { List<Dept> deptList = deptMapper.list(); return deptList; } }
3). DeptController
@RestController public class DeptController { @Autowired private DeptService deptService; @GetMapping("/depts") public Result list(){ List<Dept> deptList = deptService.list(); return Result.success(deptList); } }
(3). 测试
功能开发完成后,我们就可以启动项目,然后打开postman。发起GET请求,访问 :http://localhost:8080/depts
(4).前后端联调
在vscode中导入资料中提供好的前端工程,然后点击 npm 脚本运行。
-
员工查询逻辑2). DeptService / DeptServiceImpl?怎么实现分页查询的?
(1).分页查询
分页查询也是从数据库进行查询的,所以我们要分页对应的SQL语句应该怎么写。分页查询使用
LIMIT
关键字,格式为:LIMIT 开始索引 每页显示的条数
。以后前端页面在发送请求携带参数时,它并不明确开始索引是什么,但是它知道查询第几页。
所以
开始索引
需要在后端进行计算,计算的公式是 :开始索引 = (当前页码 - 1)* 每页显示条数(2)参数传递
当前页码 page
每页展示记录数 pageSize
后端需要响应什么数据给前端:
上面的页面原型是分页查询页面展示的效果,从上面我们可以看出需要响应以下两份数据
当前页需要展示的数据。我们在后端一般会存储到 List 集合中
总共记录数。在上图页面中需要展示总的记录数,所以这部分数据也需要。总的页码 elementUI 的分页组 件会自动计算,我们不需要关心。
(3)PageBean定义
@Data @NoArgsConstructor @AllArgsConstructor public class PageBean { private Long total; //总记录数 private List rows; //当前页数据列表 }
(4) 开发
后端需要响应
总记录数
和当前页的数据
两部分数据给前端,所以在EmpMapper
接口中需要定义两个方法:page() :查询当前页的数据的方法
count() :查询总记录的方法
整体流程如下:
1). EmpMapper
//获取总记录数 @Select("select count(*) from emp") public Long count(); //获取当前页的结果列表 @Select("select * from emp limit #{start}, #{pageSize}") public List<Emp> page(Integer start, Integer pageSize);
2). EmpService / EmpServiceImpl
EmpService
public interface EmpService { /** * 条件分页查询 * @param page 页码 * @param pageSize 每页展示记录数 * @return */ PageBean page(Integer page, Integer pageSize); }
EmpServiceImpl
@Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; @Override public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) { Long count = empMapper.count(); //获取总记录数 Integer start = (page - 1) * pageSize; //计算起始索引 , 公式: (页码-1)*页大小 List<Emp> empList = empMapper.page(start, pageSize); PageBean pageBean = new PageBean(count , empList); //封装PageBean return pageBean; } }
3). EmpController
@RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; //条件分页查询 @GetMapping public Result page(@RequestParam(defaultValue = "1") Integer page , @RequestParam(defaultValue = "10") Integer pageSize){ PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end); return Result.success(pageBean); } }
(5)测试
功能开发完成后,我们就可以启动项目,然后打开postman。发起GET请求,访问 :http://localhost:8080/emps?page=1&pageSize=5
(6)分页插件
PageHelper 是Mybatis的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询
流程如下:
1.分页实现
1). pom.xml 引入依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.2</version> </dependency>
2). EmpMapper
@Select("select * from emp") public List<Emp> list();
3). EmpServiceImpl
@Override public PageBean page(Integer page, Integer pageSize) { PageHelper.startPage(page, pageSize); // 设置分页参数 List<Emp> empList = empMapper.list(name,gender,begin,end); // 执行分页查询 Page<Emp> p = (Page<Emp>) empList; // 获取分页结果 PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); //封装PageBean return pageBean; }
(7)测试
功能开发完成后,我们就可以启动项目,然后打开postman。发起GET请求,访问 :http://localhost:8080/emps?page=1&pageSize=5
-
员工删除怎么实现?
(1)需求
当我们勾选列表前面的复选框,然后点击 "批量删除" 按钮,就可以将这一批次的员工信息删除掉了。
(2)开发
请求路径:/emps/{ids}
请求方式:DELETE
接口描述:该接口用于批量删除员工的数据信息
请求样例:/depts/1,2,3
对应的流程为:
1). EmpMapper
EmpMapper接口
//批量删除 void delete(List<Integer> ids);
EmpMapper.xml
<select id="delete"> delete from emp where id in <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> </select>
2). EmpService / EmpServiceImpl
EmpService
/** * 批量删除操作 * @param ids id集合 */ void delete(List<Integer> ids);
EmpServiceImpl
@Override public void delete(List<Integer> ids) { empMapper.delete(ids); }
3). EmpController
通过接口文档我们可以看出,这一组id是通过路径参数传递过来的,接收路径参数,需要在集合前面加上 @PathVariable
//批量删除 @DeleteMapping("/{ids}") public Result delete(@PathVariable List<Integer> ids){ empService.delete(ids); return Result.success(); }
(3) 测试
功能开发完成后,我们就可以启动项目,然后打开postman。发起DELETE请求,访问 :http://localhost:8080/emps/15,16,17