spring boot приложение с postgresql

Spring Boot — пример с Postgres и JPA

REST JPA Main

В данной статье речь пойдет о фреймворке Spring, а точнее о Spring Boot. Я покажу, как быстро в считанные минуты запустить простое приложение и подключить к нему базу данных postgresql. Мы сделаем пару примеров на простые операции с базой данных.

Для того, чтобы не терять времени и говорить на одном языке я предполагаю, что читатель уже знаком с таким понятием как Spring, знает, что такое JPA, Hibernate и что такое Maven. Если все это для Вас ново — предлагаю для ознакомления статьи в порядке важности: Spring MVC первое веб приложение — о спринг фреймворке и архитектурах веб приложения; Spring Boot простое приложение — о спринг бут кратко, но понятно; Что такое hibernate — о работе с базами данных.

Для создания приложения и подключения всех необходимых зависимостей воспользуемся инструментом SPRING INITIALIZR — это просто сайт, где Вы можете выбрать все необходимые зависимости для приложения и система выдаст готовое приложение доступное для скачивания.

Для начала нужно перейти на сайт https://start.spring.io/ ввести group и artifact своего приложения. Идентично тому, как мы вводим groupId и artifactId когда создаем Maven приложение. Далее в строке Search for dependencies нужно ввести зависимости, которые нужно добавить в приложение. После этого нажимаем большую кнопку Generate project и должна начаться загрузка архива с приложением:

spring initializr

Для тех, кому привычнее создавать приложения в обычной манере — можно не пользоваться этим инструментом. Главное создать простое Spring Boot приложение и подключить к нему зависимости для Postgresql, JPA, WEB. Скачанный архив нужно распаковать в удобную папку и открыть приложение с помощью любимой идее. На этот раз я буду пользоваться intellij idea. Как я неоднократно упоминал — выбор инструмента программирования не имеет значения. Главное, чтобы Вам было удобно.

И так, приложение создано и открыто.

application structure

На рисунке выше — структура моего приложения. В нем создан только один класс, который является точкой входа в приложение. Его код ни чем не примечательный и таковым и останется.

import org.springframework.boot.SpringApplication ;
import org.springframework.boot.autoconfigure.SpringBootApplication ;

@SpringBootApplication
public class SpringjpapostgresApplication <

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» >
> 4.0.0 >

> springjpapostgres >
> Demo project for Spring Boot >

Теперь пришло время настроить нашу Postgresql базу данных. Я создам простую базу данных, которую назову usersmanagement. В ней будет две таблицы: users и address. У нас будет очень таки стандартная предметная область: управление пользователями. Пользователи будут иметь некоторые атрибуты и адрес.

create database usersmanagement ;

Теперь нужно создать в нашем приложении файл настроек доступа к базе данных. В Spring Boot это делается очень просто: нужно в папке проекта найти директорию resources. В ней должен быть файл application.properties. Если его нет — нужно создать:

application.properties path

Теперь, в данном файле нужно указать путь к базе, имя пользователя и пароль:

Далее пропишем классы сущностей базы данных. Для этого создадим пакет entity и поместим в него два класса: Address иUsers.

@ Entity
@Table ( name = «address» )
public class Address <

@Id
@GeneratedValue ( strategy = GenerationType. IDENTITY )
private Long id ;

@Column
private String city ;

@Column
private String street ;

@Column ( name = «home_number» )
private String homeNumber ;

//getters and setters
>

@ Entity
@Table ( name = «users» )
public class Users <

@Id
@GeneratedValue ( strategy = GenerationType. IDENTITY )
private Long id ;

@Column
private String name ;

@Column
private String email ;

>
//getters and setters

Теперь пришло время воспользоваться Spring JPA и написать методы доступа к базе данных. Для того, чтобы воспользоваться нужно создать свой интерфейс и унаследовать его от готового интерфейса JpaRepository где T — это сущность для доступа к которой будут использоваться методы, а ID — тип первичного ключа. На примере станет яснее.

Создадим сперва пакет и дадим ему имя repository. В нем будем создавать наши интерфейсы для доступа к сущностям в базе данных. В него поместим интерфейс UsersRepository и AddressRepository. Далее проделаем над интерфейсами процедуру описанную выше и получаем код который ниже.

import com.javamaster.springjpapostgres.entity.Address ;
import org.springframework.data.jpa.repository.JpaRepository ;

public interface AddressRepository extends JpaRepository Address, Long > <
>

import com.javamaster.springjpapostgres.entity.Users ;
import org.springframework.data.jpa.repository.JpaRepository ;

public interface UsersRepository extends JpaRepository Users, Long > <
>

Когда мы унаследовались от JpaRepository нам стали доступны стандартные методы над сущностью: сохранение, удаление, получение всех, получение по айди. В этих интерфейсах мы можем написать свои методы доступа к сущности: например получить по определенному полю или полям. Здесь также есть возможность написать собственный запрос на SQL.

Сейчас на примере попытаюсь показать большинство возможностей.

import com.javamaster.springjpapostgres.entity.Users ;
import org.springframework.data.jpa.repository.JpaRepository ;
import org.springframework.data.jpa.repository.Query ;

public interface UsersRepository extends JpaRepository Users, Long > <

List Users > findAllByName ( String name ) ; //просто правильное название метода даст возможность
//избежать запросов на SQL

@Query ( «select u from Users u where u.email like ‘%@gmail.com%'» ) //если этого мало можно написать
//собственный запрос на языке похожем на SQL
List Users > findWhereEmailIsGmail ( ) ;

Код и комментарии говорят сами за себя. Пример выше приведен только в качестве демонстрации широких возможностей Sping JPA. Давайте теперь попробуем воспользоваться нашими методами и напишем слой сервисов в нашем приложении.

Для этого создадим пакет serivce и поместим в него классы UsersService, AddressService.

import com.javamaster.springjpapostgres.entity.Address ;
import com.javamaster.springjpapostgres.repository.AddressRepository ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;

@Service
public class AddressService <

@Autowired
private final AddressRepository addressRepository ;

public void createAddress ( Address address ) <
addressRepository. save ( address ) ;
>
//далее уже допишите сами)
>

import com.javamaster.springjpapostgres.entity.Users ;
import com.javamaster.springjpapostgres.repository.UsersRepository ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;

@Service
public class UserService <

@Autowired
private final UsersRepository usersRepository ;

public void createUsers ( Users users ) <
usersRepository. save ( users ) ;
>

public List Users > findAll ( ) <
return usersRepository. findAll ( ) ;
>

public List Users > findAllByName ( String name ) <
return usersRepository. findAllByName ( name ) ;
>

public List Users > findWhereEmailIsGmail ( ) <
return usersRepository. findWhereEmailIsGmail ( ) ;
>

public List Users > findWhereNameStartsFromSmith ( ) <
return usersRepository. findWhereNameStartsFromSmith ( ) ;
>
>

Как уже было сказано: стандартные методы работы над сущностью доступны из под коробки. Разработчику нужно только достать их и использовать в своем сервисе.

Для тестирования наших методов работы с базой данных я написал простой метод, который вызывается при запуске Spring Boot приложения. Добавил я его в свой главный класс запуска приложения. Вот как теперь выглядит класс SpringjpapostgresApplication:

import com.javamaster.springjpapostgres.entity.Address ;
import com.javamaster.springjpapostgres.entity.Users ;
import com.javamaster.springjpapostgres.service.AddressService ;
import com.javamaster.springjpapostgres.service.UserService ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.boot.SpringApplication ;
import org.springframework.boot.autoconfigure.SpringBootApplication ;
import org.springframework.boot.context.event.ApplicationReadyEvent ;
import org.springframework.context.event.EventListener ;

@SpringBootApplication
public class SpringjpapostgresApplication <

@Autowired
private UserService userService ;

@ EventListener ( ApplicationReadyEvent. class )
private void testJpaMethods ( ) <
Address address = new Address ( ) ;
address. setCity ( «Kiev» ) ;
address. setHomeNumber ( «4» ) ;
address. setStreet ( «Main Street» ) ;
Address address1 = new Address ( ) ;
address1. setCity ( «Lviv» ) ;
Users users = new Users ( ) ;
users. setAddress ( address ) ;
users. setEmail ( «someEmail@gmail.com» ) ;
users. setName ( «Smith» ) ;
userService. createUsers ( users ) ;
Users users1 = new Users ( ) ;
users1. setName ( «Jon Dorian» ) ;
users1. setEmail ( «gmailEmail@gmail.com» ) ;
users1. setAddress ( address1 ) ;
userService. createUsers ( users1 ) ;

Результат вывода в консоль:

Если Вы следовали вышеописанным пунктам, то должны при запуске получить ошибку:

org.hibernate.LazyInitializationException: could not initialize proxy [com.javamaster.springjpapostgres.entity.Address#8] — no Session. Это очень распространенная ошибка особенно среди новичков. Так как мы в наших сущностях указали FetchType.LAZY это будет означать, что Адрес не будет автоматически доставаться из базы при выборе Пользователя. С точки зрения производительности — это очень хорошая практика. Старайтесь избегать FetchType.EAGER в реальный проектах, если хотите сократить количество запросов в базу данных. Для того, чтобы избежать вышеописанной ошибки нужно над методами сервисов добавить аннотацию @Transactional. Это должно решить проблему. Мне было лень добавлять эту аннотацию, поэтому я изменил FetchType.LAZY на FetchType.EAGER в сущность Users.

@ Entity
@Table ( name = «users» )
public class Users <

@Id
@GeneratedValue ( strategy = GenerationType. IDENTITY )
private Long id ;

@Column
private String name ;

@Column
private String email ;

public Long getId ( ) <
return id ;
>

public String getName ( ) <
return name ;
>

public String getEmail ( ) <
return email ;
>

public Address getAddress ( ) <
return address ;
>

@Override
public String toString ( ) <
return «Users <" +
«id=» + id +
«, name='» + name + ‘ \’ ‘ +
«, email='» + email + ‘ \’ ‘ +
«, address=» + address +
‘>’ ;
>
>

Теперь все должно работать.

Я не зря выбрал для данного примера модули для веб приложения. В следующий раз постараюсь показать REST API, а сервисы послужат нам хорошим примером.

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

Ссылка на менторство по java. Подразумевает создание спринг веб приложения с нуля.

Источник

Запуск Spring Boot с PostgreSQL в Docker Compose

Быстрое и практичное руководство по запуску Spring boot с PostgreSQL в Docker Compose.

1. Введение

2. Создание проекта «Весенняя загрузка»

Приложение выходит из строя, поскольку не может подключиться к базе данных:

3. DockerFile

Здесь мы сначала очищаем наши предыдущие сборки перед упаковкой приложения. Кроме того, мы пропускаем тесты, потому что они терпят неудачу без PostgreSQL.

Давайте делать новые src/main/docker каталог. После этого мы копим приложение JAR файл там:

Наконец, мы создаем эту DockerFile в том же каталоге:

4. Docker Compose файл

Название нашего приложения – приложение. Это первый из двух сервисов (линии 4-15):

База данных PostgreSQL имеет название DB и является вторым сервисным (линии 17-22):

5. Запуск с Docker Compose

Давайте забудем наше приложение Весенняя загрузка и PostgreSQL с Docker Compose :

Во-первых, это позволит создать Docker Image для нашего приложения Spring Boot. Далее, он запустит контейнер PostgreSQL. Наконец, он запустит наше приложение Docker изображения. На этот раз наше приложение работает нормально:

Как мы видим, Spring Data не нашла интерфейса репозитория. Это правильно – мы еще не создали!

Если мы хотим, чтобы остановить все контейнеры, мы должны нажать на “Ctrl-C” в первую очередь. Тогда мы можем остановить Docker Compose:

6. Создание сущности клиента и репозитория

Чтобы использовать базу данных PostgreSQL в нашем приложении, Мы создадим простую клиентскую сущность :

Теперь, мы можем написать интерфейс репозитория для этой сущности :

Наконец, мы будем использовать эти методы в нашем приложении:

7. Запуск с докером Сочинять снова

Чтобы запустить обновленное приложение Spring Boot, нам нужно восстановить его первый. Поэтому мы выполняем эти команды еще раз в корневом каталоге проекта:

Таким образом, после остановки наших контейнеров, мы удаляем приложение Docker изображения. Затем мы снова запускаем файл Docker Compose, который восстанавливает изображение приложения.

Вот выход приложения:

Spring Boot находит наш пустой репозиторий клиентов. Таким образом, мы начинаем без клиента, но затем успешно создать один.

8. Заключение

В этом коротком учебнике мы начали с создания приложения Spring Boot для PostgreSQL. Затем мы написали файл Docker Compose для запуска контейнера с приложением с контейнером PostgreSQL.

Наконец, мы создали объект клиента и репозиторий, что позволило нам сохранить клиента в PostgreSQL.

Источник

Spring Boot PostgreSQL

last modified July 6, 2020

Spring Boot PostgreSQL tutorial shows how to use PostgreSQL database in a Spring Boot application.

is a popular Java application framework for creating enterprise applications. is an evolution of Spring framework which helps create stand-alone, production-grade Spring based applications with minimal effort.

PostgreSQL

is a powerful, open source object-relational database system. It is a multi-user database management system. It runs on multiple platforms including Linux, FreeBSD, Solaris, Microsoft Windows, and Mac OS X. PostgreSQL is developed by the PostgreSQL Global Development Group.

PostgreSQL setup

We are going to show how to install PostgreSQL database on a Debian Linux system.

This command installs PostgreSQL server and related packages.

We check the status of the database with postgresql status command.

We create a new database user.

We edit the pg_hba.conf file.

We restart PostgreSQL to enable the changes.

Now we can use the psql tool to connect to the database.

Spring Boot PostgreSQL example

The following application is a simple Spring Boot web application, which uses PostgreSQL database. We have a home page with a link to display data from a database table. We use Thymeleaf templating system to join data with HTML.

This is the project structure.

Spring Boot starters are a set of convenient dependency descriptors which greatly simplify Maven configuration. The spring-boot-starter-parent has some common configurations for a Spring Boot application. The spring-boot-starter-web is a starter for building web, including RESTful, applications using Spring MVC. It uses Tomcat as the default embedded container. The spring-boot-starter-thymeleaf is a starter for building MVC web applications using Thymeleaf views. The spring-boot-starter-data-jpa is a starter for using Spring Data JPA with Hibernate.

The postgresql dependency is for the PostgreSQL database driver.

The spring-boot-maven-plugin provides Spring Boot support in Maven, allowing us to package executable JAR or WAR archives. Its spring-boot:run goal runs the Spring Boot application.

In the application.properties file we write various configuration settings of a Spring Boot application.

In the spring datasource properties we set up the PostgreSQL datasource.

The spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation option is set avoid a recent issue. Without this option, we get the following error:

The @Entity annotation specifies that the class is an entity and is mapped to a database table. The @Table annotation specifies the name of the database table to be used for mapping.

The @Id annotation specifies the primary key of an entity and the @GeneratedValue provides for the specification of generation strategies for the values of primary keys.

When the application is started, the schema-postgres.sql script is executed provided that the automatic schema creation is turned off. The script creates a new database table.

Later, the data-postgres.sql file is executed to fill the table with data.

ICityService provides a contract method to get all cities from the data source.

CityService contains the implementation of the findAll() method. We use the repository to retrieve data from the database.

CityRepository is injected.

The findAll() method of the repository returns the list of cities.

MyController contains one mapping.

We inject a ICityService into the countryService field.

We map a request with the showCities path to the controller’s findCities() method. The default request is a GET request. The model gains a list of cities and the processing is sent to the showCities.html Thymeleaf template file.

In the showCities.html template file, we display the data in an HTML table.

In the index.html there is a link to show all cities.

The Application sets up the Spring Boot application. The @SpringBootApplication enables auto-configuration and component scanning.

In this tutorial, we have showed how to use PostgreSQL database in a Spring Boot application. You might also be interested in the related tutorials:

Источник

Spring Boot + PostgreSQL + JS в Doсker

В этой статье покажу, как поднять в Docker-контейнере приложение, состоящее из трех частей:

Приложение можно скачать тут.

Оно состоит из одного контроллера и одного html и js-файла, позволяющего выводить и добавлять животных. Животные хранятся в базе.

progaКак выглядит приложение

Установка Docker

Чтобы развернуть приложение в Docker, для начала нужно установить Docker на компьютер. В Window 7 это проблематично, в Windows 10 и других ОС вполне возможно.

Чтобы убедиться, что Docker установлен, выполните из командной строки:

Будет выведена версия Docker.

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

PostreSQL в контейнере

Одна из причин, почему Java-разработчику полезен Docker, это то, что можно не устанавливать различное дополнительное ПО. Например, базы данных различных версий. Ведь потом их придется удалять, остаются артефакты. Все это нежелательно, да и долго. С Docker проще.Например, чтобы испытать работу приложения с базой данных PostgreSQL 12 версии, можно не устанавливать ее на компьютер, а поднять в Docker-контейнере.

Для этого из командной строки запустим контейнер с базой:

Теперь с базой можно соединиться по такому url:

postgres connectВкладка Databases в Intellij Idea Ultimate

Разберем строку выше. Она поднимает контейнер из образа PostgreSQL:

Параметры команды

postgres:12-alpine — это имя образа. Готовые образы лежат на Docker Hub, там есть разные версии базы. При запуске контейнера образ сначала загружается оттуда, если его нет на компьютере локально.

—name some-postgres — задает имя контейнера. Все контейнеры, которые есть локально, можно просмотреть с помощью команды docker ps —all.

db-data — название volume, то есть того места на нашем диске, где реально будет храниться база из контейнера. Если не задавать volume, то при каждом новом запуске контейнера будет создаваться новый volume, и данные в базе для нас окажутся как бы не сохраненные. А с volume они будут сохраняться. Через двоеточие указан путь внутри контейнера, которому соответствует volume.

-p 5434:5432 — указан порт на локальной машине 5434, которому соответствует порт внутри контейнера 5432. То есть выставляем наружу порт контейнера 5432, чтобы присоединяться к базе снаружи через порт нашего локального компьютера 5434 (выбран другой порт (не 5432) чтобы не было конфликтов с локально установленной базой, если она есть).

Таким образом, мы соединились с базой со вкладки Databases редактора Intellij Idea. Так же можно соединяться и из приложения, не устанавливая базу на компьютер, а запуская любую ее версию в контейнере.

Файл docker-compose.yml

Обычно приложение состоит из нескольких компонентов, которые зависят друг от друга, но могут быть запущены изолированно на разных машинах. Например, Spring Boot приложение, предоставляющее REST API, PostgreSQL и фронтэнд на сервере Nginx. Наш пример именно такой. Для такой связки удобно применить docker-compose — это и команда, и файл.

Файл docker-compose.yml представлен ниже:

services — ключевое слово, под ним перечислены папки, в которых лежат три части нашего проекта: app, js, postgres.

folder structuredocker-compose.yml со структурой папок

docker-compose.yml лежит в корне иерархии рядом с папкой services, в которой перечислены сервисы — то есть компоненты, из который состоит наш проект.

Сервис Postgres: база данных PostgreSQL

Мы уже запускали postgres-контейнер из командной строки. Теперь все параметры вынесены из командной строки в файл docker-compose.yml — переменные среды, volume, порты. Копирую фрагмент этого файла:

Кстати, volume с именем db-data создается отдельной строкой в конце файла:

Обратите внимание, что каждого сервиса указан Dockerfile (файл для сборки образа):

для Postgres он лежит в папке services/postgres (см. скриншот выше). Его содержимое предельно кратко:

Строка выше означает, что мы просто берем готовый образ postgres:12-alpine и ничего к нему не добавляем.

Кстати, порты, указанные в docker-compose.yml:

можно и не выставлять, ведь к базе будем подключаться не мы с localhost, а Spring Boot из соседнего контейнера. А запись выше именно для доступа с локальной машины.

Другие образы будут чуть сложнее.

Сервис App: Spring Boot приложение

Скопирую фрагмент из docker-compose.yml, касающийся приложения Spring Boot:

Рассмотрим, из чего он состоит.

Порты

Порты указаны так же, как в сервисе postgres, только теперь на указанном порту запущен не сервер базы данных, а http-сервер. Порту 8091 контейнера соответствует порт 8091 нашего компьютера.

Зависимость

Тут сказано, что наш сервис зависит от сервиса postgres — это означает, что сначала запускается сервис postgres, а потом сервис app.

Имя образа

image: ‘my-java-app’ дает название образу.

Переменные среды

В environment перечислены переменные среды, к которым наше Spring Boot приложение имеет доступ. Мы их прописываем в application.yml приложения таким образом (через двоеточие стоит значение по умолчанию, которое используется в случае, если переменной окружения нет; у меня это просто значения для локального запуска без контейнера):

Доступ из одного контейнера в другой

Обратите внимание, что доступ из одного контейнера к другому происходит по имени сервиса. То есть к базе данных мы обращаемся не по localhost, а по postgres:

Это значение мы указывали выше в docker-compose.yml в переменной среды SPRING_DATASOURCE_URL.

Dockerfile.development

Сервис app использует такой докер-файл:

Тут мы собираем образ на основе готового образа openjdk, задаем рабочую папку и копируем в нее наше приложение docker-demo-0.0.1-SNAPSHOT.jar (оно лежит рядом docker-файлом см. структуру папок выше — надо его сюда скопировать) под именем app.jar. А затем запускаем приложение с помощью команды:

Наконец, рассмотрим последний компонент.

Сервис JS: JavaScript приложение

Тут все аналогично, только заданы другие порты и другое имя образа:

Dockerfile.development

Докер-файл у сервиса js такой:

То есть мы собираем образ на основе готового образа nginx:alpine. Затем копируем в папку сервера Nginx /usr/share/nginx/html файлы из папки dist (лежит рядом с докер-файлом, содержит html и js-файлы).

Как всё запустить: команда docker-compose

Наконец, из папки с файлом docker-compose.yml надо выполнить команду:

Команда выше и построит образы, и запустит на их основе контейнеры.

Теперь в браузере по адресу

будет доступно наше приложение.

Чтобы остановить и удалить контейнеры, выполним команду:

Если нужно удалить и volume с данными, делаем так:

Если вы сохраняли каких-то животных в приложении, то после этой команды при следующем запуске приложения их не будет.

Spring Boot + PostgreSQL + JS в Doсker: 2 комментария

Спасибо, то что надо!
Очень доступно и без ерунды.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • spring boot приложение пример
  • spring boot запуск приложения