Deixe-me começar dizendo que gostei muito da série de artigos de Elleanor Kerry chamada “Visão geral do REST”. Aqui estão links para esses artigos:
- Visão geral do REST. Parte 1: O que é REST
- Visão geral do REST. Parte 2: Comunicação entre cliente e servidor
- Visão geral do REST. Parte 3: Criando um serviço RESTful no Spring Boot
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Para criar um controlador REST:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
Para servidor Tomcat:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
Para PostgreSQL:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.10</version>
</dependency>
Agora que resolvemos o pom.xml, vamos para a pasta de recursos e preencher o arquivo application.properties da seguinte forma:
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
Aqui inserimos a URL do nosso banco de dados, fornecemos o login e senha do mesmo, registramos o driver para PostgreSQL, indicamos que usaríamos o tipo de dados PostgreSQL e especificamos o dialeto para Hibernate. A seguir, vamos criar um novo diretório chamado banco de dados na mesma pasta de recursos . Neste diretório criaremos 2 arquivos: initDB.sql e populateDB.sql . O primeiro será responsável pela criação das tabelas, o segundo será responsável por preenchê-las inicialmente. Vamos abrir initDB.sql e ver uma barra verde no topo que diz que o dialeto SQL não está configurado . Isso significa que não escolhemos um dialeto SQL para nosso projeto (e existem vários deles). Clique no lado direito da mesma faixa na inscrição Alterar dialeto para… . Na janela pop-up, clique em Project SQL Dialect e, como nosso banco de dados é PostgreSQL , selecionamos o dialeto de mesmo nome. Clique em OK. Vamos prosseguir com o preenchimento de nossos arquivos .sql . Vamos primeiro preencher o arquivo 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
);
Se, após preencher o arquivo, algumas palavras além de clientes estiverem escritas em fonte branca, clique com o botão direito dentro do texto e selecione Alterar Dialeto --> PostgreSQL novamente . Como você provavelmente já entendeu, esses são os mesmos dados que preenchemos ao criar a tabela de teste manualmente. Aqui eles são formatados no dialeto PostgreSQL da linguagem SQL. Agora vamos preencher o arquivo 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)');
Se o nome da tabela de seus clientes estiver escrito em letras vermelhas, tudo bem. A questão é que ainda não criamos esta tabela e o IDEA ainda não a reconhece. Para criar e preencher a tabela, precisamos voltar ao arquivo application.properties e adicionar as três linhas a seguir:
spring.datasource.initialization-mode=ALWAYS
spring.datasource.schema=classpath*:database/initDB.sql
spring.datasource.data=classpath*:database/populateDB.sql
Nestas linhas dizemos que queremos inicializar o banco de dados programaticamente e indicamos quais arquivos precisam ser utilizados para isso. Em seguida, vá para o método principal do nosso aplicativo e execute-o . Depois disso, vá para pgAdmin --> Servers --> PostgreSQL 12 --> Databases --> clients --> Schemas --> public , clique com o botão direito em " Tables ", " Update ". Se tudo correr bem, veremos a tabela de clientes que criamos . Depois disso, volte ao arquivo application.properties e comente a linha.
spring.datasource.data=classpath*:database/populateDB.sql
como abaixo:
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
Se não fizermos isso, na próxima vez que executarmos o programa, receberemos o seguinte erro: org.postgresql.util.PSQLException: ERROR: A duplicate key value violas the unique restrição "clients_pkey" . Isso acontece porque já preenchemos os campos com id 1 e 2 na tabela (ainda no primeiro lançamento). Na tabela que criamos, o campo id é especificado como bigserial , que corresponde ao tipo Long em Java. Porém, em nosso programa o tipo deste campo é Integer . Resolvi mostrar como usar Long (BIGSERIAL) porque ele possui um alcance maior que Integer. O fato é que nas tabelas, um campo designado como Chave Primária pode ser usado não apenas para armazenar IDs de usuários , mas também para armazenar índices de uma ampla variedade de dados, e o número desses registros pode exceder o valor inteiro máximo. Por exemplo, se nosso programa fizer algumas medições a cada segundo e gravar os dados em uma tabela. Para reescrever nossas classes para usar o tipo de dados Long, precisamos alterar o tipo de Integer para Long em todas as classes e métodos que usam o campo id . Não faremos isso, porque o programa foi originalmente escrito pelo autor para o tipo id Integer, o que significa que faz algum sentido. Para continuar, vamos mais uma vez remover a tabela de clientes que criamos do nosso banco de dados, mas agora tentaremos fazer isso de forma programática em vez de manualmente. Para fazer isso, comente nosso código no arquivo initDB.sql e adicione uma linha:
-- 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
Vamos iniciar o programa, ir em pgAdmin , clicar com o botão direito em “ Tabelas ” (na base de dados de nossos clientes ) -> “ Atualizar ”, e veremos que nossa tabela desapareceu. Atenção! Tenha cuidado ao usar este comando, caso contrário você corre o risco de perder todos os dados que tinha na sua tabela! Vamos voltar ao arquivo initDB.sql e reescrevê-lo da seguinte forma:
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
);
Aqui alteramos o tipo de id para SERIAL , que corresponde ao tipo Integer que estamos usando para o campo id em nosso programa. Além disso, o comprimento máximo do campo telefone foi aumentado para que possamos utilizar livremente espaços e caracteres especiais (parênteses, travessões, etc.) em sua escrita. O número máximo de dígitos em um número de telefone é atualmente de 18 dígitos (se não me falha a memória). Defino o tamanho para 50 caracteres para ter certeza. Vamos ao arquivo application.properties e descomente a linha:
spring.datasource.data=classpath*:database/populateDB.sql
Vamos executar nosso programa, acessar o pgAdmin, verificar se nossa tabela foi criada e comentar esta linha novamente.
#spring.datasource.data=classpath*:database/populateDB.sql
É aqui que provavelmente terminarei a primeira parte do artigo. Espero que gostem, escrevam comentários (mesmo que não tenham gostado). Na segunda parte, reescreveremos nossas classes para que possam trabalhar com bancos de dados reais. Continuação: Adicionando um banco de dados PostgreSQL a um serviço RESTful no Spring Boot. Parte 2 UPD Obrigado aos moderadores por corrigirem minhas fotos e formatação de texto!
GO TO FULL VERSION