Топ-100Шаблон DAO: работа с БД через объект - CodOrbits
LogoCodOrbits

Раздел: Шаблоны проектирования

Раздел о популярных паттернах проектирования в Java: Singleton, Factory, MVC и других архитектурных решениях.

Все разделы
Иконка Шаблоны проектирования

Шаблон DAO: работа с БД через объект

Last updated: 10 мая 2025 г.

Data Access Object. Нужен чтобы отделить низкоуровневый доступ к данным от высокоуровневых сервисов.

Низкоуровневый доступ – это, например, взаимодействие с базой с помощью средств JDBC. Мы можем сокрыть прямое использование средств JDBC (то есть, например, подключение к базе, извлечение данных из базы с помощью каких-то сложных цепочек JDBC методов, или сокрыть некоторые SQL запросы) в DAO объекте и уже в высокоуровневых сервисах (в main, например) взаимодействовать с данными базы через методы DAO объекта.

То есть всё низкоуровневое взаимодействие с БД с помощью JDBC происходит в методах DAO объекта, а высокоуровневые сервисы просто используют эти методы.

Для примера в программе ниже лучше пусть ресурсом будет не база, а List коллекция, так будет проще.

1import java.util.ArrayList;
2import java.util.Arrays;
3import java.util.List;
4
5//Создадим простейший класс машины.
6//Экземпляры класса Car будут храниться
7//в List.
8class Car {
9    private String brand;
10    private int speed;
11
12    Car(String brand, int speed){
13        this.brand = brand;
14        this.speed = speed;
15    }
16
17    public String getBrand() {
18        return brand;
19    }
20
21    public void setBrand(String brand) {
22        this.brand = brand;
23    }
24
25    public int getSpeed() {
26        return speed;
27    }
28
29    public void setSpeed(int speed) {
30        this.speed = speed;
31    }
32
33    @Override
34    public String toString() {
35        return "Car{" +
36               "brand=" + brand +
37               ", speed=" + speed +
38};
39    }
40}
41
42//Создадим интерфейс на основе которого
43//будет создаваться DAO класс на основе
44//которого будет создаваться DAO объект.
45interface DAOInterface {
46    public List<Car> getAllCars();
47    public Car getCar(int carNum);
48    public void updateCar(Car car, int carNum);
49    public void deleteCar(Car car);
50}
51
52//Создаем этот DAO класс
53//реализуя интерфейс выше.
54class DAOImpl implements DAOInterface {
55
56    //Вместо сокрытия в DAO классе низкоуровневого
57    //взаимодействия с БД будем скрывать
58    //низкоуровневое взаимодействие
59    //со списком машин listOfCars.
60    List<Car> listOfCars;
61
62    public DAOImpl(){
63        //Пусть при создании DAO объекта
64        //список инициализируется данными.
65        listOfCars = new ArrayList(Arrays.asList(
66                new Car("Mazda",200),
67                new Car("chevrole",150)));
68    }
69
70    // В методах ниже скрываем взаимодействие с List
71    // То есть как можно увидеть ниже все методы
72    // класса List для низкоуровневого взаимодействия
73    // с объектом List (например remove(), get())
74    // сокрыты в методах DAO класса (в методах
75    // deleteCar(), getCar(), updateCar()) которыми
76    // будут пользоваться высокоуровневые сервисы.
77    @Override
78    public void deleteCar(Car car) {
79        listOfCars.remove(car.getSpeed());
80    }
81
82    @Override
83    public List<Car> getAllCars() {
84        return listOfCars;
85    }
86
87    @Override
88    public Car getCar(int carNum) {
89        return listOfCars.get(carNum);
90    }
91
92    @Override
93    public void updateCar(Car car, int carNum) {
94        Car carfromlist = listOfCars.get(carNum);
95        carfromlist = car;
96    }
97}
98
99//Воспользуемся уже DAO объектом
100//в высокоуровневом сервисе (в мейн).
101public class DAOExample {
102    public static void main(String args[]) {
103        //Через DAO объект dao будем
104        //взаимодействовать с ресурсом(списком).
105        DAOInterface dao = new DAOImpl();
106        //Как видим все непосредственное
107        //взаимодействие со списком сокрыто
108        //в DAO объекте, а в мейн мы
109        //взаимодействуем со списком посредством
110        //методов DAO объекта.
111        Car car = dao.getCar(1);
112        System.out.println(car);
113        car.setBrand("Toyota");
114        dao.updateCar(car, 1);
115        System.out.println(dao.getCar(1));
116    }
117}

Скомпилируем java файл и запустим программу.

Как видим, объект машины в списке был изменен с помощью методов DAO объекта, а не напрямую.  

О DAO шаблоне будет еще много говориться в разделе посвященном spring.


Следующие уроки

Шаблон Front Controller: централизованная обработка запросов

14
мин.

Similar Articles Icon
Divider

Шаблон Template: поведение по умолчанию

14
мин.

Similar Articles Icon
Divider

Что такое Spring Framework и зачем он нужен

20
мин.

Similar Articles Icon