网站代理制作长春关键词优化平台
1. @Repository 注解
-
通俗解释:
- 你可以把
@Repository
注解想象成是一个专门负责管理数据库操作的 “仓库管理员”。这个管理员主要负责和数据库打交道,就像管理一个大仓库一样,他会进行各种操作,比如把货物(数据)存进仓库(数据库),从仓库里拿出货物,更新货物信息,或者把货物从仓库中删除。
- 你可以把
-
举例:
- 假设你在运营一个在线商城,需要存储和管理商品信息。你可以创建一个
ProductRepository
类,并用@Repository
注解标记它,如下所示:
- 假设你在运营一个在线商城,需要存储和管理商品信息。你可以创建一个
import org.springframework.stereotype.Repository;
import java.util.List;@Repository
public class ProductRepository {public List<Product> findAllProducts() {// 这里可以实现从数据库中查找所有商品的逻辑return null;}public void saveProduct(Product product) {// 这里可以实现将商品保存到数据库的逻辑}
}
- 在这个例子中,
ProductRepository
类就像一个仓库管理员,它的findAllProducts()
方法可以帮你找出仓库里的所有商品,而saveProduct(Product product)
方法可以把新的商品放到仓库里。这个类主要负责数据的存储和检索操作,而且它是由 Spring 容器管理的,就像仓库管理员是由公司管理一样。
2. @Mapper 注解
-
通俗解释:
@Mapper
注解通常用于 MyBatis 框架中,你可以把它看作是一个 “翻译官”。它的任务是将 Java 代码和 SQL 语句之间进行翻译,让 Java 代码能够和数据库进行通信。它会将你在 Java 接口中定义的方法 “翻译” 成相应的 SQL 语句,以便与数据库进行交互。
-
举例:
- 还是以在线商城为例,你有一个
ProductMapper
接口,你可以这样写:
- 还是以在线商城为例,你有一个
import org.apache.ibatis.annotations.Mapper;
import java.util.List;@Mapper
public interface ProductMapper {List<Product> findAllProducts();void saveProduct(Product product);
}
- 在这里,
ProductMapper
接口就像是一份翻译文件,你在接口中定义了findAllProducts()
和saveProduct(Product product)
等方法,MyBatis 框架会根据这些方法生成相应的 SQL 语句。例如,当你调用findAllProducts()
方法时,MyBatis 会将其翻译成一条 SQL 语句,如SELECT * FROM products
,然后执行这条 SQL 语句,从数据库中找出所有的商品。
3. 区别总结
-
职责范围:
-
@Repository:
- 它的职责更广泛,主要是从概念上表示一个数据存储库,通常用于传统的 Spring 数据访问对象(DAO),可能包含更复杂的数据操作逻辑,如处理事务、异常处理等。它更像是一个管理仓库的人员,除了基本的数据存储和检索,还可能处理一些其他的事情,比如检查仓库的状态、协调货物的运输等。
-
@Mapper:
- 主要侧重于接口和 SQL 语句的映射,它就像一个翻译官,只是把 Java 代码和 SQL 语句进行转换,让 Java 代码可以直接操作数据库。它的主要任务就是将接口方法翻译成 SQL 语句,以便对数据库进行操作。
-
-
使用场景:
-
@Repository:
- 当你使用 Spring 的
JPA
或Hibernate
等数据访问技术时,通常会使用@Repository
注解。因为这些技术会帮你处理很多数据操作的细节,你可以在@Repository
注解的类中使用它们提供的方法和功能,专注于业务逻辑和更复杂的数据操作。
- 当你使用 Spring 的
-
@Mapper:
- 当你使用 MyBatis 框架时,会使用
@Mapper
注解。MyBatis 是一个轻量级的数据访问框架,你需要自己编写 SQL 语句,而@Mapper
注解的接口会将你写的 Java 接口和 SQL 语句联系起来,让你能够通过接口方法操作数据库。
- 当你使用 MyBatis 框架时,会使用
-
4. 代码示例
- 假设你在一个 Spring Boot 应用中同时使用
@Repository
和@Mapper
:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class ProductService {// 使用 @Repository 注解的类@Autowiredprivate ProductRepository productRepository;// 使用 @Mapper 注解的接口@Autowiredprivate ProductMapper productMapper;public List<Product> getProductsFromRepository() {return productRepository.findAllProducts();}public List<Product> getProductsFromMapper() {return productMapper.findAllProducts();}
}
在这个 ProductService
类中,你可以看到 ProductRepository
和 ProductMapper
都被注入进来,并且可以使用它们的方法。但是它们的实现和背后的原理是不同的,ProductRepository
可能使用 JPA
或 Hibernate
等技术,而 ProductMapper
使用 MyBatis 框架将 Java 接口和 SQL 语句进行映射。