Об'єкт доступу до даних (DAO) на Java


347

Я переглядав документ і натрапив на термін під назвою DAO. Я з’ясував, що це об’єкт доступу до даних. Може хтось, будь ласка, пояснить мені, що це насправді?

Я знаю, що це якийсь інтерфейс для доступу до даних з різних типів джерел, в середині цього невеликого дослідження шахти я натрапив на концепцію, що називається джерелом даних або об'єктом джерела даних, і все набридло в моїй свідомості.

Я дуже хочу знати, що DAOтаке програмно з точки зору місця його використання. Як він використовується? Оцінюються також будь-які посилання на сторінки, що пояснюють це поняття з самого елементарного матеріалу.

Відповіді:


447

Об'єкт доступу до даних - це в основному об'єкт або інтерфейс, що забезпечує доступ до базової бази даних або будь-якого іншого зберігання.

Це визначення: http://en.wikipedia.org/wiki/Data_access_object

Перевірте також діаграму послідовностей тут: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

Можливо, простий приклад може допомогти вам зрозуміти концепцію:

Скажімо, у нас є організація, яка представляє працівника:

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

}

Суб'єкти працівників будуть зберігатися у відповідній Employeeтаблиці бази даних. Простий інтерфейс DAO для управління операцією з базою даних, необхідною для маніпулювання сутністю особи, буде таким:

interface EmployeeDAO {

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

}

Далі ми повинні надати конкретну реалізацію для цього інтерфейсу для роботи з SQL-сервером, а інший - для обробки плоских файлів тощо.


4
привіт, рамі, я дуже рада, що ти спробував пояснити мені дуже простий експлей, що саме мені потрібно. Ви можете, будь ласка, пояснити, що Ви мали на увазі під "конкретною реалізацією", Ви мали на увазі, що ми повинні наступне написати визначення методів, реалізуючи інтерфейс до класу?
Vasanth Nag KV

Так, правильно. Як клас під назвою EmployeeSQLServerDAO, який реалізує інтерфейс EmployeeDAO, забезпечуючи повну реалізацію своїх методів таким чином, що стосується SQL Server
Рамі

4
так що це все DAO є ?? це просто клас, який ми пишемо для доступу до бази даних. кожного разу, коли нам потрібна послуга з бази даних, ми створюємо об'єкт DAO, використовуючи його для операцій з базою даних, а потім позбавляємось від DAO, як тільки ми отримуємо те, що ми хочемо від бази даних. Маю рацію?? і чи можу я знати сферу дії рамі концепції DAO ??
Vasanth Nag KV

5
Так, DAO, як випливає з назви, призначений для доступу / оновлення базового сховища щодо певної сутності / класу. Отже, у наведеному вище прикладі у нас є клас / сутність співробітника, для використання якого ми використовуємо таблицю БД SQL-сервера для збереження. Співробітник DAO міститиме методи вставки / видалення / оновлення / вибору співробітників
Рамі

2
@PhilipRego ми, безумовно, можемо мати декілька реалізацій, наприклад, реалізацію сервера MSSQL та іншу, яка використовує файл CSV для використання з одиничними тестами.
Рамі

86

Що таке об'єкт доступу до даних (DAO) -

Це об'єкт / інтерфейс , який використовується для доступу до даних із бази даних зберігання даних.

Чому ми використовуємо DAO:

він резюмує отримання даних з такого ресурсу даних, як база даних. Концепція полягає в тому, щоб "відокремити клієнтський інтерфейс ресурсу даних від його механізму доступу до даних".

Проблема з прямим доступом до даних полягає в тому, що джерело даних може змінюватися. Розглянемо, наприклад, що ваша програма розміщена в середовищі, яке має доступ до бази даних Oracle. Потім він згодом розгортається у середовищі, що використовує Microsoft SQL Server. Якщо ваша програма використовує збережені процедури та специфічний код бази даних (наприклад, генерування послідовності чисел), як ви обробляєте це у вашій програмі? У вас є два варіанти:

  • Перезапишіть свою програму для використання SQL Server замість Oracle (або додайте умовний код для вирішення відмінностей), або
  • Створіть шар між логікою програми та доступом до даних


Його в усіх називають DAO Pattern , Він складається з наступного:

  • Об'єктний інтерфейс доступу до даних - Цей інтерфейс визначає стандартні операції, що виконуються на модельних об'єктах.
  • Конкретний клас доступу до даних - Цей клас реалізує вище інтерфейс. Цей клас відповідає за отримання даних з джерела даних, який може бути базами даних / xml або будь-яким іншим механізмом зберігання.
  • Модельний об'єкт або об'єкт значення - Цей об'єкт є простим POJO, що містить методи get / set для зберігання даних, отриманих за допомогою класу DAO.

Перевірте цей приклад. Це дозволить зрозуміти речі чіткіше.

Приклад
Я припускаю, що ці речі повинні певним чином очистити ваше розуміння DAO.


13

DAO (Data Access Object) - це дуже використовувана модель дизайну в корпоративних додатках. В основному це модуль, який використовується для доступу до даних з усіх джерел (СУБД, XML тощо). Я пропоную вам прочитати кілька прикладів, таких як цей:

Приклад DAO

Зверніть увагу, що існують різні способи реалізації оригінального шаблону DAO , і існує багато рамок, які можуть спростити вашу роботу. Наприклад, структури ORM (Object Relational Mapping), такі як iBatis або Hibernate, використовуються для відображення результатів SQL-запитів на об'єкти Java.

Сподіваюся, це допоможе, до побачення!


8

Шаблон об'єкта доступу до даних або шаблон DAO використовується для відділення API доступу до даних низького рівня або операцій від бізнес-служб високого рівня. Далі йдуть учасники в Об'єктний шаблон доступу до даних.

Об'єктний інтерфейс доступу до даних - Цей інтерфейс визначає стандартні операції, що виконуються на модельних об'єктах.

Конкретний клас доступу до даних - Цей клас реалізує вище інтерфейс. Цей клас відповідає за отримання даних з джерела даних, який може бути базами даних / xml або будь-яким іншим механізмом зберігання.

Модельний об'єкт або об'єкт значення - Цей об'єкт є простим POJO, що містить методи get / set для зберігання даних, отриманих за допомогою класу DAO.

Зразок коду тут ..


7

Я буду загальним і не специфічним для Java, оскільки DAO та ORM використовуються на всіх мовах.

Щоб зрозуміти DAO, спочатку потрібно зрозуміти ORM (Object Relational Mapping). Це означає, що якщо у вас є таблиця під назвою "людина" зі стовпцями "ім'я" та "вік", ви створили б об'єкт-шаблон для цієї таблиці:

type Person {
name
age
}

Тепер за допомогою DAO замість того, щоб писати якісь конкретні запити, вибирати всіх людей, для якого типу типу db ви користуєтесь (який може бути схильним до помилок) замість цього:

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

Ви не пишете абстракцію DAO самостійно, натомість це, як правило, частина якогось відкритого проекту, залежно від того, якою мовою та рамкою ви користуєтесь.

Тепер до головного питання тут. ".. де воно використовується .. ". Ну звичайно, якщо ви пишете складний код для бізнесу та домену, ваше життя буде непростим без DAO. Звичайно, вам не потрібно використовувати ORM та DAO, натомість ви можете написати власні абстракції та власні запити. Я робив це раніше і майже завжди шкодував про це пізніше.


6

Я думаю, що найкращий приклад (разом з поясненнями) ви можете знайти на веб-сайті oracle: тут . Ще один хороший навчальний посібник можна знайти тут .


2
Це тільки я або більшість навчальних посібників та інформаційних сайтів на Java дуже старі? Цей підручник з 2008 року! Багато найпопулярніших результатів пошуку за різними темами Java ще старші.
bergie3000

2
@ bergie3000: ця модель не нова.
Bằng Rikimaru

5

Не плутайте занадто багато пояснень. DAO: Від самої назви означає доступ до даних за допомогою Object. DAO відокремлений від інших Business Logic.


4

Об'єкт доступу до даних керує з'єднанням із джерелом даних для отримання та зберігання даних. Він абстрагує базову реалізацію доступу до даних для бізнес-об'єкта, щоб забезпечити прозорий доступ до джерела даних. Джерелом даних може бути будь-яка база даних, наприклад RDBMS, сховище XML або плоска файлова система тощо.


4

Весна JPA DAO

Наприклад, у нас є деякі юридичні групи.

Для цього об'єкта ми створюємо репозиторій GroupRepository.

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

Тоді нам потрібно створити сервісний рівень, з яким ми будемо використовувати це сховище.

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

І в контролері ми використовуємо цю послугу.

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

Це, мабуть, пояснює шаблон репозиторію, а не шаблон DAO відповідно до оригінального запиту авторів. Крім того, я вважаю, що ваш приклад може ввести в оману, оскільки ваш інтерфейс повинен дотримуватися підходу, подібного до колекції, тому деякі ваші операції не підходять.
Ян Хаесен

2

DAO - така дія, як "Менеджер наполегливості" в архітектурі трьох рівнів, а також DAO також модель дизайну, оскільки ви можете ознайомитися з книгою "Банда з чотирьох". Вашому службовому шару додатків просто потрібно викликати метод класу DAO, не знаючи прихованих та внутрішніх деталей методу DAO.


2

Даові фрази використовуються для повторного використання логіки jdbc, а Dao (Об'єкт доступу до даних) - це модель дизайну. Дао - простий клас java, який містить логіку JDBC.

Шар доступу до даних добре зарекомендував себе в окремому шарі ділової логіки та стійкому шарі. Шаблон дизайну DAO повністю приховує реалізацію доступу до даних від своїх клієнтів

Об'єкт доступу до даних Java (Java DAO) є важливим компонентом у бізнес-програмах. Бізнес-програми майже завжди потребують доступу до даних із реляційних або об’єктних баз даних, а платформа Java пропонує безліч методів доступу до цих даних. Найдавніша і найзріліша методика полягає у використанні API з'єднання баз даних Java (JDBC), який надає можливість виконувати запити SQL на базі даних, а потім отримувати результати, по одному стовпчику.


1

Також Pojo розглядається як клас моделі на Java, де ми можемо створити геттер і сеттер для певної змінної, визначеної приватно. Пам'ятайте, що всі змінні тут декларуються приватним модифікатором

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.