在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);
}
四、总结与最佳实践
-
Controller层职责:
- 保持“轻薄”,仅处理请求解析与响应封装,业务逻辑交给Service层。
- 合理使用HTTP状态码(如201表示创建成功,204表示无内容)。
-
Mapper层优化:
- 复杂SQL建议使用XML配置(如动态SQL
<if>
、<foreach>
)。 - 使用
@Param
明确参数名,避免因参数顺序导致的错误。
- 复杂SQL建议使用XML配置(如动态SQL
-
注解选择:
- 简单CRUD推荐注解开发,复杂查询可结合MyBatis动态SQL标签。
通过合理运用注解,开发者可以高效构建出结构清晰、易于维护的Spring Boot应用。欢迎交流指正!