Объект доступа к данным (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
— Rami

4
так что это все ДАО есть ?? это просто класс, который МЫ пишем для доступа к базе данных. всякий раз, когда нам нужен сервис из базы данных, мы создаем объект 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). Это означает, что если у вас есть таблица с именем person и столбцами name и age, вы должны создать объект-шаблон для этой таблицы:

type Person {
name
age
}

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

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

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

Теперь к основному вопросу здесь. " .. где это используется .. " Ну, обычно, если вы пишете сложный код для бизнеса и предметной области, ваша жизнь будет очень сложной без DAO. Конечно, вам не нужно использовать ORM и DAO, вместо этого вы можете написать собственную абстракцию и собственные запросы. Я делал это в прошлом и почти всегда сожалел об этом позже.


6

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


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

2
@ bergie3000: эта модель не нова.
— Бонг Рикимару

5

Не путайся со многими объяснениями. DAO: от самого имени это означает доступ к данным с использованием объекта. DAO отделен от другой бизнес-логики.


4

Объект доступа к данным управляет соединением с источником данных для получения и хранения данных. Он абстрагирует базовую реализацию доступа к данным для бизнес-объекта, чтобы обеспечить прозрачный доступ к источнику данных. Источником данных может быть любая база данных, такая как СУБД, репозиторий 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();
    }    
}

Похоже, это объясняет шаблон Repository, а не шаблон DAO в соответствии с первоначальным запросом авторов. Кроме того, я считаю, что ваш пример может вводить в заблуждение, поскольку ваш интерфейс должен следовать подходу, подобному Collection, поэтому некоторые из ваших операций не подходят.
— Ян Хаэсен

2

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


2

Предложения Dao используются для повторного использования логики jdbc, а Dao (объект доступа к данным) является шаблоном проектирования. dao - это простой Java-класс, который содержит логику JDBC.

Уровень доступа к данным хорошо себя зарекомендовал на отдельном уровне бизнес-логики и постоянном уровне. Шаблон проектирования DAO полностью скрывает реализацию доступа к данным от своих клиентов.

Объект доступа к данным Java (Java DAO) является важным компонентом в бизнес-приложениях. Бизнес-приложениям почти всегда требуется доступ к данным из реляционных или объектных баз данных, а платформа Java предлагает множество методов для доступа к этим данным. Самым старым и наиболее зрелым методом является использование API Java Database Connectivity (JDBC), который предоставляет возможность выполнять SQL-запросы к базе данных, а затем извлекать результаты по одному столбцу за раз.


1

Pojo также рассматривают как класс Model в Java, где мы можем создать getter и setter для определенной переменной, определенной private. Помните, что все переменные здесь объявлены с частным модификатором

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.