Permítanme comenzar diciendo que realmente disfruté la serie de artículos de Elleanor Kerry llamada "REST Overview". Aquí hay enlaces a estos artículos:
- Descripción general del DESCANSO. Parte 1: ¿Qué es REST?
- Descripción general del DESCANSO. Parte 2: Comunicación entre cliente y servidor
- Descripción general del DESCANSO. Parte 3: Creación de un servicio RESTful en Spring Boot
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Para crear un controlador REST:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
Para el 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>
Ahora que hemos ordenado pom.xml, vayamos a la carpeta de recursos y completemos el archivo application.properties de la siguiente manera:
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
Aquí ingresamos la URL de nuestra base de datos, proporcionamos el nombre de usuario y la contraseña, registramos el controlador para PostgreSQL, indicamos que usaríamos el tipo de datos PostgreSQL y especificamos el dialecto para Hibernate. A continuación, creemos un nuevo directorio llamado base de datos en la misma carpeta de recursos . En este directorio crearemos 2 archivos: initDB.sql y populateDB.sql . El primero se encargará de crear las tablas, el segundo se encargará de llenarlas inicialmente. Abramos initDB.sql y veamos una barra verde en la parte superior que dice El dialecto SQL no está configurado . Esto significa que no hemos elegido ningún dialecto SQL para nuestro proyecto (y hay varios). Haga clic en el lado derecho de la misma franja sobre la inscripción Cambiar dialecto a… . En la ventana emergente, hacemos clic en Project SQL Dialect , y como nuestra base de datos es PostgreSQL , seleccionamos el dialecto del mismo nombre. Haga clic en Aceptar. Pasemos a completar nuestros archivos .sql . Primero completemos el archivo 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
);
Si, después de completar el archivo, algunas palabras que no sean clientes están escritas en fuente blanca, haga clic derecho dentro del texto y seleccione Cambiar dialecto --> PostgreSQL nuevamente . Como probablemente ya entendiste, estos son los mismos datos que completamos al crear la tabla de prueba manualmente. Aquí están formateados en el dialecto PostgreSQL del lenguaje SQL. Ahora llenemos el archivo 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)');
Si el nombre de la mesa de tus clientes está escrito en letras rojas, entonces está bien. El punto es que aún no hemos creado esta tabla y IDEA aún no la reconoce. Para crear y completar la tabla, debemos volver al archivo application.properties y agregar allí las siguientes tres líneas:
spring.datasource.initialization-mode=ALWAYS
spring.datasource.schema=classpath*:database/initDB.sql
spring.datasource.data=classpath*:database/populateDB.sql
En estas líneas decimos que queremos inicializar la base de datos mediante programación e indicamos qué archivos se deben utilizar para ello. A continuación, vaya al método principal de nuestra aplicación y ejecútelo . Después de eso, vaya a pgAdmin --> Servidores --> PostgreSQL 12 --> Bases de datos --> clientes --> Esquemas --> público , haga clic derecho en " Tablas ", " Actualizar ". Si todo salió bien, veremos la tabla de clientes que creamos . Después de eso, regrese al archivo application.properties y comente la línea.
spring.datasource.data=classpath*:database/populateDB.sql
como a continuación:
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
Si no hacemos esto, la próxima vez que ejecutemos el programa recibiremos el siguiente error: org.postgresql.util.PSQLException: ERROR: Un valor de clave duplicado viola la restricción única "clients_pkey" . Esto sucede porque ya hemos completado los campos con ID 1 y 2 en la tabla (incluso durante el primer lanzamiento). En la tabla que creamos, el campo id se especifica como bigserial , que corresponde al tipo Long en Java. Sin embargo, en nuestro programa el tipo de este campo es Entero . Decidí mostrar cómo usar Long (BIGSERIAL) porque tiene un rango mayor que Integer. El hecho es que en las tablas, un campo designado como clave principal se puede usar no solo para almacenar ID de usuario , sino también para almacenar índices de una amplia variedad de datos, y el número de dichos registros puede exceder el valor entero máximo. Por ejemplo, si nuestro programa toma algunas medidas cada segundo y escribe los datos en una tabla. Para reescribir nuestras clases para usar el tipo de datos Long, necesitamos cambiar el tipo de Integer a Long en todas las clases y métodos que usan el campo id . No haremos esto porque el programa fue escrito originalmente por el autor para el tipo id Integer, lo que significa que esto tiene algún sentido. Para continuar, eliminemos una vez más la tabla de clientes que creamos de nuestra base de datos, pero ahora intentaremos hacerlo mediante programación en lugar de hacerlo manualmente. Para hacer esto, comente nuestro código en el archivo initDB.sql y agregue una línea:
-- 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
Iniciemos el programa, vayamos a pgAdmin , hagamos clic derecho en “ Tablas ” (en nuestra base de datos de clientes ) - -> “ Actualizar ”, y veremos que nuestra tabla ha desaparecido. ¡NÓTESE BIEN! ¡Tenga cuidado al usar este comando, de lo contrario corre el riesgo de perder todos los datos que tenía en su tabla! Volvamos al archivo initDB.sql y reescribámoslo de la siguiente manera:
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
);
Aquí hemos cambiado el tipo de identificación a SERIAL , que coincide con el tipo de entero que estamos usando para el campo de identificación en nuestro programa. Además, se ha aumentado la longitud máxima del campo del teléfono para que podamos utilizar libremente espacios y caracteres especiales (paréntesis, guiones, etc.) en su redacción. El número máximo de dígitos en un número de teléfono es actualmente de 18 dígitos (si mi memoria no me falla). Configuré el tamaño en 50 caracteres para estar seguro. Vayamos al archivo application.properties y descomentemos la línea:
spring.datasource.data=classpath*:database/populateDB.sql
Ejecutemos nuestro programa, vayamos a pgAdmin, verifiquemos que nuestra tabla haya sido creada y comentemos esta línea.
#spring.datasource.data=classpath*:database/populateDB.sql
Aquí es donde probablemente termine la primera parte del artículo. Espero que os guste, escribid comentarios (aunque no os haya gustado). En la segunda parte, reescribiremos nuestras clases para que puedan trabajar con bases de datos reales. Continuación: Agregar una base de datos PostgreSQL a un servicio RESTful en Spring Boot. Parte 2 UPD ¡Gracias a los moderadores por corregir mis imágenes y formato de texto!
GO TO FULL VERSION