admin 2026-02-28 10:27:22 礼包中心

引言

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(如动态条件、联表查询)建议用