JavaRush /Java блог /Random UA /Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot. ...
Artur
40 рівень
Tallinn

Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot. Частина 1

Стаття з групи Random UA
Почну з того, що мені дуже сподобався цикл статей від Еллеонори Керрі під назвою "Огляд REST". Ось посилання на ці статті: Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 1Загалом, я вирішив взяти на себе сміливість і трохи доповнити їх. А саме, розповісти як створити базу даних та підключити її до цієї програми. З чого почати? Напевно, з самої бази даних. Я вирішив використовувати PostgreSQL , тому що мені сподобався дружній інтерфейс її адмінки. Для початку нам потрібно завантажити установник PostgreSQL, наприклад, звідси: PostgreSQL Database Download Повний процес установки я описувати не буду, т.к. він може відрізнятися залежно від ОС. Однак зазначу, що в процесі вам потрібно придумати пароль адміністратора для дефолтної ролі (облікового запису) postgres і ввести його двічі. Для простоти я встановив пароль 123 . Звичайно, в реальних проектах необхідно вигадати щось складніше. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 2Далі програма установки пропонує вибрати порт, я залишив його значення за промовчанням. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 3Locale також залишив за замовчуванням. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 4Встановабо, далі відкриваємо інтерфейс адміністратора pgAdmin . Відкриється браузер з віконцем, де нас попросять ввести створений раніше пароль. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 5Тепер нам потрібно встановити мову інтерфейсу. Для цього натискаємо Configure pgAdmin -> Miscellaneous -> User Language , вибираємо потрібну мову -> Save , і перезавантажуємо сторінку браузера . Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 6У верхньому лівому куті сторінки натискаємо Server , з'являється віконце « Підключитися до сервера ». Вводимо пароль ще раз і ставимо галку Save Password, щоб не вводити його щоразу. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 7Можна було б і надалі використовувати роль адміністратора для всіх баз даних, але краще створимо нову роль, адже у нас може бути багато баз даних та багато програм, які їх використовують. Для цього у лівому верхньому куті тиснемо на PostgreSQL 12 --> ПКМ на Ролі входу/групи --> Створити --> Роль входу/групи Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 8 У спливаючому вікні на вкладці « Загальні » вписуємо ім'я ролі. Я назвав роль root . Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 9На вкладці « Визначення » створюємо новий пароль, я залишив 123 просто щоб не заплутатися. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 10Переходимо на вкладку « Права » та відзначаємо всі необхідні пункти. Я встановив усі пункти « ТАК». Натискаємо " Зберегти " Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 11Переходимо до створення бази даних. Тиснемо ПКМ на "Бази даних" --> Створити --> База даних Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 12 На вкладці " Загальні " створюємо назву бази даних. Нехай це буде, наприклад, customers . Власником призначаємо root , якого ми створабо на попередньому етапі. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 13На вкладці " Визначення " перевіряємо, що у нас встановлено кодування UTF8 . Натискаємо « Зберегти ». Все, наша база даних створена (поки що пуста). Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 14У цьому можна було б закінчити з pgAdmin, т.к. таблиці ми створюватимемо програмно, але, про всяк випадок, покажу як створити таблицю вручну. Розгортаємо деревоcustomers --> Схеми --> public . Тиснемо ПКМ Таблиці --> Створити --> Таблиця . Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 15Відкриється спливаюче вікно. На вкладці " Загальні " призначаємо ім'я нашої таблиці, наприклад test_table , власником призначаємо root . Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 16Переходимо на вкладку " Стовпці ", натискаємо на " + " для створення нового стовпця. Вводимо ім'я “ id ” і тип даних bigserial , що еквівалентно типу Long в Java, але з авто-інкрементом (при додаванні нового запису, id автоматично збільшуватиметься на одиницю). Не NULL відзначаємо як « Так», первинний ключ теж « Так ». Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 17Створюємо так само стовпці ” name ”, “ email ” і ” phone ”. Тип даних вибираємо character varying це відповідає типу String , але дозволяє задати максимальну довжину. Задаємо максимальну довжину імені в 200 символів для заповнення П.І.Б. в одному стовпці. Задаємо максимальну довжину email у 254 символи. Чому у email така максимальна довжина можна дізнатися тут . Для телефонного номера виділяємо 20 символів, цього має вистачити. Трохи про телефонні номери:Помилки програмістів про телефонні номери (Хабр) Не NULL у всіх стовпцях відзначаємо як « Так », якщо хочемо, щоб ці дані були обов'язковими. Натискаємо « Зберегти ». Все, таблиця створена. Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 18Для видалення тестової таблиці натисніть ПКМ по ній (у дереві) і « видалити », т.к. вона нам більше не потрібна, адже ми створюватимемо таблиці з нашої програми. Закриваємо pgAdmin і переходимо до нашої програми. Відкриваємо IDEA із нашим проектом. Натискаємо Database у правому стовпці інтерфейсу, натискаємо на " + " для додавання нашої БД. Далі Data Source -> PostgreSQL . Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 19У спливаючому вікні вписуємо в полеUser роль root , яку ми створабо раніше, і наш пароль 123 у полі password . У полі Database пишемо назву нашої БД customers . Натискаємо кнопку Test Connection і якщо бачимо зелену галку під нею, то все в порядку, і натискаємо кнопку OK . Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 20Все, до БД підключабося, тепер переходимо до файлу pom.xml і додамо залежності. Для роботи з БД ORM :
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Для створення REST контролера:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
Для сервера Tomcat:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
Для PostgreSQL:
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.10</version>
</dependency>
Розібралися з pom.xml, перейдемо в папку resources, і заповнимо файл application.properties так:
spring.datasource.url=jdbc:postgresql://localhost:5432/customers
spring.datasource.username=root
spring.datasource.password=123

spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database=postgresql
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
Тут ми прописали URL нашої бази даних, повідомабо логін та пароль для неї, прописали драйвер для PostgreSQL, позначабо, що будемо використовувати тип даних PostgreSQL та прописали діалект для Hibernate. Далі створимо в тій же папці ресурсів нову директорію під назвою database . У цій директорії створимо 2 файли: initDB.sql і populateDB.sql . Перший відповідатиме за створення таблиць, другий за початкове їх заповнення. Відкриємо initDB.sql і побачимо зверху зелену смужку з написом SQL dialect is not configured . Це означає, що ми не вибрали діалект SQL для нашого проекту (а їх є кілька). Натискаємо праворуч на цій же смужці на напис Change dialect to…. У спливаючому віконці тиснемо Project SQL Dialect , і оскільки база даних у нас PostgreSQL , то вибираємо однойменний діалект. Тиснемо ОК Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot.  Частина 1 - 21 Перейдемо до заповнення наших файлів .sql . Заповнимо спочатку файл initDB.sql :
CREATE TABLE IF NOT EXISTS clients
(
    id    BIGSERIAL PRIMARY KEY ,
    name  VARCHAR(200) NOT NULL ,
    email VARCHAR(254) NOT NULL ,
    phone VARCHAR(20)  NOT NULL
);
Якщо у вас після заповнення файлу якісь слова окрім clients написані білим шрифтом, то натисніть ПКМ усередині тексту і виберіть ще раз Change Dialect --> PostgreSQL . Як ви напевно вже зрозуміли, це ті самі дані, які ми заповнювали при створенні тестової таблиці вручну. Тут вони оформлені на діалекті PostgreSQL мови SQL. Тепер заповнимо файл populateDB.sql :
INSERT INTO clients VALUES
(1, 'Vassily Petrov', 'vpetrov@jr.com', '+7 (191) 322-22-33)'),
(2, 'Pjotr Vasechkin', 'pvasechkin@jr.com', '+7 (191) 223-33-22)');
Якщо назва таблиці clients у вас написана червоними літерами, нічого страшного. Справа в тому, що ми ще не створабо цю таблицю, і IDEA її поки що не дізнається. Для того, щоб створити та заповнити таблицю, нам потрібно повернутися до файлу application.properties і додати туди три наступні рядки:
spring.datasource.initialization-mode=ALWAYS
spring.datasource.schema=classpath*:database/initDB.sql
spring.datasource.data=classpath*:database/populateDB.sql
У цих рядках ми говоримо, що хочемо ініціалізувати БД програмно і вказуємо, які файли потрібно для цього використовувати. Далі переходимо в метод main нашого додатка, і запускаємо його . Після цього йдемо в pgAdmin --> Servers --> PostgreSQL 12 --> Бази даних --> customers --> Схеми --> public , натискаємо ПКМ на " Таблиці ", " Оновити ". Якщо все пройшло успішно, то бачимо створену таблицю clients . Після цього переходимо назад у файл application.properties та закоментуємо рядок.
spring.datasource.data=classpath*:database/populateDB.sql
як показано нижче:
spring.datasource.url=jdbc:postgresql://localhost:5432/customers
spring.datasource.username=root
spring.datasource.password=123

spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database=postgresql
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect

spring.datasource.initialization-mode=ALWAYS
spring.datasource.schema=classpath*:database/initDB.sql
#spring.datasource.data=classpath*:database/populateDB.sql
Якщо ми цього не зробимо, то при наступному запуску програми отримаємо таку помилку: org.postgresql.util.PSQLException: ПОМИЛКА: значення ключа, що повторюється, порушує обмеження унікальності "clients_pkey" . Це відбувається тому, що ми вже заповнені в таблиці поля з id 1 і 2 (ще при першому запуску). У створеній нами таблиці поле id вказане як bigserial , що відповідає типу Long Java. Однак у нашій програмі для цього поля використовується тип Integer. Я вирішив показати використання Long (BIGSERIAL), тому що це більший діапазон ніж Integer. Справа в тому, що в таблицях поле, позначене як Primary Key може використовуватися не тільки для зберігання id користувачів, але і для зберігання індексів різних даних, і кількість таких записів може перевищити максимальне значення Integer. Наприклад, якщо наша програма щомиті робить якісь виміри і записує дані в таблицю. Для того, щоб переписати наші класи під використання типу Long даних, нам необхідно поміняти тип з Integer на Long у всіх класах і методах, де використовується поле id . Ми цього робити не будемо, бо спочатку програма була написана автором під тип idInteger, отже, у цьому є якийсь сенс. Щоб продовжити, ще раз видалімо створену нами таблицю clients з нашої БД, але тепер ми спробуємо зробити це програмно, а не вручну. Для цього закоментуємо наш код у файлі initDB.sql і додамо один рядок:
-- CREATE TABLE IF NOT EXISTS clients
-- (
--     id    BIGSERIAL PRIMARY KEY ,
--     name  VARCHAR(200) NOT NULL ,
--     email VARCHAR(254) NOT NULL ,
--     phone VARCHAR(20)  NOT NULL
-- );
DROP TABLE IF EXISTS clients
Запустимо програму, перейдемо в pgAdmin , натиснемо ПКМ на " Таблиці " (у нашій базі даних customers ) -> " Оновити ", і побачимо, що наша таблиця зникла. NB! Будьте обережні за допомогою цієї команди, інакше ви ризикуєте втратити всі дані, які були у вашій таблиці! Повернемося до файлу initDB.sql і перепишемо його наступним чином:
CREATE TABLE IF NOT EXISTS clients
(
    id    SERIAL PRIMARY KEY ,
    name  VARCHAR(200) NOT NULL ,
    email VARCHAR(254) NOT NULL ,
    phone VARCHAR(50)  NOT NULL
);
Тут ми змінабо тип id на SERIAL , що відповідає типу Integer , який ми використовуємо для поля id у нашій програмі. Крім того, було збільшено максимальну довжину поля phone, щоб ми могли вільно використовувати пробіли та спеціальні символи (дужки, тире та ін.) у його написанні. Максимальна кількість цифр у телефонному номері зараз становить 18 цифр (якщо мені не змінює пам'ять). Я встановив розмір 50 символів, щоб вистачило напевно. Перейдемо у файл application.properties, коментуємо рядок:
spring.datasource.data=classpath*:database/populateDB.sql
Запустимо нашу програму, зайдемо в pgAdmin, перевіримо, що наша таблиця створена, І закоментуємо цей рядок назад.
#spring.datasource.data=classpath*:database/populateDB.sql
На цьому першу частину статті мабуть закінчу. Сподіваюся, вона вам сподобається, пишіть коментарі (навіть якщо не сподобалося). У другій частині ми перепишемо наші класи, щоб вони могли працювати з реальними базами даних. Продовження: Додаємо БД PostgreSQL до RESTful сервісу на Spring Boot. Частина 2 UPD Дякуємо модераторам, що поправабо мої картинки та форматування тексту!
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ