@Repository注解和@mapper的区别

1. @Repository 注解

  • 通俗解释

    • 你可以把 @Repository 注解想象成是一个专门负责管理数据库操作的 “仓库管理员”。这个管理员主要负责和数据库打交道,就像管理一个大仓库一样,他会进行各种操作,比如把货物(数据)存进仓库(数据库),从仓库里拿出货物,更新货物信息,或者把货物从仓库中删除。
  • 举例

    • 假设你在运营一个在线商城,需要存储和管理商品信息。你可以创建一个 ProductRepository 类,并用 @Repository 注解标记它,如下所示:
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public class ProductRepository {
    public List 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 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 注解的类中使用它们提供的方法和功能,专注于业务逻辑和更复杂的数据操作。
    • @Mapper

      • 当你使用 MyBatis 框架时,会使用 @Mapper 注解。MyBatis 是一个轻量级的数据访问框架,你需要自己编写 SQL 语句,而 @Mapper 注解的接口会将你写的 Java 接口和 SQL 语句联系起来,让你能够通过接口方法操作数据库。

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 注解的类
    @Autowired
    private ProductRepository productRepository;

    // 使用 @Mapper 注解的接口
    @Autowired
    private ProductMapper productMapper;

    public List getProductsFromRepository() {
        return productRepository.findAllProducts();
    }

    public List getProductsFromMapper() {
        return productMapper.findAllProducts();
    }
}

在这个 ProductService 类中,你可以看到 ProductRepository 和 ProductMapper 都被注入进来,并且可以使用它们的方法。但是它们的实现和背后的原理是不同的,ProductRepository 可能使用 JPA 或 Hibernate 等技术,而 ProductMapper 使用 MyBatis 框架将 Java 接口和 SQL 语句进行映射。

你可能感兴趣的:(mybatis,java,spring,boot)