Obiekt dostępu do danych (DAO) w Javie

347

Przeglądałem dokument i natrafiłem na termin o nazwie DAO. Dowiedziałem się, że jest to obiekt dostępu do danych. Czy ktoś może mi wyjaśnić, co to właściwie jest?

Wiem, że jest to pewnego rodzaju interfejs do uzyskiwania dostępu do danych z różnych rodzajów źródeł, w trakcie tych moich małych badań wpadłem na koncepcję zwaną źródłem danych lub obiektem źródła danych, i coś mi się popsuło.

Naprawdę chcę wiedzieć, co to DAOjest programowo, jeśli chodzi o to, gdzie jest używane. Jak jest używany? Doceniane są również linki do stron wyjaśniających tę koncepcję od bardzo podstawowych rzeczy.

Vasanth Nag KV
źródło

Odpowiedzi:

447

Obiekt dostępu do danych to w zasadzie obiekt lub interfejs zapewniający dostęp do bazowej bazy danych lub dowolnego innego magazynu trwałości.

Ta definicja z: http://en.wikipedia.org/wiki/Data_access_object

Sprawdź także schemat sekwencji tutaj: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

Być może prosty przykład pomoże ci zrozumieć tę koncepcję:

Załóżmy, że mamy podmiot do reprezentowania pracownika:

public class Employee {

    private int id;
    private String name;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

Podmioty pracownicze zostaną utrwalone w odpowiedniej Employeetabeli w bazie danych. Prosty interfejs DAO do obsługi operacji bazy danych wymagany do manipulowania jednostką pracowniczą będzie wyglądał następująco:

interface EmployeeDAO {

    List<Employee> findAll();
    List<Employee> findById();
    List<Employee> findByName();
    boolean insertEmployee(Employee employee);
    boolean updateEmployee(Employee employee);
    boolean deleteEmployee(Employee employee);

}

Następnie musimy podać konkretną implementację tego interfejsu do obsługi serwera SQL, a drugą do plików płaskich itp.

Rami
źródło
4
cześć rami, naprawdę cieszę się, że próbowałeś mi wyjaśnić bardzo prostym przykładem, czego potrzebowałem. czy mógłbyś wyjaśnić, co miałeś na myśli „konkretną implementacją”, czy miałeś na myśli, że musimy następnie napisać definicję metod, implementując interfejs do klasy?
Vasanth Nag KV
Tak to prawda. Jak klasa o nazwie EmployeeSQLServerDAO, która implementuje interfejs EmployeeDAO, zapewniając pełną implementację swoich metod w sposób odpowiedni dla SQL Server
Rami
4
więc to wszystko DAO? to tylko klasa, którą Piszemy, aby uzyskać dostęp do bazy danych. ilekroć potrzebujemy usługi z bazy danych, tworzymy obiekt DAO, używamy go do operacji na bazie danych, a następnie pozbywamy się DAO, gdy tylko otrzymamy to, czego chcemy od bazy danych. Czy mam rację?? i czy mogę znać zakres tego konceptu DAO?
Vasanth Nag KV
5
Tak, DAO, jak sama nazwa wskazuje, służy do uzyskiwania dostępu do podstawowej pamięci masowej dotyczącej określonej jednostki / klasy. Tak więc w powyższym przykładzie mamy klasę pracownika / jednostkę, którą używamy do przechowywania tabeli DB serwera SQL. Pracownik DAO będzie zawierał metody wstawiania / usuwania / aktualizacji / wybierania pracowników
Rami
2
@ PhilipRego z pewnością możemy mieć wiele implementacji, na przykład implementację serwera MSSQL, a inną, która używa pliku CSV do użycia w testach jednostkowych.
Rami
86

Co to jest OBIEKT DOSTĘPU DO DANYCH (DAO) -

Jest to obiekt / interfejs , który służy do uzyskiwania dostępu do danych z bazy danych przechowywania danych.

DLACZEGO WYKORZYSTUJEMY DAO:

wyodrębnia pobieranie danych z zasobu danych, takiego jak baza danych. Koncepcja polega na „oddzieleniu interfejsu klienta zasobu danych od mechanizmu dostępu do danych”.

Problem z bezpośrednim dostępem do danych polega na tym, że źródło danych może ulec zmianie. Rozważmy na przykład, że aplikacja jest wdrożona w środowisku, które uzyskuje dostęp do bazy danych Oracle. Następnie jest wdrażany w środowisku używającym Microsoft SQL Server. Jeśli Twoja aplikacja korzysta z procedur przechowywanych i kodu specyficznego dla bazy danych (takiego jak generowanie sekwencji numerów), jak sobie z tym poradzisz w aplikacji? Masz dwie opcje:

  • Przepisz aplikację, aby korzystała z SQL Server zamiast Oracle (lub dodaj kod warunkowy w celu obsługi różnic) lub
  • Utwórz warstwę między logiką aplikacji a dostępem do danych


Jest ogólnie nazywany Wzorem DAO , składa się z:

  • Interfejs obiektu dostępu do danych - ten interfejs określa standardowe operacje, które mają być wykonywane na obiektach modelowych.
  • Konkretny obiekt klasy Data Access -Ta klasa implementuje interfejs powyżej. Ta klasa jest odpowiedzialna za pobieranie danych ze źródła danych, którym może być baza danych / xml lub dowolny inny mechanizm przechowywania.
  • Obiekt modelowy lub obiekt wartościowy - ten obiekt jest prostym POJO zawierającym metody get / set do przechowywania danych pobranych przy użyciu klasy DAO.

Sprawdź ten przykład, to wyczyści wszystko jaśniej.

Przykład
Zakładam, że to wszystko musiało do pewnego stopnia wyjaśnić twoje zrozumienie DAO.

VdeX
źródło
13

DAO (Data Access Object) to bardzo używany wzorzec projektowy w aplikacjach korporacyjnych. Zasadniczo jest to moduł służący do uzyskiwania dostępu do danych z każdego źródła (DBMS, XML itd.). Sugeruję przeczytanie kilku przykładów, takich jak ten:

Przykład DAO

Należy pamiętać, że istnieją różne sposoby implementacji oryginalnego Wzorca DAO i istnieje wiele ram, które mogą uprościć pracę. Na przykład frameworki ORM (Object Relational Mapping), takie jak iBatis lub Hibernate, są używane do mapowania wyników zapytań SQL na obiekty java.

Mam nadzieję, że to pomaga, pa!

umanganiello
źródło
8

Wzorzec obiektów dostępu do danych lub wzorzec DAO służy do oddzielenia niskiego poziomu dostępu do danych API lub operacji od usług biznesowych wysokiego poziomu. Poniżej znajdują się uczestnicy wzorca obiektów dostępu do danych.

Interfejs obiektu dostępu do danych - ten interfejs określa standardowe operacje, które mają być wykonywane na obiektach modelowych.

Konkretny obiekt klasy Data Access -Ta klasa implementuje interfejs powyżej. Ta klasa jest odpowiedzialna za pobieranie danych ze źródła danych, którym może być baza danych / xml lub dowolny inny mechanizm przechowywania.

Obiekt modelowy lub obiekt wartościowy - ten obiekt jest prostym POJO zawierającym metody get / set do przechowywania danych pobranych przy użyciu klasy DAO.

Przykładowy kod tutaj ..

Babu
źródło
7

Będę ogólny i nie jest specyficzny dla Javy, ponieważ DAO i ORM są używane we wszystkich językach.

Aby zrozumieć DAO, najpierw musisz zrozumieć ORM (Object Relational Mapping). Oznacza to, że jeśli masz tabelę o nazwie „osoba” z kolumnami „imię” i „wiek”, wówczas utworzyłbyś szablon obiektu dla tej tabeli:

type Person {
name
age
}

Teraz przy pomocy DAO zamiast pisać określone zapytania, aby pobrać wszystkie osoby, dla jakiego typu bazy danych używasz (która może być podatna na błędy), zamiast tego:

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

Nie piszesz samodzielnie abstrakcji DAO, zamiast tego jest ona zazwyczaj częścią projektu open source, w zależności od używanego języka i frameworka.

Przejdźmy teraz do głównego pytania. „... gdziekolwiek jest używany .. ”. Zazwyczaj, jeśli piszesz skomplikowany kod biznesowy i specyficzny dla domeny, twoje życie będzie bardzo trudne bez DAO. Oczywiście nie musisz używać dostarczonych ORM i DAO, zamiast tego możesz pisać własne abstrakty i natywne zapytania. Robiłem to w przeszłości i prawie zawsze żałowałem tego później.

Orhan
źródło
6

Myślę, że najlepszy przykład (wraz z objaśnieniami) można znaleźć na stronie internetowej wyroczni: tutaj . Kolejny dobry korepetytor można znaleźć tutaj .

Ioan
źródło
2
Czy to tylko ja, czy większość samouczków i witryn informacyjnych Java jest bardzo stara? Ten samouczek pochodzi z 2008 roku! Wiele najlepszych wyników wyszukiwania na różne tematy Java jest jeszcze starszych.
bergie3000
2
@ bergie3000: ten wzór nie jest nowy.
Bung Rikimaru
5

Nie myl się z zbyt wieloma wyjaśnieniami. DAO: Z samej nazwy oznacza dostęp do danych za pomocą Object. DAO jest oddzielone od innej logiki biznesowej.

ArunValaven
źródło
4

Obiekt dostępu do danych zarządza połączeniem ze źródłem danych w celu uzyskania i przechowywania danych. Abstraktuje podstawową implementację dostępu do danych dla obiektu biznesowego, aby umożliwić przejrzysty dostęp do źródła danych. Źródłem danych może być dowolna baza danych, taka jak RDBMS, repozytorium XML lub płaski system plików itp.

Rohit Goyal
źródło
4

Wiosna JPA DAO

Na przykład mamy grupę podmiotów.

Dla tego podmiotu tworzymy repozytorium GroupRepository.

public interface GroupRepository extends JpaRepository<Group, Long> {   
}

Następnie musimy utworzyć warstwę usług, z której będziemy korzystać z tego repozytorium.

public interface Service<T, ID> {

    T save(T entity);

    void deleteById(ID id);

    List<T> findAll();

    T getOne(ID id);

    T editEntity(T entity);

    Optional<T> findById(ID id);
}

public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {

    private final R repository;

    protected AbstractService(R repository) {
        this.repository = repository;
    }

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

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

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

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

    @Override
    public Optional<T> findById(ID id) {
        return repository.findById(id);
    }

    @Override
    public T editEntity(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {

    private final GroupRepository groupRepository;

    @Autowired
    protected GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

A w kontrolerze korzystamy z tej usługi.

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

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

    private final GroupServiceImpl groupService;

    @Autowired
    public GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

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

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

    @PostMapping("/group")
    ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Request to create group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
        log.info("Request to update group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
        log.info("Request to delete group: {}", id);
        groupService.deleteById(id);
        return ResponseEntity.ok().build();
    }    
}
Andrij
źródło
To wydaje się wyjaśniać wzorzec repozytorium, a nie wzorzec DAO, zgodnie z żądaniem oryginalnych autorów. Dodatkowo uważam, że twój przykład może wprowadzać w błąd, ponieważ twój interfejs powinien być podobny do kolekcji, więc niektóre twoje operacje nie są odpowiednie.
Jan Haesen
2

DAO działa jak „Persistence Manager” w architekturze 3-poziomowej, a DAO również projektuje wzór, jak można przeczytać w książce „Gang of Four”. Warstwa usługi aplikacji musi tylko wywołać metodę klasy DAO, nie znając ukrytych i wewnętrznych szczegółów metody DAO.

Yasir Shabbir Choudhary
źródło
2

Klauzule Dao są używane do ponownego wykorzystania logiki jdbc, a Dao (Data Access Object) to wzorzec projektowy. dao to prosta klasa Java, która zawiera logikę JDBC.

Warstwa dostępu do danych sprawdziła się w osobnej warstwie logiki biznesowej i warstwie trwałej. Wzorzec projektu DAO całkowicie ukrywa wdrożenie dostępu do danych przed swoimi klientami

Obiekt Java Data Access Object (Java DAO) jest ważnym składnikiem aplikacji biznesowych. Aplikacje biznesowe prawie zawsze potrzebują dostępu do danych z relacyjnych lub obiektowych baz danych, a platforma Java oferuje wiele technik dostępu do tych danych. Najstarszą i najbardziej dojrzałą techniką jest użycie interfejsu API Java Database Connectivity (JDBC), który umożliwia wykonywanie zapytań SQL względem bazy danych, a następnie pobieranie wyników po jednej kolumnie.

Amrit Baghel
źródło
1

Pojo rozważ także klasę Model w Javie, w której możemy utworzyć getter i setter dla konkretnej zmiennej zdefiniowanej prywatnie. Pamiętaj, że wszystkie zmienne są tutaj deklarowane za pomocą prywatnego modyfikatora

Amrit Baghel
źródło