Шаблон DAO (Data Access Object)

Шаблон DAO – это объект, который предоставляет абстрактный интерфейс к какому-либо типу баз данных или механизму хранения (например хранение в файле). Определённые возможности предоставляются независимо от того, какой механизм хранения используется и без необходимости специальным образом соответствовать этому механизму хранения.

Другими словами. Старайтесь писать ваше приложение таким образом, чтобы большая часть его ничего вообще “не знала” о том, какой механизм хранения данных Вы используете. Будь то база данных, файловая система или еще какой-нибудь способ хранения данных. Для этого разработчики Java рекомендуют шаблон DAO.

Используя этот шаблон Ваше приложение получается не завязано на механизм хранения данных. Это дает Вам гибкость в смене этих механизмов хранения. Например, если Вы решили перейти с одной базы данных на другую, то Вам достаточно будет просто реализовать абстрактный интерфейс (предоставляемый DAO) другим способом, а все оставшееся приложение будет без изменений.

Вот пример такого абстрактного интерфейса, о котором мы говорили ранее. Если его реализовать используя JDBC или например API, которое позволяет работать с файлами в Java, то оставшееся приложение будет знать только про этот интерфейс и ничего про его реализации и когда мы например каким-нибудь способом подменим реализацию, то оставшееся приложение будет работать как раньше.

Вот, например, НЕПОЛНАЯ реализация этого интерфейса через JDBC для базы H2 (скорее всего будет работать и для некоторых других баз данных).

Вот пример использования этого интерфейса. Заметьте, что в коде нет ни слова о том, что где-то используется JDBC, SQL или название базы данных (статический блок не в счет. от этого мы научимся избавляться).

Для лучшего запоминания поглядите на небольшую диаграмму классов простейшей реализации этого шаблона.

4

Подробнее

Как клонировать (скачать) проект с github?

Шаг 1

Первым делом Вы должны установить себе git на компьютер. Для этого я уже записывал небольшое видео.

Шаг 2

Заходим на страницу репозитория, который собираемся клонировать и копируем его URL.
0

Шаг 3

Открываем idea и выбираем создать проект клонирую с github.

1

Шаг 4

Вводим URL проекта и название деректории куда хотим клонировать репозиторий.

23

 

Шаг 5

Указываем папку куда мы установили Gradle. Если в том проекте, который Вы качаете Gradle не используется, то этот шаг можно пропустить. Почти все мои проекты которые вы найдете на этом сайте его используют, поэтому желательно его установить. Вот видео.

Нажимаем ок и ждем пока идея сама все остальное сделает за Вас.

4

Все.

Подробнее

Работа с базой данных через шаблон DAO

В этой задаче мы на практике поучимся использовать шаблон DAO (Data Access Object) на практике. Сдесь Вы найдете уже загатовленый проект, который вы должны будете доделать.

Для решения этой задачи Вам возможно понадобятся следующие статьи:

  1. Как клонировать (скачать) проект с github?
  2. Что такое шаблон DAO и для чего его используют?
  3. Мое решение можно найти тут.

Если более детально то:

  1. Вы должны скачать проект с github.
  2. Подготовьте базу для этого проекта.
    1. Создайте таблицу для авторов. Записи в таблицу добавлять необязательно. Например так:
    2. Козалось бы, нужно подключиться к этой базе данных и запускать проект. Но тут выясняется, что он не компилируется. А причнина в том, что интерфейс AuthorDao не до конца реализован классом AuthorDaoJdbcImpl. Ваша задача до реализовать этот интерфейс в этом классе. Собственно класс AuthorDaoJdbcImpl это единственное место где Вы должны писать код в этом задании.
    3. Возможно конечно Вы захотите поменять константы в классе ConnectionFactory, но это только в том случае, если Вы захотите подключиться к другой базе. Вернее, если Вы захотите использовать другие конфигурации для подключения баз данных.
    4. После того как Вы написали код, далее Вы должны запустить метод main и получить следующий вывод в консоль. Если Вы получили что-то другое, то вероятно Вы где-то ошиблись.

Обратите внимание на то, что Вы должны получать Connection используя класс ConnectionFactory. И используя его делать свои манипуляции. Не забывайте закрывать Connection-ы, Statement-ы и ResultSet-ы. Обрабатывайте исключения анналогично тому как я сделал это в методе getById и не забывайте Писать осмысленные сообщения об ошибках. Описание того, что должны делать методы, которые Вы реализуете смотри интерфейс AuthorDao, там все описано.

Все.

Подробнее

Чтение с консоли и запись в базу данных.

Создайте базу данных, в которой будет одна таблица messages. В этой таблице есть 2 колонки author и text. В колонке author – хранятся имена авторов сообщения, а в колонке text – текст сообщения. Напишите консольное приложение, которое просит Вас ввести имя автора и его сообщение. Выглядеть это должно примерно так.

После нажатия на клавишу Enter в таблицу messages добавляется новая строка. В колонку author идет “Pasha”, а в  text значение “hi all”. Выглядеть должно так.
1
Если пользователь вводит команду “–all”, то в консоль выводятся все авторы и их сообщения из таблицы messages. После обработки и вывода сообщений все повторяется заново. Если пользователь вводит “–stop”, то приложение должно завершаться.

Не забываете закрывать connections, statemens, resultsets и освобождать другие ресурсы, если Вы их задействовали. Желательно, чтобы это работало и для русских символов. 

Для решения этой задачи Вам возможно понадобятся следующие статьи:

Вот мой пример.

База данных у меня выглядит так.

1

 

Все.

Если Вы решили это задание, то посмотрите в сторону моего курса Трепещущий Падаван. Возможно он прекрасно Вам подойдет.

Подробнее

Подключение к базе данных с использование JDBC и добавление записей в таблицу.

Предположим, что мы создали базу данных в файле и разместили ее по адресу ~/test.  “~” – Это Ваша личная папка в Windows. У меня это C:\Users\acer. test – название файла БД. Как сделать такую базу читайте здесь.

Также предположим, что Вы уже создали свой проект в IntelliJ IDEA с использованием gradle, как я это описывал здесь.

Пример 1

Поставим перед собой задачу. Нужно подключиться к БД (~/test) и добавить в базу несколько новых записей в таблицу messages.

Шаг 1

Подключение H2 database к gradle проекту.

Шаг 2

Для добавления новых строк в таблицу messages можно использовать следующий код.

Результатом будет следующий вид таблицы messages.

1
Все. Этого уже в принципе достаточно, чтобы решить следующие задачи.

Задача 1

Подробнее

Подключение H2 database к gradle проекту

Подключить к нашему проекту новую зависимость, а именно драйвер подключения к БД H2. Если вы используете другую базу данных, то вам нужно подключать другой драйвер.

Чтобы подключить зависимость откроем файл gradle.build. Затем допишем в него название артефакта, в котором лежит наш драйвер ‘com.h2database:h2:1.4.191′. Для тех, кто совсем не знаком с gradle рекомендую прочитать этот краткий справочник.

Возможно IntelliJ IDE не обнаружила, что Вы подключили новую зависимость. Тогда при запуске приложения она выкинет следующую ошибку.

Чтобы этого избежать Вам нужно явно сказать ей, что скрипт build.gradle изменился. Для этого нажмите на кнопку “обновить”.

1

Все

Подробнее

Чтение из базыданных и вывод в консоль

Создайте базу данных, в которой будет одна таблица messages. В этой таблице есть 2 колонки author и text. В колонке author – хранятся имена авторов сообщения, а в колонке text – текст сообщения. Напишите консольное приложение, которое просит Вас ввести имя автора и выводит в консоль все его сообщения. Если пользователь вводит команду “–all”, то в консоль выводятся все авторы и их сообщения из таблицы messages. После обработки и вывода сообщений все повторяется заново. Если пользователь вводит “–stop”, то приложение должно завершаться.

Не забываете закрывать connections, statemens, resultsets и освобождать другие ресурсы, если Вы их задействовали. Желательно, чтобы это работало и для русских символов. 

Для решения этой задачи Вам возможно понадобятся эти статьи:

Вот мой пример.

База данных у меня выглядит так.

1

Все.

Если Вы решили это задание, то посмотрите в сторону моего курса Трепещущий Падаван. Возможно он прекрасно Вам подойдет.

Подробнее

Подключение к базе данных с использование JDBC.

Предположим, что мы создали базу данных в файле и разместили ее по адресу ~/test.  “~” – Это Ваша личная папка в Windows. У меня это C:\Users\acer. test – название файла БД. Как сделать такую базу читайте здесь.

Также предположим, что Вы уже создали свой проект в IntelliJ IDEA с использованием gradle, как я это описывал здесь.

Пример 1

Поставим перед собой задачу. Нужно подключиться к БД (~/test) и извлечь из таблицы messages всю информацию и вывести на консоль.

Шаг 1

Подключение H2 database к gradle проекту.

Шаг 2

Создаем класс Main в каком-нибудь пакете. У меня это ru.itsphere.fromdbtoconsole.

Кратко опишу, что происходит в этом коде.

Первым делом мы загрузили в память класс драйвера, который нужен для подключения к этой конкретно БД H2. Затем мы создали Connection к этой БД. Для этого нам понадобилось узнать URL, login и password это БД. Эти данные мы указывали при создание этой БД. Далее при помощи Connection мы создали Statement и выполнили SQL выражение “SELECT * FROM messages;”. 

Результатом выполнения стал ResultSet, из которого мы извлекли всю необходимую информацию. И все вывели на консоль. Когда программа выйдет из блока try () {} ResultSet, Connection, Statement закроются в порядке обратном их созданию.

На экран выведется следующее.

Пример 2

Теперь изменим немного задачу и попробуем извлечь только текст сообщения, у которых автор Dasha. Для этого нужно изменить только метод main.

Кратко опишу, что происходит в этом коде.

Первым делом мы загрузили в память класс драйвера, который нужен для подключения к этой конкретно БД H2. Затем мы создали Connection к этой БД. Для этого нам понадобилось узнать URL, login и password это БД. Эти данные мы указывали при создание этой БД. Далее при помощи Connection мы создали PreparedStatement и выполнили SQL выражение “SELECT * FROM messages WHERE author = ?;”. Если нужно в запрос вставлять какие-то значения, то не используйте конкатенацию! используйте PreparedStatement. 

Результатом выполнения стал ResultSet, из которого мы извлекли всю необходимую информацию. И все вывели на консоль. Когда программа выйдет из блока try () {} ResultSet, Connection, Statement закроются в порядке обратном их созданию.

На экран выведется следующее.

Все этого уже в принципе достаточно, чтобы решить следующие задачи.
Задачка 1

Возможные ошибки

Can’t get connection: База данных уже иÑ�пользуетÑ�Ñ�: null. Возможные решениÑ�: закрыть вÑ�е другие Ñ�оединениÑ�; иÑ�пользовать режим Ñ�ервера
Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-191]

Данная ошибка возникла т.к. вы запустили метод main в то время, когда уже соединились к своей базе данных из другого места. Закройте соединение через браузер, если не поможет, то возможно остался запущенный процесс в диспетчере задач windows (завершите его). Еще возможно в IDE Вы запустили несколько раз свое приложение в этом случае закройте все приложения.
Ответ, как не странно, кроется в сообщении об ошибке Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode.

Подробнее

Создание базы данных, таблиц и наполнение информацией.

Целью написания этой статьи выступило то, что мне было необходимо в кратчайшие сроки вводить людей, с которыми я занимаюсь как ментор, в такие технология как JDBC, Hibernate и т.д.. Поэтому я принял решение познакомить Вас с H2,  Java SQL базой данных. Ее не рекомендуется использовать в реальных проектах, но она прекрасно подходит для целей изучения работы с базами данных через java. Она не требует сложных конфигураций, а для запуска клиента, который позволит Вам манипулировать данными своем БД Вам достаточно просто скачать jar файл и запустить его. Официальный quickstart.

После запуска у Вас откроется браузер и Вы увидите следующую картину.

1

Если Вы нажмете на кнопку “Соединиться”, то откроется менеджер базы данных, которая доступна по адресу jdbc:h2:mem:test. Где mem – обозначает, что база будет создана в памяти и будет удалена, после завершения работы с ней. test – название базы данных.

Также можно создавать базу данных как отдельный файл, тогда она не удалится, если Вы завершите работу с ней. Для этого нужно указать один из следующих JDBC URL’s.
jdbc:h2:~/test – создастся в домашней директории пользователя.
jdbc:h2:file:C:/data/test – создастся в указанной папке.
jdbc:h2:file:./test – создастся в текущей папке (там где jar-файл).
Есть и другие варианты, но сейчас они нам не важны.

Имя пользователя “sa” и пароль “” пока оставим по умолчанию. Нажимаем кнопку Соединиться.

Теперь Вы видите подобную картину.

2

Поставим перед собой задачу. Создадим таблицу с текстовыми сообщениями. Эта таблица будет содержать 2 колонки автор (author) и текст сообщения (text). И заполним их несколькими сообщениями.

Шаг 1

Первым делом создадим таблицу с необходимыми колонками. Подробно про создание таблиц.

CREATE TABLE – оператор для создания таблиц.
messages
– название таблицы.
author – название колонки авторов.
VARCHAR(255) – тип хранимых значений и длина хранимого значения.
text – название колонки текста сообщения.

После выполнения видим такую картину.

3

Шаг 2

Следующим шагом добавим в эту таблицу 3 сообщения. Например такие.

Автор: Sasha, текст: Hello World.
Автор: Dasha, текст: Hello Sasha.
Автор: Masha, текст: Hello Sasha.

Для этого напишем следующее SQL выражение. Подробно про вставку значений в таблицу.

INSERT INTO – оператор для вставки значения в таблиц.
messages
– название таблицы.
author – название колонки авторов.
text – название колонки текста сообщения.
VALUES – указываем, что дальше пойдут значения.

После выполнения видим такую картину. Кстати кириллицу можно использовать тоже.

4

Шаг 3

Теперь убедимся, что вставка действительно произошла и значения в таблице.

Для этого используем оператор SELECT. Подробная информация.

SELECT – оператор для извлечения данных из таблицы.
* – обозначает, что хотим получить все колонки.
FROM – указываем из какой таблицы берем значения.
messages
– название таблицы.

После выполнения видим такую картину.
5

Если мы хотим получить какие-то данные по некоторому условию, то можно использовать оператор WHERE.

WHERE – оператор указывает, что дальше пойдет условие извлечения.
author = ‘Dasha’ – указываем, что значение в колонке author должно быть ‘Dasha’.
Теперь Вы можете использовать эту базу данных в своих java (и не только) приложениях.

Вот задачи для на эту тему.

Подробнее