Интерфейс JPARepository покрывает обязанности интерфейса DAO в Spring Boot? - PullRequest
0 голосов
/ 18 января 2020

Я новичок в Spring Boot и у меня есть вопрос. Я представлю это как это.

DAO - это шаблон проектирования, состоящий из трех компонентов. Это

  1. Интерфейс DAO - используется для объявления методов, которые необходимо выполнить в DTO
  2. Реализация интерфейса DAO - используется для получения данных из источника данных (базы данных)
  3. DTO (Data Transfer Object) - используется для хранения данных для переноса между слоями.

Например, если мы получаем Student.

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. В весенней загрузке есть JPARepository интерфейс. Этот интерфейс был объявлен такими методами, как save(), findById(). и мы можем использовать JPARepository следующим образом.

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

}

Затем, после того, как мы сможем использовать этот интерфейс, класс Controller.

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 boot содержит JPARepository, следовательно, больше не нужно, чтобы DAO находился внутри приложений весенней загрузки. Это правда?. Я новичок в весенней загрузке, так что если вы можете дать мне хорошее объяснение, я буду очень признателен.

1 Ответ

1 голос
/ 18 января 2020

Это в основном две модели проектирования. Шаблон DAO и Шаблон репозитория. Так что вам не нужно использовать их оба. Если вы используете шаблон репозитория, большая часть тяжелой работы выполняется самой пружиной jpa. Также много шаблонного кода могут быть удалены. В вашем примере вы можете использовать шаблон репозитория. Также на мой взгляд, лучше воспользоваться услугой. Вместо прямого вызова хранилища из контроллера вы можете вызвать службу (SoftwareEngineerService), а из службы вы можете вызвать хранилище. Таким образом, бизнес-логика c останется на уровне обслуживания.

Еще некоторые подробности о репозитории против DAO

Репозиторий Это хранилище объектов определенного типа c - оно позволяет вам искать объекты определенного типа c, а также сохранять их. Обычно он будет обрабатывать только один тип объектов. здесь в вашем примере Student. Вы не должны иметь дело с другими лицами там.

Хранилище, скорее всего, будет хранить все данные в одной таблице, тогда как шаблон не требует этого. Тот факт, что он обрабатывает только один тип данных, делает его логически связанным с одной главной таблицей (если используется для сохранения БД).

DAO - доступ к данным object (другими словами - объект, используемый для доступа к данным). DAO - это класс, который определяет местонахождение данных для вас (в основном это поиск, но обычно он также используется для хранения данных). Шаблон не ограничивает вас для хранения данных того же типа, поэтому вы можете легко иметь DAO, который находит / хранит связанные объекты. У вас может быть класс DAO для возврата различных типов объектов, которые связаны, но не совпадают.

Наконец: Обратите внимание, что оба шаблона действительно означают одно и то же (они хранят данные и они абстрагируют доступ к ним, и они оба выражены ближе к модели предметной области и едва ли содержат какую-либо ссылку на БД), но способ их использования может быть немного другим, DAO немного более гибким / обобщенным c, в то время как Репозиторий немного более конкретен c и ограничен только типом.

...