SpringBoot中的注解详解(二)

四、@Param() (mapper包 Dao层)

@Param():

  • 功能: 用于在Mapper接口的方法参数上标记参数名称,以便在SQL语句中引用这些参数。

  • 参数命名:在Mapper接口的方法参数上使用@Param注解,可以为参数指定一个名称。

  • SQL引用:在Mybatis的XML映射文件中,可以通过指定参数名称引用这些参数,使用#{参数名称}语法引用这些参数。

底层原理
  • 参数传递:MyBatis在调用Mapper接口的方法时,会将方法参数封装成一个Map对象。

  • 参数解析:在XML映射文件中,通过#{参数名称}语法,MyBatis会从Map对象中取出对应的参数值。

  • SQL执行:最终,MyBatis将解析后的参数值替换到SQL语句中,执行SQL查询或操作。

public interface BookMapper {

    // 分页查询数据方法
    List<Book> pageQuery(@Param("pageNum") int pageNum,
                         @Param("pageSize") int pageSize,
                         @Param("publisher") String publisher);
    // 分页查询总数据量的方法
    int count(@Param("publisher") String publisher);
}
	<select id="pageQuery" resultMap="bookResult">
        <include refid="baseQuery"/>
        where publisher like concat('%', #{publisher}, '%')
        limit ${(pageNum - 1) * pageSize}, ${pageSize}
    </select>

    <select id="count" resultType="int">
        select count(*)
        from es_book
        where publisher like concat('%', #{publisher}, '%')
    </select>
示例请求:

假设有一个请求URL如下:

http://localhost:8088/pages/index.html?username=admin&password=123456

  • username:用户名为admin

  • password:密码为123456

返回示例:

{
  "id": 1,
  "username": "admin",
  "password": "123456",
  "email": "admin@example.com"
}

结论:使用@Param注解,Mybatis能够正确的将请求参数传递到SQL查询中,并返回相应的用户信息。

五、@Component、@Autowired

@Component:

  • 功能:

    • 将类标记为Spring管理的Bean。使用@Component ,可以实现将类交给IOC容器管理。

    • Spring容器会在启动时自动扫描带有@Component注解的类,并将其注册为Bean。

  • 使用方式:

    • 在类声明上添加@Component注解。

  • 使用场景:

    • 服务类(Service层)、DAO类、工具类等需要被Spring管理的组件。

  • 放置位置:

    • 通常放在需要被Spring管理的类上,例如com.example.service包下的服务类。

@Autowired:

  • 功能:

    • 自动注入依赖的Bean。使用@Autowired ,就可以实现程序运行时IOC容器自动注入需要的依赖对象。

    • Spring容器会根据类型或名称自动查找并注入依赖的Bean。

  • 使用方式:在字段、构造函数或方法上添加@Autowired注解。

  • 使用场景:服务类之间的依赖注入;DAO类与服务类之间的依赖注入。

  • 放置位置:通常放在需要注入依赖的字段、构造函数或方法上

底层原理:

@Component:

  1. 组件扫描:Spring容器在启动时会扫描配置的包路径,查找带有@Component注解的

  2. Bean注册:找到这些类后,Spring容器会将它们注册为Bean,并管理其生命周期。

@Autowired:

  1. 依赖解析:Spring容器在初始化Bean时,会检查带有@Autowired注解的字段、构造函数或方法。

  2. 依赖注入:根据类型或名称自动查找并注入依赖的Bean。

  3. 默认行为:如果找不到匹配的Bean,Spring容器会抛出异常。可以通过@Autowired(required = false)允许注入失败。

@Component
public class CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    public List<Category> listChildren(){
        return categoryMapper.list();
    }
}

通过使用@Component@Autowired注解,Spring容器能够自动管理和注入依赖,简化了开发过程。

Spring框架为了更好的标识bean对象归属于哪一层,又提供了@Component衍生注解:

  • @Controller (标注在控制层类上)

  • @Service (标注在业务层类上)

  • @Repository (标注在数据访问层类上)

    实际Mybatis开发中,我们使用 @Mapper和@MapperScan 更多

六、@Builder(access = AccessLevel.PRIVATE)、@Getter

@Builder:

  • 作用:生成一个构造器类,用于创建不可变对象

  • 底层实现:在编译时,lombok会生成一个Result.ResultBuilder内部静态类,并为每个字段生成相应的setter方法和build方法(用于构建最终的对象)。

  • 生成的代码:

public static class ResultBuilder {
    private Integer code;
    private String message;
    private Object data;

    public ResultBuilder code(Integer code) {
        this.code = code;
        return this;
    }

    public ResultBuilder message(String message) {
        this.message = message;
        return this;
    }

    public ResultBuilder data(Object data) {
        this.data = data;
        return this;
    }

    public Result build() {
        return new Result(code, message, data);
    }
}

@Getter:

  • 作用:为类的每个字段生成 getter 方法。

  • 底层实现:在编译时,Lombok 会为每个字段生成相应的 getter 方法。

  • 示例:

public Integer getCode() {
    return this.code;
}

public String getMessage() {
    return this.message;
}

public Object getData() {
    return this.data;
}

success()方法:

  • 作用:创建一个表示成功的Result对象

  • 底层实现:调用构造器的方法来设置状态码、消息和数据,然后调用build方法构建对象。

public static Result success(String message, Object data) {
    return Result.builder()
            .code(SUCCESS)
            .message(message)
            .data(data)
            .build();
}

failure()方法:

  • 作用:创建一个表示失败的Result对象

  • 底层实现:调用构建器的方法来设置状态码的消息,然后调用build方法来构建对象

  • 示例:

public static Result failure(String message) {
    return Result.builder()
            .code(FAILURE)
            .message(message)
            .build();
}

构造方法:

由于使用了@Builder注解,lombok会生成一个私有的构造方法,该构造方法接受所有的字段作为参数。

@Builder(access = AccessLevel.PRIVATE)

  1. 作用:生成一个私有的构建器类,防止外部直接实例化。

  2. 底层实现:生成的构建器类的构造方法和方法都是私有的。

  • 生成的构造方法:

private Result(Integer code, String message, Object data) {
    this.code = code;
    this.message = message;
    this.data = data;
}
  • 使用构造器模式:构造器模式是一种设计模式,用于创建复杂的对象。通过构造器,可以逐步设置对象的各个属性,最后调用build方法生成对象 (构造器模式可参考:)
Result result = Result.builder()
        .code(1)
        .message("操作成功")
        .data(someData)
        .build();
  • 使用静态工厂方法:静态工厂方法是一种创建对象的方式,通过类的静态方法来创建对象。这种方法可以提高代码的可读性和可维护性。
Result successResult = Result.success("操作成功", someData);
Result failureResult = Result.failure("操作失败");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠寻寻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值