JavaRush /Курси /Модуль 4: FastAPI /Основи ORM (Object-Relational Mapping) та Hibernate

Основи ORM (Object-Relational Mapping) та Hibernate

Модуль 4: FastAPI
Рівень 6 , Лекція 0
Відкрита

Ласкаво просимо у захопливу подорож світом просунутої веб-розробки.

Сьогодні ми почнемо з основ ORM — важливого інструмента, який зв'язує наш код із реальною базою даних.

А Hibernate стане нашим провідником у цьому світі. Заварюй чай (або каву), і поїхали!

Отже, що ж означає ця загадкова абревіатура – ORM?

Нічого складного. Це — Object-Relational Mapping, або об'єктно-реляційне відображення — місток, що з'єднує світ об'єктів Java з реляційними базами даних.

Простіше кажучи, ORM дозволяє працювати з базою даних через Java-об'єкти, а не через сирі SQL-запити.

Навіщо нам це треба?

Уяви ситуацію: у тебе є таблиця бази даних з користувачами — users.

Працюючи напряму з SQL, доведеться писати щось на кшталт цього, щоб отримати всіх користувачів старше 30 років:


SELECT * FROM users WHERE age > 30;

З ORM це виглядає більш охайно й читабельно:


List
  
    users = session.createQuery("from User u where u.age > 30", User.class).getResultList(); 
  

І ось — магія! Замість того, щоб самому розбиратися в тонкощах SQL, ти працюєш зі звичними Java-об'єктами.

ORM робить за тебе всю важку роботу з перетворення запитів у SQL і назад.

Плюси ORM

  • Менше коду: ORM автоматично генерує SQL-запити.
  • Читабельність: ми пишемо логіку на знайомій мові Java.
  • Крос-база: одного разу написаний код можна легко перенести з PostgreSQL на SQLite або MySQL (у більшості випадків).

Мінуси ORM

  • Продуктивність: ORM додає невелику накладну витрату, оскільки формує SQL-запити за тебе.
  • Вивчення: доведеться освоїти синтаксис ORM (в нашому випадку Hibernate).
  • Магія: іноді ORM поводиться "нелогічно", і доводиться розбиратися в її внутрішностях.

Знайомство з Hibernate

Hibernate — це одна з найпопулярніших ORM для Java.

У неї багата історія, величезна гнучкість і купа прихильників.

Окрім ORM, Hibernate також дає можливість працювати ближче до SQL через native SQL або Criteria API (для тих, хто хоче писати більш контрольований код).

Hibernate можна розглядати з двох сторін:

  1. Низькорівневий доступ: робота з native SQL або Criteria API, коли ти хочеш повністю контролювати запити.
  2. ORM (через JPA або власний API): високорівневий підхід, що дозволяє працювати з базою через Java-об'єкти.

Сьогодні ми зосередимося на ORM, бо воно робить життя простішим... ну, зазвичай.

Якщо ти вже працював з Django ORM або іншими ORM, то помітиш схожість і відмінності.

Hibernate більш гнучкий і потужний, але іноді потребує трохи більше налаштувань.

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


Приклади використання ORM

Давай подивимось, як ORM працює на практиці. Для прикладу оперуватимемо базою даних користувачів.

Уявімо базу даних.

У нас є таблиця users:

id name age
1 Ivan 25
2 Maria 30
3 Alex 35

У SQL ти б написав запит:


SELECT * FROM users WHERE age > 30;

В ORM ти працюєш з класами. Наприклад, створимо клас User, що відповідає таблиці users:


import javax.persistence.*;

@Entity
@Table(name = "users")  // Ім'я таблиці в базі даних
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Первинний ключ
    private Integer id;
    private String name;
    private Integer age;

    // Геттери і сеттери або можна використати Lombok для скорочення коду
}

Тепер виконання запиту стає простішим:


List<User> users = session.createQuery("from User u where u.age > 30", User.class).getResultList();

Так просто!

Преобразування даних: об'єкти <-> рядки

Коли ти створюєш нового користувача в Java-коді:


User newUser = new User();
newUser.setName("John");
newUser.setAge(40);
session.save(newUser);

Hibernate бере твої дані і перетворює їх у SQL-запит:


INSERT INTO users (name, age) VALUES ('John', 40);

А коли ти робиш запит, наприклад отримуєш всіх користувачів, ORM перетворює рядки з бази у зручні Java-об'єкти:


List<User> users = session.createQuery("from User", User.class).getResultList();
for (User user : users) {
    System.out.println(user.getName() + " " + user.getAge());
}

Реальні випадки використання ORM

У житті ORM рятує від потреби "плавати" в SQL. Наприклад, уяви, що потрібно виконати кілька складних операцій над даними, таких як вкладені фільтри або сортування. Hibernate дозволяє робити це в Java-стилі:


List<User> users = session.createQuery("from User u where u.age > 20 order by u.name", User.class).getResultList();

Тут ORM автоматично перетворює твій код у SQL-запит і повертає результат, який можна відразу використовувати.


Підсумок

Сьогодні ми познайомилися з ORM як концепцією і з Hibernate як її реалізацією.

Тепер у нас є можливість писати чистий, підтримуваний код для роботи з базами даних, не тонути в нескінченних рядках SQL.

На наступній лекції ми встановимо Hibernate і почнемо налаштовувати його для нашого застосунку.

Тож вже зараз можеш підготувати базу даних — будемо експериментувати!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ