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

Hil*_*ton 2 java dao jpa spring-boot

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

DAO 是一种设计模式,它具有三个组成部分。那些是

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

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

学生.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
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是关于 DAO 的。在Spring Boot中,有JPARepository接口。该接口已声明了诸如 等方法save(), findById()。我们可以使用JPARepository如下。

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

}
Run Code Online (Sandbox Code Playgroud)

然后我们就可以使用这个接口的Controller类了。

软件工程师控制器.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();
}
Run Code Online (Sandbox Code Playgroud)

我感觉JPARepository界面和DAO界面都在做同样的任务。(声明处理数据所需执行的基本方法)Spring Boot包含因此JPARepository不再需要DAO位于Spring Boot应用程序内部。是真的吗?我是 Spring Boot 的新手,所以如果你能给我一个很好的解释,我将非常感激。

小智 6

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

有关 Repository 与 DAO 的更多详细信息

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

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

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

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