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

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

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

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

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

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

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

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

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

Подробнее

Подключение к базе данных с использование 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.

Подробнее

Как стать программистом 4

Как стать программистом? Часть 4 – Топ 7 технологий для java junior разработчика.

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

 

Надеюсь Вы понимаете, что от junior не требуют глубоких знаний. Когда-то, кто-то мне сказал, что junior должен знать все, но чуть-чуть. Поэтому не кидайтесь учить все, вплоть до ассемблера. Короче, подробнее буду описывать по ходу.

Еще добавлю, что в этом топе перечислены только чрезвычайно важные темы. Это совсем не значит, что в следующем будут не важные. Там так же будут те, без которых не обойтись. Еще к ним добавятся уже профессиональные навыки, которые на порядок увеличат вашу конкурентное преимущество. Поехали.

Первое место! ООП

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

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

Раз Вы новичок, то Вас скорее всего, на собеседовании, попросят объяснить, как работает ООП на том языке, который Вы изучаете. Может дадут кусок кода, в котором иерархия классов и скажут определить, какой метод вызовется при тех или иных условиях.

Второе место! Java core

Вторым по важности идет java core. Это достаточно широкое понятие. На знание java core, Вас могут попросить решить тест. Этот тест будет из разряда, что будет если выполнится данный код. Вы заранее можете потренироваться решать такие тесты. В интернете полно ресурсов, которые позволят пройти такую проверку бесплатно. Поищите OCJP(SCJP) tests online.

Если быть более конкретным, то Вы должны  знать порядок инициализации классов, в том числе статических переменных и блоков. Знать порядок вызова конструкторов в иерархии классов. Знать иерархию основных интерфейсов и классов. В том числе коллекций и исключений. Понимать, что такое внутренние, анонимные классы. Еще выучите все методы, которые есть в классе Object и разберитесь зачем они нужны. Короче, этот список достоин отдельного видео ролика.

Обратите внимание на то, что я сказал, что вам МОГУТ дать такой тест. Если его не дадут, то скорее всего спросят устно. В этом случае Вы можете проскочить.

Третье место. Java Collections

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

Первым делом выучите основные интерфейсы и поймите для чего они нужны и чем отличаются. Список не большой это Collection List, Set, Queue и Map. Не нужно заучивать все их методы, лучше научитесь пользоваться ими.

Затем выучите основные реализации. Также список не большой, это LinkedList, ArrayList, Vector, HashMap, Hashtable, TreeMap, HashSet, TreeSet. Их недостаточно просто уметь применять. Понимайте особенности реализации и то, когда их нужно использовать. Желательно знать временную сложность выполнения тех или иных операций.

Четвертое место. Servlets

Сервлеты – это тоже очень важная штука. Очень часто на собеседовании меня спрашивали о жизненном цикле сервлетов.

Честно говоря, писать серверную часть для веб и андроид приложений можно и не зная о сервлетах. Но это почти тоже самое, если назвать человека программистом после того, как он сделал свой первый сайт на wordpress. По этому если не хотите, чтобы у Вас был комплекс не полноценности, то учите сервлеты.

Пятое место. Synchronization

Раз уж мы коснулись сервлетов, которые могут обрабатывать множество параллельных запросов, то это время упомянуть немного синхронизацию потоков и много поточность. Я не считаю потоки относительно важной темой. Их еще коснемся позже. Намного важнее уметь синхронизировать доступ к общим ресурсам между несколькими потоками.

Научитесь пользоваться ключевым словом synchronized. Так получилось, что я устроился на свою первую работу не зная о существовании классов Semaphore и СountDownlatch. Поэтому я считаю, что это не сильно важно, но если будет свободное время, то поковыряйте их.

Шестое место. JDBC

Практически в любом тестовом проекте, который Вы получите, будет работа с базами данных. Тема, мягко говоря, важная. Знаете, что такое CRUD редактор? Если нет, то поищите в google.

Создайте несколько классов, которые связаны между собой связью одни ко многим, один ко одному или многие ко многим. Затем напишите свой CRUD редактор для этих классов используя JDBC, можно даже без клиентской части. Это и будет критерием того, знакомы ли Вы с JDBC достаточно, чтобы искать работу.

Седьмое место. SQL

Раз уж мы коснулись JDBC, то и SQL не обойдем стороной. Вы достаточно неплохо познакомитесь с SQL, когда будете писать CRUD редактор на JDBC. Но я подчеркну еще, что Вы должны понимать следующие операторы языка SQL: SELECT, WHERE, INSERT, DELETE, UPDATE, JOIN (все типы), GROUP BY, ORDER BY.

Сейчас в меня полетит груда камней. Но я должен Вам приоткрыть завесу тайны. Всегда говорят, что SQL нужно знать очень хорошо и это правда. Но для новичка есть поблажки. Он должен его знать достаточно, чтобы пройти собеседование, а дальше, почти всегда, будет возможность залезть в википедию и подглядеть, если что забыл. По большему счету, это можно сказать, практически про все, что было сказано выше.

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

Итог

Как Вы могли заметить, самые крепкие знания Вам потребуются по Java core. По всему остальному можно создать видимость наличия у Вас опыта использования. Это объясняется тем, что обычно только по Java core могут дать решать тест. А тест, как Вы понимаете уже сложнее, обмануть. Хотя может попасться такой интервьюер, который так будет придираться, что пиши пропало.

Еще дополню, что в мое слово “обмануть” я вкладываю немного другой смысл. Я думаю, что почти у всех новичков есть некоторая своя оценка их знаний. И зачастую она очень низкая. То есть, ты думаешь, что ничего не знаешь, а на работу тебя взяли. Получается ты думаешь, что обманул интервьюера. Хотя он может просто закрыл глаза на некоторые твои пробелы и фирма готова их закрыть за свой счет. Получается, что  обман существует только в твоей голове.

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

Все!

 

Подробнее