JPARepository 接口是否覆盖了 Spring Boot 中 DAO 接口的职责?

Is JPARepository interface covers the responsibilities of DAO interface in Spring Boot?

我是 Spring Boot 的新手,我有一个问题。我会这样介绍。

DAO 是一种设计模式,它包含三个组件。这些是

  1. DAO 接口 - 用于声明需要在 DTO 上执行的方法
  2. DAO接口实现-用于从数据源(数据库)中获取数据
  3. DTO(数据传输对象)- 用于保留数据以在各层之间传输。

例如,如果我们得到学生。

Student.java (DTO)

public class Student {
    private String name;
    private int rollNo;

    Student(String name, int rollNo) {
        this.name = name;
        this.rollNo = rollNo;
    }

    //getters and setters
}

StudentDao.java

import java.util.List;

public interface StudentDao {
    public List<Student> getAllStudents();
    public Student getStudent(int rollNo);
    public void updateStudent(Student student);
    public void deleteStudent(Student student);
}

StudentDaoImpl.java

import java.util.ArrayList;
import java.util.List;

public class StudentDaoImpl implements StudentDao {

    //list is working as a database
    List<Student> students;

    public StudentDaoImpl(){
        students = new ArrayList<Student>();
        Student student1 = new Student("Robert",0);
        Student student2 = new Student("John",1);
        students.add(student1);
        students.add(student2);
    }
    @Override
    public void deleteStudent(Student student) {
        students.remove(student.getRollNo());
        System.out.println("Student: Roll No " + student.getRollNo() + ", deleted from database");
    }

    //retrive list of students from the database
    @Override
    public List<Student> getAllStudents() {
        return students;
    }

    @Override
    public Student getStudent(int rollNo) {
        return students.get(rollNo);
    }

    @Override
    public void updateStudent(Student student) {
        students.get(student.getRollNo()).setName(student.getName());
        System.out.println("Student: Roll No " + student.getRollNo() + ", updated in the database");
    }
}

这是关于 DAO 的。在spring 引导中,有JPARepository 界面。该接口已经声明了save(), findById()等方法。我们可以按如下方式使用 JPARepository

@Repository
public interface StudentRepository extends JpaRepository<Student, Integer> {

}

那么之后我们就可以使用这个接口了 Controller class.

SoftwareEngineerController.java

@RestController
@RequestMapping(value = "student")
public class SoftwareEngineerController {
    @Autowired
    StudentRepository studentRepository;

    //to retrieve all software engineers
    @GetMapping("/students")
    public List<Studentr> getAllEngineers(){
        return studentRepository.findAll();
}

感觉JPARepository接口和DAO接口做的是同一个任务。 (声明处理数据需要执行的基本方法)Spring 引导包含 JPARepository 因此不再需要 DAO 在 spring 引导应用程序中。是真的吗?我是 spring 引导的新手,所以如果你能给我一个很好的解释,我将不胜感激。

它们基本上是两种设计模式。 DAO 模式和存储库模式。 所以你不需要同时使用它们。如果您使用的是 Repository 模式,那么大部分繁重的工作都是由 spring data jpa 本身完成的。也可以删除很多样板代码。 在您的示例中,您可以使用存储库模式。另外在我看来,最好使用服务。您可以调用服务 (SoftwareEngineerService),而不是直接从控制器调用存储库,您可以从服务调用存储库。所以业务逻辑将保留在服务层。

关于 Repository 与 DAO 的更多细节

存储库: 它是特定类型对象的存储库 - 它允许您搜索特定类型的对象并存储它们。通常它只会处理一种类型的对象。在你的例子中 Student。你不应该在那里与其他实体打交道。

存储库很可能会将所有数据存储在同一个 table 中,而模式并不需要这样做。事实上,它只处理一种类型的数据,这使得它在逻辑上连接到一个主table(如果用于数据库持久性)。

DAO - 数据访问对象(换句话说 - 用于访问数据的对象) DAO 是为您定位数据的 class(它主要是一个查找器,但通常也用于存储数据)。该模式不限制您存储相同类型的数据,因此您可以轻松拥有一个 locates/stores 相关对象的 DAO。你可以有一个 DAO class 到 return 不同类型的对象,它们相关但不相同。

最后: 请注意,这两种模式实际上意味着相同的(它们存储数据并且抽象化对它的访问并且它们都是表示更接近领域模型并且几乎不包含任何数据库引用),但它们的使用方式可能略有不同,DAO 更 flexible/generic,而 Repository 更具体并且仅限于一种类型。