引言
Spring Boot 的注解机制极大简化了开发流程,尤其在 Mapper(数据访问层)、Service(业务逻辑层)、Controller(控制层)三层架构中,注解承担着组件标识、依赖注入、功能增强等核心作用。本文聚焦各层高频注解,结合实例详解其用法与避坑指南。
一、Mapper 层:数据访问的注解魔法Mapper 层负责与数据库交互,核心依赖 MyBatis 注解与 Spring 扫描注解,无需 XML 配置即可实现数据操作。
1. @Mapper注解解释标识接口为 MyBatis 的 Mapper 接口,Spring 会自动扫描并生成代理实现类,无需手动配置 Mapper 映射。
代码示例代码语言:javascript复制// UserMapper.java
import org.apache.ibatis.annotations.Mapper;
import cn.varin.demo.entity.User;
@Mapper // 标识为Mapper接口
public interface UserMapper {
// 根据ID查询用户
User selectById(Long id);
}注意点接口无需实现类,MyBatis 会通过动态代理生成实现;若接口与 XML 映射文件配合使用,需保证接口全类名与 XML 的 namespace 一致。应用场景单个 Mapper 接口的标识,适用于 Mapper 数量较少的项目。
2. @MapperScan注解解释批量扫描指定包下的所有 Mapper 接口,替代单个 @Mapper 注解,简化配置。
代码示例代码语言:javascript复制// 启动类 DemoApplication.java
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("cn.varin.demo.mapper") // 扫描mapper包下所有接口
public class DemoApplication {
public static void main(String\[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}注意点扫描路径需精准(建议到具体包,如cn.varin.demo.mapper),避免扫描冗余类;若项目包含多模块,可通过@MapperScan({"包1","包2"})扫描多个包。应用场景Mapper 接口数量较多的项目,是企业开发的首选配置方式。
3. @Param注解解释为 Mapper 接口方法的参数命名,便于在 SQL 语句(注解式或 XML)中引用参数。
代码示例代码语言:javascript复制// UserMapper.java
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import cn.varin.demo.entity.User;
@Mapper
public interface UserMapper {
// 多参数查询,用@Param命名参数
@Select("SELECT \* FROM user WHERE username = #{name} AND age = #{userAge}")
User selectByUsernameAndAge(@Param("name") String username, @Param("userAge") Integer age);
}注意点当方法参数≥2 个时,必须添加 @Param(MyBatis 3.4.0 + 支持无注解但需用arg0/param1引用,不推荐);参数名与 SQL 中的#{}占位符需完全一致。应用场景多参数的数据查询、新增、修改操作。
4. @Select/@Insert/@Update/@Delete注解解释MyBatis 的 SQL 映射注解,直接在接口方法上编写 SQL 语句,替代 XML 配置。
代码示例代码语言:javascript复制// UserMapper.java
import org.apache.ibatis.annotations.\*;
import cn.varin.demo.entity.User;
@Mapper
public interface UserMapper {
// 查询:根据ID查用户
@Select("SELECT id, username, age FROM user WHERE id = #{id}")
User selectById(Long id);
// 新增:插入用户并返回自增ID
@Insert("INSERT INTO user(username, age) VALUES(#{username}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id") // 启用自增ID,映射到实体的id字段
int insert(User user);
// 修改:更新用户年龄
@Update("UPDATE user SET age = #{age} WHERE id = #{id}")
int updateAge(@Param("id") Long id, @Param("age") Integer age);
// 删除:根据ID删用户
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteById(Long id);
}注意点复杂 SQL(如动态条件、联表查询)建议用