Spring Boot中Controller与Mapper层的CRUD注解详解:从入门到实战

在JavaWeb开发中,Spring Boot凭借其“约定优于配置”的理念,大大简化了项目的搭建和开发流程。其中,Controller层负责接收并处理HTTP请求,而Mapper层(数据访问层)则与数据库直接交互,二者共同构成了Web应用的核心骨架。本文将通过代码示例,深入讲解这两个层在实现增删改查(CRUD)功能时的常用注解及最佳实践。

一、Controller层:请求处理的“调度中心”

Controller层是前端请求的入口,通过注解将HTTP请求映射到具体的业务逻辑。以下是核心注解解析:

1. @RestController:定义RESTful控制器
  • 作用:标记类为RESTful风格的控制器,自动将返回值序列化为JSON。(相当于@Controller + @ResponseBody的组合,返回值默认序列化为JSON)
  • 示例
    @RestController
    @RequestMapping("/users")
    public class UserController {
        // 方法定义
    }

  • 注意@RestController = @Controller + @ResponseBody,无需在方法上重复使用@ResponseBody
2. HTTP方法映射注解(请求映射注解)
  • @GetMapping:处理HTTP GET请求,常用于查询操作。
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) { /* 查询用户 */ }
  • @PostMapping:处理HTTP POST请求,常用于新增操作。
    @PostMapping
    public void addUser(@RequestBody User user) { /* 新增用户 */ }
  • @PutMapping:处理HTTP PUT请求,常用于修改操作。
    @PutMapping("/{id}")
    public void updateUser(@PathVariable Long id, @RequestBody User user) { /* 修改用户 */ }
  • @DeleteMapping:处理HTTP DELETE请求,常用于删除操作。
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) { /* 删除用户 */ }
3. 参数绑定注解
  • @PathVariable:从URL路径中提取参数。
     
    @GetMapping("/{id}")
    public User getById(@PathVariable("id") Long userId) { /* ... */ }

  • @RequestParam:从查询参数中获取值,可设置默认值和是否必需。
    @GetMapping("/search")
    public List<User> search(@RequestParam("name") String name) { /* 按名称搜索 */ }

  • @RequestBody:将请求体中的JSON反序列化为Java对象(常用于POST/PUT)。
    @PostMapping
    public void createUser(@RequestBody User user) { /* 新增用户 */ }

二、Mapper层:数据库交互的“执行者”

Mapper层通过MyBatis注解实现SQL与Java方法的绑定,负责与数据库交互,以下是核心注解解析:

1. @Mapper:声明MyBatis接口
  • 作用:标记接口为MyBatis的Mapper,Spring Boot会自动生成实现类。
  • 示例
     
    @Mapper
    public interface UserMapper {
        // SQL操作方法
    }

2. SQL操作注解
  • @Select:定义查询SQL,支持动态条件(如<script>标签)。
     
    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(Long id);

  • @Insert:定义插入SQL,@Options可获取自增主键。
     
    @Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})")
    void insert(User user);

  • @Update:定义更新SQL。
     
    @Update("UPDATE user SET name=#{name} WHERE id=#{id}")
    void updateNameById(Long id, String name);

  • @Delete:定义删除SQL。
     
    @Delete("DELETE FROM user WHERE id = #{id}")
    void deleteById(Long id);

3. 参数与结果映射
  • @Param:为方法参数命名,用于SQL中占位符引用,解决多参数或复杂对象映射问题。
     
    @Select("SELECT * FROM user WHERE username = #{username} AND password = #{password}")
    User findByUsernameAndPassword(
        @Param("username") String username, 
        @Param("password") String password
    );

  • @Results与**@Result**:手动映射查询结果到对象属性(解决字段名与属性名不一致问题)。
     
    @Select("SELECT id, user_name FROM user")
    @Results({
        @Result(property = "username", column = "user_name")
    })
    List<User> findAll();

三、完整示例

Controller层(处理HTTP请求):

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        userService.addUser(user);
    }
}

Mapper层(执行数据库操作):

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Long id);

    @Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(User user);
}

四、总结与最佳实践

  1. Controller层职责

    • 保持“轻薄”,仅处理请求解析与响应封装,业务逻辑交给Service层。
    • 合理使用HTTP状态码(如201表示创建成功,204表示无内容)。
  2. Mapper层优化

    • 复杂SQL建议使用XML配置(如动态SQL<if><foreach>)。
    • 使用@Param明确参数名,避免因参数顺序导致的错误。
  3. 注解选择

    • 简单CRUD推荐注解开发,复杂查询可结合MyBatis动态SQL标签。

通过合理运用注解,开发者可以高效构建出结构清晰、易于维护的Spring Boot应用。欢迎交流指正!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值