День 1. Минимальный проект с использованием java + hibernate + mysql

max аватар
85
Находится в разделах:

Исходники можно скачать тут.


В данном посте попытаемся сделать минимум телодвижений для выборки\сохранения данных из бд MySQL с использованием проекта на java и объектно-ориентированного маппинга на Hibernate.

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

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

 

Установка MySQL Server  и создание базы данных Tutorial

Если еще не стоит MySQL - стягиваем отсюда http://dev.mysql.com/downloads/mirror.php?id=394757#mirrors и устанавливаем. Затем конфигурируем пароль администратора в визарде.

Затем, когда установка завершена, создадим базу данных

Открываем командную строку в фаре или консоли и идем в паку "C:\Program Files\MySQL\MySQL Server 5.1\bin\". Ну или как она там у вас назвалась.

Логинимся под рутом в mysql:

Создаем базу данных с использованием команды

Затем выставляем привилегии на эту базу:

Создаем Java Project в эклипсе

File -> New -> Java Project. Назовем его Hibernate.

 

Создание первого класса

Создадим сперва класс, который будет представлять событие (просто набор данных), которые будут храниться в базе данных. 

Класс этот будет простым JavaBean классом с несколькими свойствами

Этот класс использует стандартные конвенции названия свойств, а также их геттеров и сеттеров. Также используем закрытые поля (private fields). 

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

Hibernate может получать доступ к public, private и protected полям объекта, а также к методам с аналогичными модификаторами доступа. 

К сохраняемым классам применяется одно правило: у них обязательно должен быть конструктор без аргументов. Hibernate создает объекты с использованием рефлексии (Java Reflection). 

Сохраним этот файл в проекте по пути  src/main/java/org/hibernate/tutorial/domain.

 

Файл маппингов

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

Базовая структура такого файла выглядит следующим образом:

DTD в хибернейте сложный. Его можно использовать для автозаполнения элементов XML маппинга в редакторе или IDE. Hibernate не будет подгружать DTD файл из интернета, а сперва попытается найти его в класспасе приложения. Файл DTD включен в hibernate-core.jar (также он включен и в hibernate3.jar). 

 

info picture В данном примере мы будем опускать определение DTD в последующих примерах для сокращения кода. Конечно, так делать не стоит.

 

 

Между двумя тегами hibernate-mapping включен элемент class. Все классы-сущности нуждаются в маппинге к таблицам в базе данных. 

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

Элемент id  - объявление свойства идентификатора. Атрибут name="id" объявляет имя свойства JavaBean и говорит хибернейту использовать методы getId() и setId() для доступа к свойству.  Атрибут column сообщает какую колонку в таблице EVENTS следует использовать для содержания первичного ключа. 

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

Последнее, что осталось сделать, так это сообщить об оставшихся полях класса. 

Аналогично с элементом id, атрибут name элемента property сообщает о том, какие геттеры и сеттеры следует использовать. В нашем случае, Hibernate будет искать методы getDate(), setDate(), getTitle(), setTitle(). 

 

info picture Почему маппинг свойства date включает атрибут column, а title - нет? Без атрибута column, Хибернейт по умолчанию использует имя свойства как имя колонки. Это работает для title, однако, date - это зарезервированное слово в большинстве баз данных, поэтому необходимо производить маппинг на другое имя.

 

Давайте сохраним файл с маппингами в файл src/main/resources/org/hibernate/tutorial/domain/Event.hbm.xml нашего проекта.

 

Настройка Hibernate

Пришло время настроить сам hibernate. 

В нашем примере, мы будем использовать встроенный пул соединений.  Для настройки мы можем использовать обычный hibernate.properties файл или более сложный hibernate.cfg.xml.

Большинство пользователей предпочитают XML файлы.

Положим hibernate.cfg.xml в папку src (в корень).

И наполним следующим содержимым:

Не забудьте пароль поставить на свой!

 

Запуск

Самое время загрузить и сохранить некоторые объекты Event, но сперва необходимо дописать немного кода. Создадим класс-помощник, который позаботиться о доступе к org.hibernate.SessionFactory.

Кладем файл в src/main/java/org/hibernate/tutorial/util/HibernateUtil.java

Этот класс всего лишь отдает глобальную ссылку на org.hibernate.SessionFactory в статическом инициализаторе. Сделаем сокрытие получения фабрики как при использовании JNDI в серверах приложений. 

 

Загрузка и сохранение объектов

Теперь мы готовы начать реальную работу с хибернейтом. Напишем класс EventManager с main() методом:

В методе createAndStoreEvent() мы создали новый объект Event и отправили путешествовать через хибернейт. Начиная с этого момента, хибернейт берет на себя всю рутину по работе с SQL.

org.hibernate.Session спроектирован для того, чтобы представлять неделимую единицу работы.  Для поддержания транзакции, мы используем org.hibernate.Transaction API. В данном случае мы используем транзакционную симантеку стиля JDBC, но ничто не запрещает использовать JTA.

Что делает sessionFactory.getCurrentSession()? Этот метод всегда возвращает "текущую" единицу работу. Поясним. В конфигурационном файле hibernate.cfg.xml мы переключили опцию механизма на "thread". Согласно этой настройке, контекст текущей единицы работы привязан к текущему потоку Java, в котором выполняется приложение.

 

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

Давайте немного поменяем класс EventManager и добавим условие для вывода результатов из базы:

Теперь, если передать в командной строке параметр load, то будут загружены все записи.

В этом куске кода мы использовали Hibernate Query Language (HQL) для загрузки всех существующих объектов Event из базы данных. Hibernate сгенерирует необходимый SQL, отошлет его в базу данных. а затем заполнит результатами объекты Event.  Вообще, с использованием языка HQL можно создавать гораздо более сложные запросы.

 

P.S: Тут не описаны подключаемые библиотеки. Их реально много. Предполагается, что вы сами сможете найти недостающие jar-ники.

 



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

вот уж не мог себе такое представить это прям ужас какой то спасибо за информацию

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке