Ласкаво просимо у захопливу подорож світом просунутої веб-розробки.
Сьогодні ми почнемо з основ 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 можна розглядати з двох сторін:
- Низькорівневий доступ: робота з native SQL або Criteria API, коли ти хочеш повністю контролювати запити.
- 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 і почнемо налаштовувати його для нашого застосунку.
Тож вже зараз можеш підготувати базу даних — будемо експериментувати!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ