В данном уроке я продемонстрирую как работать с MySQL базой данных используя Maven 3 и Hibernate 3.2.
В этом уроке я кратко покажу вам, как использовать Maven для создания простого проекта Java с использованием Hibernate для работы с базой данных MySQL.
Что нам потребуется?
1) Maven 3.0.5
2) JDK 1.7.0_17
3) БД MySQL 5.5.30
4) Hibernate 4.1.11.Final
5) JDBC MySQL 5.1.24
Шаг 1. Создаем таблицу.
В вашей БД создадим таблицу user:
DROP TABLE IF EXISTS `user`; CREATE TABLE user ( `USER_ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `FIRST_NAME` VARCHAR(20) NOT NULL, `LAST_NAME` VARCHAR(20) NOT NULL, PRIMARY KEY (`USER_ID`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Шаг 2. Создание Maven проекта
В Intellij IDEA выбираем File->New Project->Maven module:
Шаг 3. Структура проекта
Создадим теперь класс EnterPoint.java который будет запускать наше приложение.
После чего структура проекта у вас должна выглядеть следующим образом:
Шаг 4. Добавляем зависимости
Теперь в pom.xml
добавим зависимости для MySQL и Hibernate:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.devcolibri.common</groupId> <artifactId>WorkFromDB</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <hibernate.version>4.1.11.Final</hibernate.version> <mysql.version>5.1.24</mysql.version> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> </dependencies> </project>
Шаг 5. Создаем Mapping файл
Создайте User.hbm.xml
“src\main\resources\com\devcolibri\User.hbm.xml“:
Файл User.hbm.xml выглядит так:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.devcolibri.entity.User" table="user" catalog="test"> <id name="userId" type="java.lang.Integer"> <column name="USER_ID" /> <generator class="identity" /> </id> <property name="firstName" type="string"> <column name="FIRST_NAME" length="20" not-null="true" unique="true" /> </property> <property name="lastName" type="string"> <column name="LAST_NAME" length="20" not-null="true" unique="true" /> </property> </class> </hibernate-mapping>
Этот класс описывает таблицу, что в БД и сущность User.java, давайте её создадим.
catalog=’test’ – это имя БД.
table=’user’ – это имя таблицы на которую мы привязываем класс User.java.
Для этого создадим пакет entity (src\main\java\com\devcolibri\entity) и в нем создадим сущность User.java:package com.devcolibri.entity;
package com.devcolibri.entity; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; private Integer userId; private String firstName; private String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public User() { } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } }
Это простой Java класс с атрибутами и Getter & Setter для них.
Шаг 6. Создание конфигурационного файла Hibernate
Создадим конфигурационный файл для Hibernete hibernate.cfg.xml
по пути “src\main\resources\hibernate.cfg.xml” со следующим содержимым:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.bytecode.use_reflection_optimizer">false</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <mapping resource="com/devcolibri/User.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
Этот файл отвечает за соединение с БД и связкой наших mapping с ней.
Строка 8 говорит о том что для роботы с БД мы используем JDBC MySQL драйвер.
Строка 9 – пароль к БД.
Строка 10 – host к БД, где test – база данных.
Строка 11 – логин вашего пользователя к БД.
Строка 15 – замапенный класс User, что бы hibernate знал за какую таблицу в БД отвечает этот класс.
Шаг 7. Создание Hibernate Utility класса
Этот класс будет заботится о начале сессии.
Создадим класс HibernateUtil.java
тут “src\main\java\com\devcolibri\persistence\HibernateUtil.java” со следующим содержанием:
package com.devcolibri.persistence; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static ServiceRegistry serviceRegistry; private static SessionFactory buildSessionFactory() { try { // Создает сессию с hibernate.cfg.xml Configuration configuration = new Configuration(); configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); return configuration.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { // Чистит кеш и закрывает соединение с БД getSessionFactory().close(); } }
Шаг 8. Финишная структура проекта
Теперь проверим структуру проекта, она должна совпадать с этой:
Шаг 9. Сохранение user в БД
Теперь в класс EnterPoint.java допишем следующий код:
package com.devcolibri; import com.devcolibri.entity.User; import com.devcolibri.persistence.HibernateUtil; import org.hibernate.Session; public class EnterPoint { public static void main(String[] args) { System.out.println("Maven + Hibernate + MySQL"); Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); User user = new User(); user.setFirstName("Alexander"); user.setLastName("Barchuk"); session.save(user); session.getTransaction().commit(); } }
Шаг 10. Запуск
Запускаем EnterPoint.java и в консоли будут выведены логи Hibernate и такая строчка:
Hibernate: insert into test.user (FIRST_NAME, LAST_NAME) values (?, ?)
это значит что запись успешно добавлена.
Идем в БД и смотрим действительно ли добавлена запись в БД.
p.s. Спасибо за внимание! Если вам урок понравился, то подписывайтесь на обновление в форме ниже.
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
34 комментариев к статье "Как работать с MySQL в Java - Hibernate XML Mapping"
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
Вообще то хибернейт сам создает в БД Таблицу, по полям которые прописаны в модели… Да и к сожалению слишком много кода, сейчас все активно переходят на Аннотации, и еще Чисто хибернейт использовать не нужно лучше всего через интерфейс JPA. тогда код будет лаконичный. Для новичков это будет страшно видеть…
Не умея юзать Hibernate юзать JPA с использование Hibernate provider? Думаю вы не совсем понимаете суть. И на сайте есть статья по поводу JPA и Hibernate в качестве провайдера.
Спасибо Александр. Изложенный материал помог разобраться :)
Рад, что помог :)
Спасибо Ваш пример первый из нескольких десятков заработал из коробки, для меня как новичка это точка упора от которой можно начинать разбираться.
У меня класс HibernateUtil не компилируется, говорит что метод buildServiceRegistry() в классе ServiceRegistryBuilder не существует
Эммм, а как вывести содержимое таблици?
Ответ найден в теме о JPA. Вопрос снят.
Можешь дать ссылку?
Исправьте, пожалуйста, “Строка 11 — пароль к БД.”
Спасибо, исправил.
Работает! Третий день пытаюсь разобраться с Hibernate и ни один пример толком не работает с нуля, если все делать по шагам. Ваш – работает! Большое спасибо!
Здравствуйте. Спасибо за сайт. Очень интересный и полезный.
Теперь по поводу статьи.
Статья мне помогла, и я решил пойти дальше, но столкнулся с неожиданной проблемой.
Когда я пытаюсь выгрузить из базы запись, мне приходит объект типа com.devcolibri.entitySamvelDB@12ef586.
По дебагеру вижу, что в объекте хранится запись из базы (то, что я и пытался выгрузить), однако не могу никак распарсить оюъект.
String hql100 = “FROM SamvelDB E WHERE E.type = 1”;
Query query100 = session.createQuery(hql100);
Object results100 = query100.list().get(0);
System.out.println(“—> ” + results100 + ” <—");
Подскажите, пожалуйста, как получить значение из каждой конкретно ячейки.
Вот тебе код для этого:
public static List get() {
Session s = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
List list = null;
try {
tx = s.beginTransaction();
// here get object
list = s.createCriteria(User.class).list();
tx.commit();
} catch (HibernateException ex) {
if (tx != null) {
tx.rollback();
}
Logger.getLogger(“con”).info(“Exception: ” + ex.getMessage());
ex.printStackTrace(System.err);
} finally {
s.close();
}
return list;
}
после запуска проекта выдает ошибку:
Exception in thread “main” java.lang.ClassNotFoundException: com.devcolibri.EnterPoint
Спасибо за статью, очень наглядно!
Пример, классный, но вот выкинуло ошибку как у Никиты.
после запуска проекта выдает ошибку:
Exception in thread «main» java.lang.ClassNotFoundException: com.devcolibri.EnterPoint
Давно ищу как с таким бороться. Думаю, что IDEA где-то хромает :(
Переуставновил IDEA и настрол зановоно, не “подхватывая” старые настройки … все заработало. Но по-честному побеждать такую магию так и не разобрался :(
Извините если вопрос глупый, но тем не менее))
В данном примере конфигурационный файл ’’hibernate.cfg.xml’’ расположен в “src/main/resources/hibernate.cfg.xml“.
А если у меня веб-приложение (в котором я хочу использовать ’’Annotation’’, вместо ’’XML Mapping’’), то куда нужно положить данный файл?
Находил информацию, что файл должен лежать в ’’WEB-INF/classes’’.
Но если й так, то что за ’’classes’’? Может быть путь должен выглядь так: ’’WEB-INF/hibernate.cfg.xml’’?
“classes” – это папка с ресурсами и классами программы. А WEB-INF – ресурсы ГОТОВОГО приложения.
Ты в шаге 6 немного напутал с проперти, там 9 это jdbc, 10 password для БД и т.д
Всё правильно. Строки в примере кода визуально смещены относительно их нумерации.
Хорошо написан quick start для связки Intellij Idea + Maven + Hibernate + MySQL. Спасибо!
Добрый день. Совсем глупый вопрос. Как запустить уже собранный проэкт?
Вышел с положения присоединив плагин maven-assembly-plugin. Но интересно как Вы предполагали запускать. В статье ничего не написано
Исправьте 15-ю строку файла hibernate.cfg.xml.
Вместо:
На:
Спасибо за статьи. Они у вас лучше написаны, чем у mkyong
Добрый день. Скажите а работать с Hibernate в Spring Boot можно?
Народ, я пробую достать данних с БД но получаю “null”. МОжет ктото столкнулся с етим?
Привет, спасибо за урок
в прикрепленном сайте туториал подключения MySQL,не понимаю как сделать шаг Create New JDBC Connection Pool в intellij. В netbeans все получилось. Александр, поможете разобраться
Я запустил ваш код в IDEA 2016.3.5, и получилась только ошибка.
И один вопрос: можно запускать программу на компе с Denwer MySQL?
Да, можно.
От у меня тот же вопрос, как у Романа: можно ли запустить прогу на Denwer?
Это действительно очень нужный урок, где проект работает без каких-либо исправлений. Другие авторы пытаются сразу напихать spring, slf4j и т.д., в результате ничего не работает.