Работа с базой данных через шаблон 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, там все описано.

Все.

Подробнее

как учить без денег 3

Как учить java бесплатно 03. Задача с файлами, консолью и сортировкой.

Привет. Продолжаем изучать java не тратя деньги. Сегодня Вы получите еще одну задачу. Я уже говорил, что чтобы научиться программировать нужно,  как не странно программировать. Поэтому вот Вам практическая задачка. Она для новичков и очень простая.

Напишите консольное приложение, которое считывает пользователей из файла и делает из них список объектов класса Person. Затем приложение просит Вас ввести одну из следующих команд. ‘-f’ – сортировка по имени, ‘-s’ – сортировка по фамилии, ‘-a’ – сортировка по возрасту. В зависимости от введенной команды должен вывестись список пользователей отсортированных по имени, фамилии или возрасту. Если пользователь вводит “–stop”, то приложение должно завершаться.

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

Подробно ознакомиться с условием вы можете перейдя по этой ссылке. Там же Вы сможете ознакомиться с моим решением. И с тем как должен выглядеть файл с пользователями.

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

Подробнее

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

Подробнее

как учить без денег 2

Как учить java бесплатно 02. Задача с файлами и консолью.

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

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

Когда-то давно, уже даже не помню где, услышал или прочитал следующую мысль. “Чтобы научиться программировать программируй.” – типичная ошибка новичка в том, что он слишком много уделяет времени чтению, а не практике. Практика намного важнее. Но поймите меня правильно. Во всем нужно соблюсти баланс. Человек обладающий кучей теоретических знаний никогда не напишите хорошее приложение потому, что у него нет опыта. А человек, который обладает большим опытом может написать приложение, но это скорее всего будет индусский код.

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

Напишите консольное приложение, которое просит Вас ввести произвольное количество слов и после нажатия на клавишу Enter записывает эти слова в текстовый файл. После записи, приложение, снова просить Вас ввести несколько слов и после нажатия на Enter добавляет их в конец этого же файла, но на новой строке и так до бесконечности. Первые слова должны остаться. Если пользователь вводит “–stop”, то приложение должно завершаться.

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

Подробно ознакомиться с условием вы можете перейдя по этой аннотации. Там же Вы сможете ознакомиться с моим решением.

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

Та-дам!

Подробнее

Эффуктивный способ обучаться

Эффективный способ изучения java. Мнение о devcolibri.

Я уже ни раз говорил, что одним из самых эффективных способов изучения java является изучение с ментором, но этот способ для большинства не подходит т.к. они не могут ежемесячно платить 100 – 300 $ за обучение. Поэтому, мы сейчас не будем говорить про этот способ. Я предлагаю сосредоточиться на том, который бесплатен, но тем не менее включает в себя участи учителя.

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

Я периодически на youtube натыкаюсь на подобные каналы. И знаете, что меня больше всего раздражает в подобных видео? Это низкая концентрация полезной информации на единицу времени. Например, автор может рассказать много полезного, но видео растянется на целый час и в этот момент ты ловишь себя на мысли, что быстрее бы прочитал главу книги связанную с этим вопросом. Также возможно автор не вырезал моменты, в которых он опечатывался или у него просто происходили какие-то технические проблемы. Тогда какой в этом смысл?

Пару дней назад мне написал Александр Барчук автор канала devcolibri и предложил дружить каналами. Для начала мы решили обменяться видео роликами, в которых постараемся выразить свое мнение о наших проектах. Я согласился. И когда сел за более подробное изучение его канала первое, что бросилось мне в глаза это качество видео, которое он выкладывает. Все то негативное, что я озвучил выше отсутствует в его видео. Перейдите и посмотрите сами.

Я сам не так давно начал изучать Android и с удовольствием посмотрел несколько видео, в которых он рассказывал про темы, которых я сам пока еще не касался. Для начинающих java разработчиков рекомендую посмотреть видео связанные с работой в git и если вам интересна тема разработки Android приложений, то можете посмотреть серию видео роликов, в которой он по шагам рассказывает про то, как написать свое простое приложение и сопровождает это ссылками на github. В этих видео он также рассказывает, как написать серверное приложение для взаимодействия с android приложением и знакомит вас с гибкой методологией разработки ПО Agile.

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

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

Думаю, у меня получилось донести до вас свою мысль, что очень эффективно научиться подражать и желательно параллельно выяснять, почему нужно сделать так, а не иначе.

А на этом пока все.

Подробнее

JC: Чтение из файла, сортировка и вывод в консоль

Напишите консольное приложение, которое считывает пользователей из файла и делает из них список объектов класса Person. Затем приложение просит Вас ввести одну из следующих команд. ‘-f’ – сортировка по имени, ‘-s’ – сортировка по фамилии, ‘-a’ – сортировка по возрасту. В зависимости от введенной команды должен вывестись список пользователей отсортированных по имени, фамилии или возрасту. Если пользователь вводит “–stop”, то приложение должно завершаться.

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

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

 

Файл с пользователями.

Должен получиться примерно такой вывод на консоль

Рекомендую использовать следующие классы.

Все.

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

Подробнее

JС: Жизненный цикл создания java объектов

В этой статье я расскажу про то, через какие этапы проходит java объекты при их создании. Другими словами, я расскажу про жизненный цикл java объектов.

Для начинающего java разработчика очень важно понимание жизненного цикла класса. Это поможет быстро решать возникшие ошибки компиляции и предотвратит появление многочисленных багов.

Когда в методе main мы создаем какой-нибудь объект, java берет на себя заботу по выполнению различных этапов создания объекта.

Пример 1

Например, мы имеем следующий код в файле Main.java.

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

Как Вы видите java без надобности не подгружает классы, которые не используются. Я говорю о классах ObjectCircle и ParentObjectCircle. Загрузчик классов (класс ClassLoader) не начнет их загружать в память без надобности.

Пример 2

Теперь давайте этот файл немного изменим. И добавим в метод main создание объекта класса ObjectCircle. Остальной файл Main.java остался без изменений.

Данный код выведет следующий текст в консоль.

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

Теперь в консоль выведется следующий текст.

Обратите внимание на то, что статический блок выполняется только один раз. Это происходит потому, что статические блоки кода выполняются при загрузке класса ClassLoader-ом в память. Когда мы создаем второй объект, этого не происходит т.к. этот класс уже был загружен в память при создании первого объекта. Еще обратите внимание на то, что перед выполнением статического блока первым делом проинициализировались все статические переменные этого класса, а уже потом выполнился статический блок кода. Об этом говорит то, что в консоли первым появился следующий текст.

После того как класс был загружен, выполнилась инициализация статических переменных и выполнились статические блоки кода происходит непосредственное создание объекта данного класса. А именно в первую очередь инициализируются не статические переменные, за ними идет выполнение не статического блока кода, а затем выполнение конструктора. При следующем создании объекта данного класса выполнятся только эти этапы. Об этом также говорит выведенный в консоль текст.

Последнее о чем стоит сказать это то, что метод finalize вообще не вызвался. Многие новички полагают, что это некоторый аналог деструктора из C++. Но в отличие от C++ java не гарантирует его выполнение. Поэтому его и не рекомендуют использовать.

Пример 3

В следующем примере разберем немного измененный файл Main.java. Сделаем так, чтобы класс ObjectCircle расширял класс ParentObjectCircle.

Выполним снова метод main и посмотрим, что из этого получилось.

Теперь стало все намного сложнее и интереснее. При создании первого объекта класса ObjectCircle ClassLoader загружает не сам этот класс, а в первую очередь в память загружается его родительский класс. И уже в нем выполняется инициализация статических переменных.

А затем выполняются статические блоки.

После чего идет инициализация уже статических переменных нашего класса.

И выполняются статические блоки.

После того как оба класса ClassLoader-ом загружены в память идет создание самих объектов. Обратите внимание на то, что сначала инициализируются не статические поля родительского класса, выполняются не статические блоки кода родительского класса, а уже потом выполняется конструктор родительского класса.

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

Создание второго объекта класса ObjectCircle также начинается с выполнения всех этапов родительского класса, а уже потом все этапы класса  ObjectCircle.

Опять обратите внимание на то, что метод finalize не вызвался!

Пример 4

Рассмотрим еще один уже последний пример на сегодня. Создадим файл ObjectCircle.java.

В этом примере мы полностью избавились от класса Main и метод main перенесли в класс ObjectCircle. Посмотрим, что выведется на экран, если мы запустим метод main.

Получился очень интересны результат. Выходит, что из-за того, что мы метод main перенесли в сам класса ObjectCircle, ClassLoader намного раньше загрузил в память классы ObjectCircle и ParentObjectCircle. Это конечно же объясняется тем, что метод main находится в классе ObjectCircle и для выполнения метода main его нужно загрузить. Но для загрузки класса ObjectCircle  нужно предварительно загрузить в память еще и класс ParentObjectCircle. Поэтому произошла инициализация статических полей и статических блоков кода в этих классах еще до выполнения метода main.

Настало время подвести итог.

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

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

Переопределении метода finalize может приводить к проблемам связанным с некорректным освобождением ресурсов. Это связано с тем, что нет никакой гарантии, что метод finalize будет вызван. Используйте его только, если на все 100% знаете к чему это приведет.

Подробнее

JС: Модификаторы доступа java для полей и методов класса

У многие новички часто путают или не могут понять разницу между default and protected модификаторами доступа. Цель этой статьи наглядно объяснить разницу.

В java существуют 4 модификатора доступа private, default, protected и public. Их можно применять как к полям класса так и к методам, а также к самим классам  и интерфейсам.

Далее будем говорить только о членах класса – полях и методах.

Теперь эту таблицу рассмотрим на примерах

Модификатор private.

Для такого класса A.

Модификатор default.

Для такого класса A.

Тоже самое, что и модификатор private. Плюс следующее.

Модификатор protected.

Для такого класса A.

Тоже самое, что и модификатор default. Плюс следующее.

Модификатор public.

Для такого класса A.

Тоже самое, что и модификатор protected. Плюс следующее.

Вот и все.

Подробнее