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