411 Stimmen

Datenzugriffsobjekt (DAO) in Java

Ich war in einem Dokument unterwegs und stieß auf einen Begriff namens DAO. Ich fand heraus, dass es sich um ein Data Access Object handelt. Kann mir jemand bitte erklären, was das tatsächlich ist?

Ich weiß, dass es eine Art Schnittstelle zum Zugriff auf Daten aus verschiedenen Arten von Quellen ist, und mitten in dieser kleinen Recherche bin ich auf ein Konzept gestoßen, das Datenquelle oder Datenquellenobjekt heißt, was mich noch weiter verwirrte.

Ich möchte wirklich wissen, was ein DAO programmatisch in Bezug darauf, wo es verwendet wird. Wie wird es verwendet? Links zu Seiten, die dieses Konzept von den grundlegenden Dingen erklären, sind ebenfalls willkommen.

8voto

Orhan Punkte 1217

Ich werde allgemein sein und nicht spezifisch für Java, da DAO und ORM in allen Sprachen verwendet werden.

Um DAO zu verstehen, musst du zuerst ORM (Object Relational Mapping) verstehen. Das bedeutet, dass wenn du eine Tabelle namens "person" mit den Spalten "name" und "age" hast, dann würdest du eine Objektschablone für diese Tabelle erstellen:

type Person {
name
age
}

Jetzt mit Hilfe von DAO schreibst du statt spezifischer Abfragen, um alle Personen abzurufen, für welchen Typ von Datenbank du auch immer verwendest (was fehleranfällig sein kann) stattdessen:

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;

Du schreibst die DAO-Abstraktion nicht selbst, sondern sie ist in der Regel Teil eines Open-Source-Projekts, abhängig von der verwendeten Sprache und Framework.

Jetzt zur Hauptfrage hier. "..wo es verwendet wird..". Nun, normalerweise, wenn du komplexe geschäftsspezifische und domänenspezifische Code schreibst, wird dein Leben ohne DAO sehr schwierig sein. Natürlich musst du ORM und bereitgestelltes DAO nicht verwenden, stattdessen kannst du deine eigene Abstraktion und native Abfragen schreiben. Ich habe das in der Vergangenheit gemacht und fast immer später bereut.

5voto

Andriy Punkte 1651

Frühling JPA DAO

Zum Beispiel haben wir eine Entität Gruppe.

Für diese Entität erstellen wir das Repository GroupRepository.

public interface GroupRepository extends JpaRepository {   
}

Dann müssen wir eine Service-Schicht erstellen, mit der wir dieses Repository verwenden werden.

public interface Service {

    T speichern(T entity);

    void löscheNachId(ID id);

    List findAll();

    T getOne(ID id);

    T bearbeiteEntität(T entity);

    Optional findeNachId(ID id);
}

public abstract class AbstractService> implements Service {

    private final R repository;

    geschützt AbstractService(R repository) {
        this.repository = repository;
    }

    @Override
    public T speichern(T entity) {
        return repository.save(entity);
    }

    @Override
    public void löscheNachId(ID id) {
        repository.deleteById(id);
    }

    @Override
    public List findAll() {
        return repository.findAll();
    }

    @Override
    public T getOne(ID id) {
        return repository.getOne(id);
    }

    @Override
    public Optional findeNachId(ID id) {
        return repository.findById(id);
    }

    @Override
    public T bearbeiteEntität(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService {

    private final GroupRepository groupRepository;

    @Autowired
    geschützt GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

Und im Controller verwenden wir diesen Service.

@RestController
@RequestMapping("/api")
class GroupController {

    private final Logger log = LoggerFactory.getLogger(GroupController.class);

    private final GroupServiceImpl groupService;

    @Autowired
    geschützt GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

    @GetMapping("/groups")
    Collection groups() {
        return groupService.findAll();
    }

    @GetMapping("/group/{id}")
    ResponseEntity getGroup(@PathVariable Long id) {
        Optional group = groupService.findeNachId(id);
        return group.map(response -> ResponseEntity.ok().body(response))
                .sonst(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @PostMapping("/group")
    ResponseEntity createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Anfrage zum Erstellen der Gruppe: {}", group);
        Group result = groupService.speichern(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity updateGroup(@Valid @RequestBody Group group) {
        log.info("Anfrage zur Aktualisierung der Gruppe: {}", group);
        Group result = groupService.speichern(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity deleteGroup(@PathVariable Long id) {
        log.info("Anfrage zum Löschen der Gruppe: {}", id);
        groupService.löscheNachId(id);
        return ResponseEntity.ok().build();
    }    
}

4voto

Rohit Goyal Punkte 530

Das Data Access Object verwaltet die Verbindung mit der Datenquelle, um Daten zu erhalten und zu speichern. Es abstrahiert die zugrunde liegende Datenzugriffsimplementierung für das Business Object, um einen transparenten Zugriff auf die Datenquelle zu ermöglichen. Eine Datenquelle könnte jede Datenbank wie ein relationales Datenbankmanagementsystem, ein XML-Repository oder ein Flat-Dateisystem usw. sein.

3voto

Amrit Baghel Punkte 51

Dao-Klassen werden verwendet, um die JDBC-Logik wiederzuverwenden, und Dao (Data Access Object) ist ein Designmuster. dao ist eine einfache Java-Klasse, die JDBC-Logik enthält.

Die Datenzugriffsschicht hat sich gut in separate Geschäftslogikschicht und persistente Schicht bewährt. Das DAO-Designmuster verbirgt die Datenzugriffsimplementierung vollständig vor seinen Clients.

Das Java Data Access Object (Java DAO) ist eine wichtige Komponente in Geschäftsanwendungen. Geschäftsanwendungen benötigen fast immer Zugriff auf Daten aus relationalen oder Objektdatenbanken, und die Java-Plattform bietet viele Techniken zum Zugriff auf diese Daten. Die älteste und ausgereifteste Technik ist die Verwendung des Java Database Connectivity (JDBC) API, das die Möglichkeit bietet, SQL-Abfragen gegen eine Datenbank auszuführen und dann die Ergebnisse abzurufen, eine Spalte nach der anderen.

2voto

DAO ist ein Akt wie ein "Persistence Manager" in der 3-Schichten-Architektur sowie DAO auch ein Designmuster wie Sie im Buch "Gang of Four" nachlesen können. Die Anwendungsschicht Ihres Anwendungsdienstes muss lediglich die Methode der DAO-Klasse aufrufen, ohne die versteckten und internen Details der Methoden von DAO zu kennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X