Data-Access-Object-Muster

Das Data-Access-Object-Muster oder DAO-Muster wird verwendet, um Low-Level-Datenzugriffs-APIs oder -Operationen von High-Level-Geschäftsdiensten zu trennen. Die folgenden Teilnehmer gehören zum Data-Access-Object-Muster.

  • Data-Access-Object-Schnittstelle- Diese Schnittstelle definiert die Standardoperationen, die auf einem Modellobjekt ausgeführt werden sollen.
  • Konkrete Data-Access-Object-Klasse- Diese Klasse implementiert die oben genannte Schnittstelle. Diese Klasse ist dafür verantwortlich, Daten aus einer Datenquelle abzurufen, bei der es sich um eine Datenbank, XML oder andere Speichermechanismen handeln kann.
  • Modellobjekt/Wertobjekt- Dieses Objekt ist ein einfaches POJO, das get-/set-Methoden enthält, um Daten zu speichern, die mithilfe der DAO-Klasse abgerufen wurden.

summary

Absicht

Trennen Sie die Datenzugriffslogik von der Geschäftslogik und kapseln Sie Datenzugriffsvorgänge in einer dedizierten Klasse.

Gelöste Hauptprobleme

  • Behebt das Problem der engen Kopplung zwischen Geschäftslogik und Datenzugriffslogik und verbessert die Wartbarkeit und Wiederverwendbarkeit des Codes.

Anwendungsfall

  • Wenn die Datenzugriffslogik der Anwendung zentral verwaltet werden muss, um die Geschäftslogik zu vereinfachen und Datenoperationen zu erleichtern.

Implementierungsansatz

  • DAO-Schnittstelle definieren: Deklariert Methoden für Datenzugriffsoperationen.
  • DAO-Klasse implementieren: Implementiert die DAO-Schnittstelle und kapselt die gesamte Zugriffslogik auf die Datenquelle (z. B. eine Datenbank).
  • Datentransferobjekt (DTO): Optional, wird verwendet, um aus der Datenquelle abgerufene Daten zu kapseln.

Schlüsselcode

  • DAO-Schnittstelle: Deklariert Methoden für Datenzugriff und -operationen.
  • DAO-Implementierung: Stellt eine konkrete Implementierung der DAO-Schnittstelle bereit, die Datenbankzugriffscode enthält.

Anwendungsbeispiel

  • Benutzerverwaltungsanwendung: Die Benutzer-DAO-Klasse ist für die Interaktion mit der Datenbank verantwortlich und verwaltet CRUD-Operationen für Benutzerdaten.

Vorteile

  1. Trennung von Belangen: Trennt die Datenzugriffslogik von der Geschäftslogik, wodurch die Systemkopplung reduziert wird.
  2. Einfach zu warten: Zentralisiert die Datenzugriffslogik für einfache Wartung und Aktualisierungen.
  3. Erweiterbarkeit: Wenn die Datenquelle geändert oder die Datenzugriffslogik modifiziert wird, ist die Geschäftslogik-Schicht nicht betroffen.

Nachteile

  • Kann die Komplexität erhöhen: Für einfache Anwendungen kann die Einführung des DAO-Musters eine zusätzliche Abstraktionsebene hinzufügen.

Verwendungshinweise

  • Wenn die Anwendung mit mehreren Datenquellen interagieren muss oder die Datenzugriffslogik relativ komplex ist, verwenden Sie das DAO-Muster.

Hinweise

  • DAO-Klassen sollten so einfach wie möglich sein und nur Datenzugriffslogik enthalten, keine Geschäftslogik.

Mehrere Hauptrollen enthalten

  1. DAO-Schnittstelle (DAO Interface):

    • Deklariert Methoden für Datenzugriff und -operationen.
  2. DAO-Implementierung:

    • Implementiert die DAO-Schnittstelle und kapselt die gesamte Zugriffslogik auf die Datenquelle.
  3. Datentransferobjekt (DTO) (optional):

    • Kapselt die aus der Datenquelle abgerufenen Daten für den Datentransfer zwischen der Geschäftslogikschicht und der Datenzugriffsschicht.
  4. Geschäftslogikschicht (Business Logic Layer):

    • Verwenden Sie die DAO-Schnittstelle, um mit der Datenquelle zu interagieren, ohne direkt von der konkreten Implementierung des Datenzugriffs abhängig zu sein.
  5. Datenquelle:

    • Datenbank oder anderer persistenter Speicher, mit dem DAO-Implementierungen interagieren, um auf Daten zuzugreifen und sie zu speichern.

Das Data Access Object Pattern hilft, eine Anwendung sauber und wartbar zu halten, indem es eine klare Datenzugriffsschicht bereitstellt.


Implementierung

Wir werden ein Objekt erstellen, das als Modellobjekt oder Wertobjekt dient,StudentObjekt.StudentDaoIst die Data Access Object-Schnittstelle.StudentDaoImplwelche eine Entitätsklasse ist, die die Data Access Object-Schnittstelle implementiert.DaoPatternDemo, unsere Demo-Klasse verwendetStudentDao, um die Verwendung des Data Access Object Pattern zu demonstrieren.

数据访问对象模式的 UML 图

Schritt 1

Wertobjekt erstellen.

Student.java

public class Student { private String name; private int rollNo; Student(String name, int rollNo){ this.name = name; this.rollNo = rollNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRollNo() { return rollNo; } public void setRollNo(int rollNo) { this.rollNo = rollNo; } }

Schritt 2

Erstellt die Data-Access-Object-Schnittstelle.

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); }

Schritt 3

Erstellt Entitätsklassen, die die obige Schnittstelle implementieren.

StudentDaoImpl.java

import java.util.ArrayList; import java.util.List; public class StudentDaoImpl implements StudentDao { //Listen werden als Datenbank behandelt 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: Matrikelnummer " + student.getRollNo() +", aus der Datenbank gelöscht"); } //Studentenliste aus der Datenbank abrufen @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: Matrikelnummer " + student.getRollNo() +", in der Datenbank aktualisiert"); } }

Schritt 4

VerwendungStudentDaoum die Verwendung des Data-Access-Object-Musters zu demonstrieren.

DaoPatternDemo.java

public class DaoPatternDemo { public static void main(String[] args) { StudentDao studentDao = new StudentDaoImpl(); //Alle Studenten ausgeben for (Student student : studentDao.getAllStudents()) { System.out.println("Student: [Matrikelnummer : " +student.getRollNo()+", Name : "+student.getName()+" ]"); } //Student aktualisieren Student student =studentDao.getAllStudents().get(0); student.setName("Michael"); studentDao.updateStudent(student); //Student abrufen studentDao.getStudent(0); System.out.println("Student: [Matrikelnummer : " +student.getRollNo()+", Name : "+student.getName()+" ]"); } }

Schritt 5

Führen Sie das Programm aus und geben Sie das Ergebnis aus:

Student: [RollNo : 0, Name : Robert ]
Student: [RollNo : 1, Name : John ]
Student: Roll No 0, updated in the database
Student: [RollNo : 0, Name : Michael ]
Weitere Erweiterungen