Как работать с MySQL в Java — Hibernate XML Mapping

В данном уроке я продемонстрирую как работать с 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. Спасибо за внимание! Если вам урок понравился, то подписывайтесь на обновление в форме ниже.

Урок создан: 17 апреля 2013 | Просмотров: 54515 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 29 мая 2013 в 17:14

    NmDimas

    Вообще то хибернейт сам создает в БД Таблицу, по полям которые прописаны в модели… Да и к сожалению слишком много кода, сейчас все активно переходят на Аннотации, и еще Чисто хибернейт использовать не нужно лучше всего через интерфейс JPA. тогда код будет лаконичный. Для новичков это будет страшно видеть…

    • 29 мая 2013 в 18:25

      Александр Барчук

      Не умея юзать Hibernate юзать JPA с использование Hibernate provider? Думаю вы не совсем понимаете суть. И на сайте есть статья по поводу JPA и Hibernate в качестве провайдера.

  • 19 июля 2013 в 12:15

    Виктор

    Спасибо Александр. Изложенный материал помог разобраться :)

    • 21 июля 2013 в 18:10

      Александр Барчук

      Рад, что помог :)

      • 05 марта 2014 в 04:46

        Serg

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

  • 14 марта 2014 в 18:57

    Роман

    У меня класс HibernateUtil не компилируется, говорит что метод buildServiceRegistry() в классе ServiceRegistryBuilder не существует

  • 20 марта 2014 в 15:44

    Oleg

    Эммм, а как вывести содержимое таблици?

    • 21 марта 2014 в 21:06

      Oleg

      Ответ найден в теме о JPA. Вопрос снят.

      • 03 апреля 2014 в 16:35

        Cooltik

        Можешь дать ссылку?

  • 14 июля 2014 в 11:49

    Талгат

    Исправьте, пожалуйста, «Строка 11 — пароль к БД.»

  • 10 ноября 2014 в 14:05

    Даня

    Работает! Третий день пытаюсь разобраться с Hibernate и ни один пример толком не работает с нуля, если все делать по шагам. Ваш — работает! Большое спасибо!

  • 19 февраля 2015 в 23:59

    Samvel

    Здравствуйте. Спасибо за сайт. Очень интересный и полезный.
    Теперь по поводу статьи.
    Статья мне помогла, и я решил пойти дальше, но столкнулся с неожиданной проблемой.
    Когда я пытаюсь выгрузить из базы запись, мне приходит объект типа 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 + » <—");
    Подскажите, пожалуйста, как получить значение из каждой конкретно ячейки.

  • 15 апреля 2015 в 18:54

    Никита

    после запуска проекта выдает ошибку:
    Exception in thread «main» java.lang.ClassNotFoundException: com.devcolibri.EnterPoint

  • 25 апреля 2015 в 23:04

    Дмитрий

    Спасибо за статью, очень наглядно!

  • 25 июля 2015 в 08:13

    Николай

    Пример, классный, но вот выкинуло ошибку как у Никиты.
    после запуска проекта выдает ошибку:
    Exception in thread «main» java.lang.ClassNotFoundException: com.devcolibri.EnterPoint

    Давно ищу как с таким бороться. Думаю, что IDEA где-то хромает :(

    • 25 июля 2015 в 16:45

      Николай

      Переуставновил IDEA и настрол зановоно, не «подхватывая» старые настройки … все заработало. Но по-честному побеждать такую магию так и не разобрался :(

  • 26 июля 2015 в 01:35

    GiovanniKL

    Извините если вопрос глупый, но тем не менее))
    В данном примере конфигурационный файл ’’hibernate.cfg.xml’’ расположен в “src/main/resources/hibernate.cfg.xml“.
    А если у меня веб-приложение (в котором я хочу использовать ’’Annotation’’, вместо ’’XML Mapping’’), то куда нужно положить данный файл?
    Находил информацию, что файл должен лежать в ’’WEB-INF/classes’’.
    Но если й так, то что за ’’classes’’? Может быть путь должен выглядь так: ’’WEB-INF/hibernate.cfg.xml’’?

  • 28 июля 2015 в 20:10

    Олег

    Ты в шаге 6 немного напутал с проперти, там 9 это jdbc, 10 password для БД и т.д

  • 31 июля 2015 в 09:11

    AlexandrRS

    Хорошо написан quick start для связки Intellij Idea + Maven + Hibernate + MySQL. Спасибо!

  • 04 августа 2015 в 13:41

    Сергей

    Добрый день. Совсем глупый вопрос. Как запустить уже собранный проэкт?

    • 04 августа 2015 в 19:34

      Сергей

      Вышел с положения присоединив плагин maven-assembly-plugin. Но интересно как Вы предполагали запускать. В статье ничего не написано

  • 20 августа 2015 в 11:35

    SkunS

    Исправьте 15-ю строку файла hibernate.cfg.xml.
    Вместо:
    На:

  • 03 октября 2015 в 22:00

    Айдын

    Спасибо за статьи. Они у вас лучше написаны, чем у mkyong

    • 10 декабря 2015 в 09:43

      David

      Добрый день. Скажите а работать с Hibernate в Spring Boot можно?

  • 26 мая 2016 в 11:30

    Александр

    Народ, я пробую достать данних с БД но получаю «null». МОжет ктото столкнулся с етим?

  • 25 августа 2016 в 18:18

    Vadim

    Привет, спасибо за урок
    в прикрепленном сайте туториал подключения MySQL,не понимаю как сделать шаг Create New JDBC Connection Pool в intellij. В netbeans все получилось. Александр, поможете разобраться