day11SpringBootWeb案例

什么是RESTful风格的后端接口?

    • REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格。

    • 通过四种请求方式,来操作数据的增删改查

      • GET : 查询

      • POST :新增

      • PUT :修改

      • DELETE :删除

  1. 开发一个功能需要经历哪些流程?

  • 查询页面原型明确需求

  • 阅读接口文档(已提供)

  • 思路分析

  • 接口开发:就是开发后台的业务功能,一个业务功能,我们称为一个接口。

  • 接口测试:功能开发完毕后,先通过Postman进行接口测试,测试通过后,和前端进行联调测试。

  • 前后端联调测试:和前端开发人员开发好的前端工程一起测试。

  1. 开发分页功能前端至少需要传什么参数过来,后台简化分页开发的插件叫什么?怎么用?

    1.前端在请求服务端时,传递的参数:

    当前页码 page

    每页展示记录数 pageSize

    后端需要响应总记录数当前页的数据 两部分数据给前端,所以在 EmpMapper 接口中需要定义两个方法:

    page() :查询当前页的数据的方法

    count() :查询总记录的方法

    2.pageHelper 是Mybatis的一款功能强大、方便的分页插件,支持以任何形式的单标、多表的分页查询

    3.分页实现:(1).pom.xml 引入依赖 (2).EmpMapper(实现接口)(3).EmpServicelmpl(使用分页插件API)

  2. 部门新增逻辑? (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 脚本运行。

  3. 部门删除逻辑?

    (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 脚本运行。

  4. 部门查询逻辑?

    (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 脚本运行。

  5. 员工查询逻辑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

  6. 员工删除怎么实现?

    (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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值