Разное

Java postgresql пример: Работа с PostgreSQL в Java

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

В данной статье речь пойдет о фреймворке 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 Boot приложение и подключить к нему зависимости для Postgresql, JPA, WEB. Скачанный архив нужно распаковать в удобную папку и открыть приложение с помощью любимой идее. На этот раз я буду пользоваться intellij idea. Как я неоднократно упоминал — выбор инструмента программирования не имеет значения. Главное, чтобы Вам было удобно.

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

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

  1. package com.javamaster.springjpapostgres;

  2.  

  3. import org.springframework.boot.SpringApplication;

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

  5.  

  6. @SpringBootApplication

  7. public class SpringjpapostgresApplication {

  8.  

  9.     public static void main(String[] args) {
  10.         SpringApplication.run(SpringjpapostgresApplication.class, args);

  11.     }

  12. }

Файл pom.xml:

  1. <?xml version=»1.0″ encoding=»UTF-8″?>

  2. <project xmlns=»http://maven.apache.org/POM/4.0.0″ xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»

  3.   xsi:schemaLocation=»http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd»>

  4.    <modelVersion>4.0.0</modelVersion>

  5.  

  6.    <groupId>com.javamaster</groupId>

  7.    <artifactId>springjpapostgres</artifactId>

  8.    <version>0.0.1-SNAPSHOT</version>

  9.    <packaging>jar</packaging>

  10.  

  11.    <name>springjpapostgres</name>

  12.    <description>Demo project for Spring Boot</description>

  13.  

  14.    <parent>

  15.       <groupId>org.springframework.boot</groupId>

  16.       <artifactId>spring-boot-starter-parent</artifactId>

  17.       <version>2.0.3.RELEASE</version>

  18.       <relativePath/> <!— lookup parent from repository —>

  19.    </parent>

  20.  

  21.    <properties>

  22.       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  23.       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  24.       <java.version>1.8</java.version>

  25.    </properties>

  26.  

  27.    <dependencies>

  28.       <dependency>

  29.          <groupId>org.springframework.boot</groupId>

  30.          <artifactId>spring-boot-starter-data-jpa</artifactId>

  31.       </dependency>

  32.       <dependency>

  33.          <groupId>org.springframework.boot</groupId>

  34.          <artifactId>spring-boot-starter-web</artifactId>

  35.       </dependency>

  36.  

  37.  

  38.       <dependency>

  39.          <groupId>org.postgresql</groupId>

  40.          <artifactId>postgresql</artifactId>

  41.          <version>9.4-1206-jdbc42</version>

  42.       </dependency>

  43.  

  44.       <dependency>

  45.          <groupId>org.springframework.boot</groupId>

  46.          <artifactId>spring-boot-starter-test</artifactId>

  47.          <scope>test</scope>

  48.       </dependency>

  49.    </dependencies>

  50.  

  51.    <build>

  52.       <plugins>

  53.          <plugin>

  54.             <groupId>org.springframework.boot</groupId>

  55.             <artifactId>spring-boot-maven-plugin</artifactId>

  56.          </plugin>

  57.       </plugins>

  58.    </build>

  59.  

  60.  

  61. </project>

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

  1. create database usersmanagement;

  2.  

  3. CREATE TABLE public.address

  4. (

  5.     id SERIAL PRIMARY KEY NOT NULL,
  6.     city TEXT,

  7.     street TEXT,

  8.     home_number VARCHAR(5)

  9. );

  10. CREATE UNIQUE INDEX address_id_uindex ON public.address (id);

  11.  

  12. CREATE TABLE public.users

  13. (

  14.     id SERIAL NOT NULL,

  15.     name TEXT,

  16.     email VARCHAR(20),

  17.     address_id INT PRIMARY KEY,
  18.     CONSTRAINT users_address_id_fk FOREIGN KEY (address_id) REFERENCES address (id)
  19. );

  20. CREATE UNIQUE INDEX users_id_uindex ON public.users (id);

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

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

  1. spring.datasource.url=jdbc:postgresql://localhost:5432/usersmanagement

  2. spring.datasource.username=postgres

  3. spring.datasource.password=postgres

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

  1. package com.javamaster.springjpapostgres.entity;

  2.  

  3. import javax.persistence.*;

  4.  

  5. @Table(name = «address»)

  6. public class Address {

  7.  

  8.     @Id

  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)

  10.  

  11.     @Column

  12.  

  13.     @Column

  14.  

  15.     @Column(name = «home_number»)

  16.     private String homeNumber;
  17.  

  18. //getters and setters

  19. }

  1. package com.javamaster.springjpapostgres.entity;

  2.  

  3. import javax.persistence.*;

  4.  

  5. @Table(name = «users»)

  6. public class Users {

  7.  

  8.     @Id

  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)

  10.  

  11.     @Column

  12.  

  13.     @Column

  14.  

  15.     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)

  16.     @JoinColumn(name = «address_id»)

  17.     private Address address;

  18.  

  19. }

  20. //getters and setters

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

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

  1. package com.javamaster.springjpapostgres.repository;

  2.  

  3. import com.javamaster.springjpapostgres.entity.Address;

  4. import org.springframework.data.jpa.repository.JpaRepository;

  5.  

postgresql — Подключение к PostgreSQL с Java

Вступление

API для использования реляционной базы данных с Java — это JDBC.

Этот API реализован драйвером JDBC.

Чтобы использовать его, поместите JAR-файл с драйвером в путь класса JAVA.

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

замечания

URL JDBC

URL JDBC может принимать одну из следующих форм:

  • jdbc:postgresql:// host [: port ]/[ database ][ parameters ]

    host умолчанию — localhost , port — 5432.
    Если host является адресом IPv6, он должен быть заключен в квадратные скобки.
    Имя базы данных по умолчанию совпадает с именем подключаемого пользователя.

    Чтобы реализовать переход на другой ресурс, возможно наличие нескольких записей host [: port ] разделенных запятой.
    Они стараются в свою очередь, пока соединение не удастся.

  • jdbc:postgresql: database [ parameters ]

  • jdbc:postgresql:/[ parameters ]

    Эти формы предназначены для соединений с localhost .

parameters — это список key [= value ] пар key [= value ] , возглавляемых ? и разделяются символом & . Если value отсутствует, оно считается true .

Пример:

jdbc:postgresql://localhost/test?user=fred&password=secret&ssl&sslfactory=org.postgresql.ssl.NonValidatingFactory

Рекомендации

Подключение к PostgreSQL с Java Связанные примеры

Простой пример JDBC для начинающих / Хабр

Здравствуйте! В этой статье я напишу простой пример соединения с базами данных на Java.Эта статья предназначена новичкам.Здесь я опишу каждую строчку объясню что зачем.

Но для начала немного теории.

JDBC (Java DataBase Connectivity — соединение с базами данных на Java) предназначен для взаимодействия Java-приложения с различными системами управления базами данных (СУБД). Всё движение в JDBC основано на драйверах которые указываются специально описанным URL.

А теперь практика.


Для начала создаём maven проект и в pom.xml помещаем зависимость для соединения с СУБД (В моём случае СУБД будет выступать MySQL):

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>

Должно получится так:

Дальше подключаемся к базе данных нужной вам(я пользуюсь IDEA Ultimate по этому я подключаюсь именно так).

Дальше заполняем Database, User и Password.Обязательно проверяем соединение.

Дальше мы создаём сам класс.

А теперь разберём его построчно:

В начале мы создаём три переменные url,username и password. Образец указания url:

Username по умолчанию root.Password вы должны знать сами.

После с помощью строчки Class.forName(«com.mysql.jdbc.Driver») регестрируем драйвера. Дальше устанавливаем соединение с помощью DriverManager.getConnection (ваш url, username, password).

После с помощью connection (соединения) создаём простой запрос Statement методом createStatement().

Дальше создаём экземпляр класса ResultSet и формируем запрос через statement методом executeQuery (запрос).

Дальше мы заставляем пробежаться resultSet по всей базе данных и вывести то что нам нужно. Так с помощью объекта resultSet и его методов (getString,getInt и т.д. в зависимости от типа переменных в колонке) мы выводим.Так как мой запрос был для того что бы вывести всё, мы можем вывести любую колонку.

После закрываем resultSet,statement и connection (именно в такой последовательности). В процессе он будет показывать ошибки так как будет запрашивать обработку исключений в catch.Так что пишите catch заранее.

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

Этот проект на github тут.

JPA/Hibernate и PostgreSQL: примеры настройки

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

CREATE ROLE test WITH PASSWORD ‘test’;
ALTER ROLE test WITH LOGIN;

CREATE DATABASE test OWNER test;

CREATE ROLE test WITH PASSWORD ‘test’;

ALTER ROLE test WITH LOGIN;

CREATE DATABASE test OWNER test;

Команды выше создают пользователя test с паролем test, создают базу данных test и назначают пользователя владельцем базы. В условиях реального приложения, разумеется, следует выбрать пароль посложнее.

Перед тем, как использовать PostgreSQL, необходимо добавить его JDBC драйвер в зависимости maven:

<properties>
<postgresql.version>9.4.1212.jre7</postgresql.version>
</properties>

<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
</dependencies>

<properties>

  <postgresql.version>9.4.1212.jre7</postgresql.version>

</properties>

 

<dependencies>

  <dependency>

    <groupId>org.postgresql</groupId>

    <artifactId>postgresql</artifactId>

    <version>${postgresql.version}</version>

  </dependency>

</dependencies>

С драйвером PostgreSQL в classpath можно настраивать Hibernate как JPA провайдер. Напоминаю, что все настройки JPA находятся в файле META-INF/persistence.xml

<persistence xmlns=»http://java.sun.com/xml/ns/persistence»
xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»
xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd»
version=»2.0″>
<persistence-unit name=»ru.easyjava.data.jpa.hibernate»>
<properties>
<property name=»hibernate.hbm2ddl.auto» value=»update»/>
<property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/>
<property name=»hibernate.connection.username» value=»test»/>
<property name=»hibernate.connection.password» value=»test»/>
<property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/>
</properties>
</persistence-unit>
</persistence>

<persistence xmlns=»http://java.sun.com/xml/ns/persistence»

             xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»

             xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd»

             version=»2.0″>

    <persistence-unit name=»ru.easyjava.data.jpa.hibernate»>

        <properties>

            <property name=»hibernate.hbm2ddl.auto» value=»update»/>

            <property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/>

            <property name=»hibernate.connection.username» value=»test»/>

            <property name=»hibernate.connection.password» value=»test»/>

            <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/>

        </properties>

    </persistence-unit>

</persistence>

JDBC url у PostgreSQL имеет следующий формат: jdbc:postgresql://хост:порт/имябазы, например jdbc:postgresql://127.0.0.1:5432/test. Имя пользователя и пароль передаются отдельными параметрами. Наконец, надо не забыть переключить диалект Hibernate на PostgreSQL, что делается в последней строке.

Однако, как мы знаем, одно соединение не очень удобно использовать в реальном приложении. Поэтомунастроим пул c3p0 для совместного использования сJPA/Hibernate и PostgreSQL.

Для этого, кроме PostgreSQL JDBC драйвера,  надо добавить непосредственно c3p0 и библиотеку hibernate-cp30 к зависимостям maven:

<properties>
<hibernate.version>5.2.1.Final</hibernate.version>
<c3p0.version>0.9.5.2</c3p0.version>
</properties>

<dependencies>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${hibernate.version}</version>
</dependency>
</dependencies>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<properties>

  <hibernate.version>5.2.1.Final</hibernate.version>

  <c3p0.version>0.9.5.2</c3p0.version>

</properties>

 

<dependencies>

  <dependency>

    <groupId>com.mchange</groupId>

    <artifactId>c3p0</artifactId>

    <version>${c3p0.version}</version>

  </dependency>

 

  <dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-c3p0</artifactId>

    <version>${hibernate.version}</version>

  </dependency>

</dependencies>

Для включения c3p0 достаточно добавить по меньшей мере один параметр c3p0 к настройкам Hibernate:

<persistence xmlns=»http://java.sun.com/xml/ns/persistence»
xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»
xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd»
version=»2.0″>
<persistence-unit name=»ru.easyjava.data.jpa.hibernate»>
<properties>
<property name=»hibernate.hbm2ddl.auto» value=»update»/>
<property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/>
<property name=»hibernate.connection.username» value=»test»/>
<property name=»hibernate.connection.password» value=»test»/>
<property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/>
<property name=»hibernate.c3p0.min_size» value=»5″/>
</properties>
</persistence-unit>
</persistence>

<persistence xmlns=»http://java.sun.com/xml/ns/persistence»

             xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»

             xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd»

             version=»2.0″>

    <persistence-unit name=»ru.easyjava.data.jpa.hibernate»>

        <properties>

            <property name=»hibernate.hbm2ddl.auto» value=»update»/>

            <property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/>

            <property name=»hibernate.connection.username» value=»test»/>

            <property name=»hibernate.connection.password» value=»test»/>

            <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/>

            <property name=»hibernate.c3p0.min_size» value=»5″/>

        </properties>

    </persistence-unit>

</persistence>

Остальные параметры остаются такими же, как и для PostgreSQL без c3p0.

К сожалению, в Hibernate нет настолько высококачественной поддержки HikariCP, аналогичной c3p0. Поэтому настройка HikariCP требует чуть чуть больше работы.

В первую очередь, конечно же, надо добавить ещё и артефакт HikariCP в зависимости (не забываем про PostgeSQL JDBC драйвер):

<properties>
<hikaricp.version>2.4.3</hikaricp.version>
</properties>

<dependencies>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>${hikaricp.version}</version>
</dependency>
</dependencies>

<properties>

  <hikaricp.version>2.4.3</hikaricp.version>

</properties>

 

<dependencies>

  <dependency>

    <groupId>com.zaxxer</groupId>

    <artifactId>HikariCP</artifactId>

    <version>${hikaricp.version}</version>

  </dependency>

</dependencies>

Потом необходимо изменить конфигурацию JPA/Hibernate для работы с HikariCP:

<persistence xmlns=»http://java.sun.com/xml/ns/persistence»
xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»
xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd»
version=»2.0″>
<persistence-unit name=»ru.easyjava.data.jpa.hibernate»>
<properties>
<property name=»hibernate.hbm2ddl.auto» value=»update»/>
<property name=»hibernate.connection.provider_class» value=»com.zaxxer.hikari.hibernate.HikariConnectionProvider»/>
<property name=»hibernate.hikari.dataSourceClassName» value=»org.postgresql.ds.PGSimpleDataSource»/>
<property name=»hibernate.hikari.dataSource.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/>
<property name=»hibernate.hikari.username» value=»test»/>
<property name=»hibernate.hikari.password» value=»test»/>
<property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/>
</properties>
</persistence-unit>
</persistence>

<persistence xmlns=»http://java.sun.com/xml/ns/persistence»

             xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»

             xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd»

             version=»2.0″>

    <persistence-unit name=»ru.easyjava.data.jpa.hibernate»>

        <properties>

            <property name=»hibernate.hbm2ddl.auto» value=»update»/>

            <property name=»hibernate.connection.provider_class» value=»com.zaxxer.hikari.hibernate.HikariConnectionProvider»/>

            <property name=»hibernate.hikari.dataSourceClassName» value=»org.postgresql.ds.PGSimpleDataSource»/>

            <property name=»hibernate.hikari.dataSource.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/>

            <property name=»hibernate.hikari.username» value=»test»/>

            <property name=»hibernate.hikari.password» value=»test»/>

            <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/>

        </properties>

    </persistence-unit>

</persistence>

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

Как распечатать любой результат запроса PostgreSQL в консоли с помощью Java?

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

Подключение Java к базе данных postgresql

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

java — Вставка значений в postgresql с использованием JDBC

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

postgresql — вызов сохраненной функции на postgres из java

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *