Модель
В этой и следующих двух главах мы будем разрабатывать простейший сайт для работы со списком задач.

Исходники этого проекта можно скачать здесь.
Структура данных
Мы работаем с SQL базой данных. Это означает, что все данные, которые мы будем использовать, должны храниться в табличном виде.
Для начала определимся с полями объекта задачи, а потом свяжем её с базой данных. Для этого
создадим пакет entities (сущности) и в нём создадим класс Tasks

У любой записи в табличных БД должен быть уникальный идентификатор, чаще всего - это просто уникальное целое число. Его тоже необходимо добавить в список полей нашего класса.
- Task.java
package com.example.demo.entities;
/**
* Класс задачи
*/
public class Tasks {
/**
* Id
*/
private Integer id;
/**
* Заголовок
*/
private String title;
/**
* Автор
*/
private String author;
/**
* Текст
*/
private String text;
/**
* Конструктор по умолчанию
*/
public Task() {
}
/**
* Получить id
* @return id
*/
public Integer getId() {
return id;
}
/**
* Получить заголовок
* @return заголовок
*/
public String getTitle() {
return title;
}
/**
* Получить автора
* @return автор
*/
public String getAuthor() {
return author;
}
/**
* Получить текст
* @return текст
*/
public String getText() {
return text;
}
/**
* Задать id
* @param id id
*/
public void setId(Integer id) {
this.id = id;
}
/**
* Задать заголовок
* @param title заголовок
*/
public void setTitle(String title) {
this.title = title;
}
/**
* Задать автора
* @param author автор
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* Задать текст
* @param text текст
*/
public void setText(String text) {
this.text = text;
}
}
Довольно значительная часть кода тривиальна и предсказуема. Чтобы не писать геттеры и сеттеры,
достаточно дописать аннотацию @Data при объявлении класса. А чтобы не создавать конструктор
по умолчанию добавляется аннотация @NoArgsConstructor.
- Task.java
package com.example.demo.entities;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Класс задачи
*/
@Data
@NoArgsConstructor
public class Tasks {
/**
* Id
*/
private Integer id;
/**
* Заголовок
*/
private String title;
/**
* Автор
*/
private String author;
/**
* Текст
*/
private String text;
}
Так получается гораздо компактнее. Конструктор по умолчанию при помощи lombok мы создаём для того, чтобы
работала база данных.
Idea
Чтобы работать с базой данных для начало необходимо настроить подключение к ней. Для этого откройте
вкладку Database.

В развернувшемся окне нажмите на +.

В раскрывшемся меню выберите Data Source->PostgreSQL

Если у вас ещё не установлен драйвер для работы с PostgreSQL, то система в левом
нижнем углу выведет сообщение об этом. Просто нажмите на кнопку Download

Дождитесь, пока все драйвер скачается и установится

Заполните теперь данные подключения, указанные в настройках PostgreSQL ресурса в Heroku.
И нажмите на кнопку Test Connection

Дождитесь окончания проверки
Если данные введены верно, вы увидите сообщение в таком духе

Дождёмся загрузки базы данных

И развернём её дерево

Таблица
Теперь нам необходимо создать саму таблицу для хранения данных.
Все таблицы лежат в папке public. Чтобы создать новую таблицу, кликните
по папке public правой кнопкой мыши и в контекстном меню выберите New->Table.
Возможно, вам придётся сначала открыть папку schemas, уже в ней будет папка public

Сначала укажите название таблицы tasks_table

Теперь нажмите на +, появится новое поле. Дадим ему название id и укажем тип int.

Т.к. id - это основной способ поиска записей, то мы должны у этого поля поставить
галочки Primary Key (основной ключ, основная колонка), Not null - не может быть равен null,
Unique - уникальный и Auto Inc - автоматически увеличивающийся.
Теперь добавим текстовую колонку title

Добавим оставшиеся два поля и нажмём Execute

Дождёмся теперь, пока обработается наш запрос на изменение базы данных
Теперь в список таблиц добавилась созданная нами

Если два раза кликнуть по таблице, то откроется окно её просмотра. Пока что записей нет, поэтому и таблица пустая

Persistence
В java есть готовая библиотека, которая качественно упрощает работу с базами данных.
Она называется javax.persistence.
Чтобы показать, что рассматриваемый нами класс должен храниться в БД, используется
аннотация @Entity, чтобы он хранился в определённой таблице,
необходимо использовать аннотацию @Table.
Также необходимо указать, что поле id - не просто поле, а id именно в смысле баз данных @Id.
Чтобы id генерировался автоматически, нужна аннотация @GeneratedValue
- Tasks.java
package com.example.demo.entities;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
/**
* Класс задачи
*/
@Entity
@Table(name = "tasks_table")
@Data
@NoArgsConstructor
public class Task {
/**
* Id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* Заголовок
*/
private String title;
/**
* Автор
*/
private String author;
/**
* Текст
*/
private String text;
}
Запустим сервер, чтобы убедиться, что всё работает корректно.
