Шаблон 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
мин.
Шаблон Template: поведение по умолчанию
14
мин.
Что такое Spring Framework и зачем он нужен
20
мин.