四、@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_bookwhere 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:
-
组件扫描:Spring容器在启动时会扫描配置的包路径,查找带有
@Component
注解的类。 -
Bean注册:找到这些类后,Spring容器会将它们注册为Bean,并管理其生命周期。
@Autowired:
-
依赖解析:Spring容器在初始化Bean时,会检查带有
@Autowired
注解的字段、构造函数或方法。 -
依赖注入:根据类型或名称自动查找并注入依赖的Bean。
-
默认行为:如果找不到匹配的Bean,Spring容器会抛出异常。可以通过
@Autowired(required = false)
允许注入失败。
@Component
public class CategoryService {@Autowiredprivate 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)
:
-
作用:生成一个私有的构建器类,防止外部直接实例化。
-
底层实现:生成的构建器类的构造方法和方法都是私有的。
-
生成的构造方法:
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("操作失败");