缘博客
发布日期

Web实战:部门增删改与请求参数

作者
  • 姓名
    社交账号

删除部门

删除部门的条件是部门主键 ID。

接口:

DELETE /depts?id=8

三层调用流程:

Controller
接收id
Service
Mapper
delete from dept where id = ?

接收简单参数

Spring MVC 接收普通请求参数有几种方式。

HttpServletRequest

@DeleteMapping("/depts")
public Result delete(HttpServletRequest request) {

    String idStr = request.getParameter("id");
    Integer id = Integer.parseInt(idStr);

    return Result.success();
}

这种方式需要手动获取参数并转换类型,比较繁琐。

@RequestParam

@DeleteMapping("/depts")
public Result delete(@RequestParam("id") Integer deptId) {
    System.out.println("根据ID删除部门:" + deptId);
    return Result.success();
}

@RequestParamrequired 默认是 true

参数名直接匹配

如果请求参数名称和方法形参名称一致,可以直接接收:

@DeleteMapping("/depts")
public Result delete(Integer id) {
    System.out.println("根据ID删除部门:" + id);
    return Result.success();
}

请求中的 id 与方法形参 Integer id 名称相同,Spring 可以自动完成绑定。


完成删除部门

Controller:

@DeleteMapping("/depts")
public Result delete(Integer id) {
    deptService.delete(id);
    return Result.success();
}

Service:

@Override
public void delete(Integer id) {
    deptMapper.delete(id);
}

Mapper:

@Delete("delete from dept where id = #{id}")
void delete(Integer id);

新增部门

新增部门需要向服务器提交 JSON 数据。

请求:

POST /depts
Content-Type: application/json

请求体:

{
  "name": "教研部"
}

@RequestBody

JSON 请求参数通常使用对象接收。

@PostMapping("/depts")
public Result add(@RequestBody Dept dept) {
    deptService.add(dept);
    return Result.success();
}

JSON 中的键名需要能够与 Java 对象属性对应。

public class Dept {
    private Integer id;
    private String name;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

完成新增部门

Service 中补全创建时间和修改时间:

@Override
public void add(Dept dept) {
    dept.setCreateTime(LocalDateTime.now());
    dept.setUpdateTime(LocalDateTime.now());
    deptMapper.add(dept);
}

Mapper:

@Insert("""
    insert into dept(name, create_time, update_time)
    values(#{name}, #{createTime}, #{updateTime})
    """)
void add(Dept dept);

修改部门:查询回显

编辑数据时,一般先根据 ID 查询当前部门信息,用于页面回显。

接口:

GET /depts/{id}

例如:

GET /depts/1

这里的 1 是 URL 路径的一部分。


@PathVariable

路径参数通过 @PathVariable 获取。

@GetMapping("/depts/{id}")
public Result getInfo(@PathVariable Integer id) {
    Dept dept = deptService.getInfo(id);
    return Result.success(dept);
}

对应关系:

/depts/{id}
/depts/1
id = 1

也可以显式指定名称:

@GetMapping("/depts/{id}")
public Result getInfo(@PathVariable("id") Integer deptId) {
    Dept dept = deptService.getInfo(deptId);
    return Result.success(dept);
}

多个路径参数

一个 URL 可以包含多个路径参数:

/depts/1/0
@GetMapping("/depts/{id}/{sta}")
public Result getInfo(
        @PathVariable Integer id,
        @PathVariable Integer sta
) {
    return Result.success();
}

完成根据ID查询

Service:

@Override
public Dept getInfo(Integer id) {
    return deptMapper.getById(id);
}

Mapper:

@Select("""
    select id, name, create_time, update_time
    from dept
    where id = #{id}
    """)
Dept getById(Integer id);

修改部门数据

页面修改完成后,将部门数据以 JSON 形式提交:

{
  "id": 1,
  "name": "教研部"
}

接口:

PUT /depts

Controller:

@PutMapping("/depts")
public Result update(@RequestBody Dept dept) {
    deptService.update(dept);
    return Result.success();
}

Service:

@Override
public void update(Dept dept) {
    dept.setUpdateTime(LocalDateTime.now());
    deptMapper.update(dept);
}

Mapper:

@Update("""
    update dept
    set name = #{name},
        update_time = #{updateTime}
    where id = #{id}
    """)
void update(Dept dept);

三种常见请求参数

查询参数

请求:

/depts?id=8

接收:

public Result delete(Integer id)

或者:

public Result delete(@RequestParam("id") Integer deptId)

JSON请求体

{
  "id": 1,
  "name": "教研部"
}

接收:

public Result update(@RequestBody Dept dept)

路径参数

请求:

/depts/1

接收:

public Result getInfo(@PathVariable Integer id)

可以总结成:

?id=1       → 普通参数 / @RequestParam
JSON        → @RequestBody
/depts/1    → @PathVariable

@RequestMapping

如果一个 Controller 中所有接口都以 /depts 开头,可以把公共路径提取到类上。

@RestController
@RequestMapping("/depts")
public class DeptController {

    @GetMapping
    public Result list() {
        return Result.success();
    }

    @DeleteMapping
    public Result delete(Integer id) {
        return Result.success();
    }

    @PostMapping
    public Result add(@RequestBody Dept dept) {
        return Result.success();
    }

    @GetMapping("/{id}")
    public Result getInfo(@PathVariable Integer id) {
        return Result.success();
    }

    @PutMapping
    public Result update(@RequestBody Dept dept) {
        return Result.success();
    }
}

完整请求路径等于:

类上的@RequestMapping + 方法上的请求路径

例如:

/depts + /{id} = /depts/{id}

部门CRUD接口汇总

功能请求方式请求路径参数方式
查询全部部门GET/depts
删除部门DELETE/depts?id=1查询参数
新增部门POST/deptsJSON请求体
根据ID查询GET/depts/{id}路径参数
修改部门PUT/deptsJSON请求体