¿Cómo conectar tu aplicación Spring Data con una base de datos PostgreSQL?
La conexión de tu aplicación Spring Data con PostgreSQL es un paso crucial para manejar eficazmente tu base de datos. En este artículo, te guiaremos a través del proceso desde definir el modelo de datos hasta configurar la conexión en Spring. Todo esto con el propósito de que puedas interactuar fácilmente con tus datos mediante APIs.
¿Cuál es el modelo de datos que usaremos?
Nuestro modelo de datos se compone de cinco tablas interrelacionadas que optimizan la gestión de nuestra base de datos:
Tabla Categorías: Incluye el ID como clave primaria, descripción y estado. Se usará para categorizar productos.
Tabla Productos: Su clave primaria es ID producto y contiene nombre, ID de categoría, código de barras, precio de venta, cantidad en stock y estado.
Tabla Clientes: Aquí almacenaremos información de los clientes como nombre, apellidos, celular, dirección y correo electrónico.
Tabla Compras: Registra las transacciones con ID compra como clave primaria, vinculada a clientes mediante ID cliente.
Tabla Compras Productos: Usa una clave primaria compuesta por ID compra e ID producto con columnas adicionales como cantidad, total y estado.
¿Cómo crear la base de datos y cargar datos iniciales?
Para arrancar, necesitas crear la base de datos y luego ejecutar los scripts para definir tablas y cargar datos iniciales. Aquí te explicamos cómo hacerlo:
Inicia Sesión en PostgreSQL: Usa PG Admin para conectar e introducir las credenciales configuradas.
Crear Base de Datos: En el entorno de PG Admin, genera una base de datos nueva llamada PlatziMarket.
Ejecutar Scripts:
Copia y pega el contenido de schema.sql en PG Admin y ejecútalo para crear las estructuras tabulares.
Procede del mismo modo para data.sql para cargar datos iniciales.
¿Cómo gestionar secuencias automáticas?
Las secuencias en PostgreSQL permiten gestionan automáticamente los valores de claves primarias:
Reinicia las secuencias correspondientes a productos, categorías y compras para que cada inserción nueva continue del último identificador usado.
Verifica las secuencias en PG Admin para asegurarte de que están configuradas correctamente.
¿Cómo conectar la aplicación a PostgreSQL con IntelliJ IDEA?
Para establecer la conexión de tu aplicación con la base de datos, sigue estos pasos:
Añadir Dependencia PostgreSQL: En build.gradle, agrega la dependencia de PostgreSQL JDBC Driver como runtime only para que se resuelva solo durante la ejecución.
runtimeOnly 'org.postgresql:postgresql'
Configurar Archivo de Propiedades: En application-dev.properties agrega las configuraciones necesarias:
Actualizar Dependencias: Refresca el proyecto para incluir cambios y asegurarte de que las dependencias estén correctamente integradas.
¿Cómo verificar la conexión exitosa de la aplicación?
Una vez que tu aplicación esté configurada, compila y ejecuta tu proyecto en Spring Boot. Observa la consola:
Conectividad y Escaneo: Deberías ver cómo Spring Data inicia el escaneo de repositorios y carga los datos de la base de datos.
Tiempo de Inicialización: La aplicación debería iniciar en aproximadamente 30 segundos, estableciendo la conexión al servidor y base de datos exitosamente.
Con esta guía, no solo vas a optimizar el funcionamiento de Spring Data con PostgreSQL, sino que también serás capaz de explorar y manipular tus datos de manera eficiente. ¡Adelante y sigue explorando el mundo del desarrollo con base de datos!
Conexión y Configuración de Base de Datos en Spring Boot
De esta forma Spring usara ese driver y si la url esta mal escrita indicará los errores, sino se coloca el driver y la url esta mal escrita Spring dira que no encuentra driver para conectarse.
"Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured"
les recomiendo que en el archivo aplication.properties ingresen el iguiente codigo:
te voy a ser bien honesto, esto ha sido lo mas bello que he visto en los comentarios! literal el paso a paso que entregaste aqui es una maravilla! tenia un tiempo sin usar docker y la verdad enfrentarme a usar pgadmin sin experiencia previa me desmotivo, pense que tendria que descargar postgres. Muchas gracias
Tuve problemas para hacer funcionar esto, en mi caso siempre me daba este error:
org.postgresql.util.PSQLException: FATAL: la autentificación password falló para el usuario «usuario» (pgjdbc: autodetected server-encoding to be ISO-8859-1, if the message is not readable, please check database logs and/or host, port, dbname, user, password, pg_hba.conf)
Luego de investigar bastaba con cambiar el puerto expuesto por docker. Me ayudó este post.
Sería mucho problema cambiar de PostgreSql a MySql? Si no, alguna pista de cómo hacerlo estaría genial. Vengo del curso de MySql y me interesa implementar una API con esta base de datos específicamente.. Saludos
No creo que haya problema, solo habría que cambiar las dependencias a las de MySQL. Y supongo que al crear la base de datos e importar los datos, las sentencias igual se ejecutan al ser SQL un estándar.
Si, de hecho ya lo probé y todo funcionó correctamente agregando las dependencias, solo se presentaron algunos problemas en la Sintaxis del archivo schema.sql pero se resolvieron sin mucho esfuerzo, solo un par de errores menores.. gracias
Muchas gracias por reportarlo. Puede ocurrir sí tu base de datos tiene una codificación diferente.
Para solucionarlo de raíz acabamos de hacer un ligero ajuste en el archivo data.sql que está en "Archivos y Enlaces" para que otros estudiantes no tengan este mismo problema.
Hola! para los que usan ubuntu como yo, al momento de entrar a pgadmin no hay ningún servidor configurado, por esa razón tenemos que crear uno nuevo.
Damos clic derecho sobre Servers> create > server
Acá nos muestra una ventana de dialogo en la que nos pide nombre en la pestaña “General” y luego el host en la pestaña “Connection”. En el nombre le damos el nombre que queramos y en Connection se pone localhost, se deja el puerto por defecto y ponemos la contraseña del usuario postgres (si es que tenemos una definida), luego damos clic en save (guardar) listo, tenemos nuestro servidor local.
Al instalar se crea una cuenta de usuario llamada postgres en el sistema linux , que se asocia con el rol preterminado de Postgresql
Para iniciar postgres , debemos iniciar sesion en esa cuenta.
-> cambiando a la cuenta de postgres
**sudo -i -u postgres **
-> acceder a la linea de comnados de PostgreSQL
psql
Ahora puede crear sus roles , bases de datos , tablas , etc.
-> para salir de esa linea de comandos de PostgreSQL
postgres=# \q
Con esto regresará a la linea de comadnos de linux de postgres.
Instalé la última versión (v13.1) y no me funcionó se quedó ciclado y bajé a la versión 11.10 y esta funcionando correcto, por si a alguien le paso lo mismo.
Podríamos incluir Flyway para versionar la base de datos y mantener la consistencia sin importar si ejecutamos la aplicación en desarollo o producción.
Con solo incluir la dependencia de flyway en el proyecto, el starter de spring boot data jpa se encarga de autoconfigurarlo.
Al correr la aplicación veremos que se genera una tabla que lleva el control de las versiones de la base de datos llamada flyway_schema_history.
Si necesitamos cambiar la estructura de la base de datos ya solo agregaremos archivos .sql en la carpeta db/migration y flyway se encargará de ejecutarlos automáticamente. Así mantenemos la consistencia en todos los ambientes donde ejecutemos la aplicación sin tener que correr los scripts manualmente.
En mi caso yo no instalé ni PostgreSql ni pgAdmin. Yo use Docker para crear estos servicios dentro de un contenedor.
Los configuré y pude conectarme a la base de datos sin problemas.
Acá los recursos por si alguien gusta hacerlo así.
docker-compose.yml
Para correr los servicios:
docker-compose up -d
Para ver los contenedores ejecutarse.
docker ps
y obtenemos algo como esto:
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESbed2882d776f postgres:13"docker-entrypoint.s…"2 hours ago Up2 hours 0.0.0.0:5432->5432/tcp adhara-store-postgres-1d3ab36a5d17a dpage/pgadmin4 "/entrypoint.sh"2 hours ago Up2 hours 443/tcp,0.0.0.0:5050->80/tcp adhara-store-pgadmin-1
para este caso el id del contenedor de postgres es bed2882d776f. De este contenedor requiero ver su IP para ello ejecuto el comando
docker inspect bed2882d776f
Va a lanzar un montón de información pero lo que interesa es la IP, esa esta casi hasta el final.
Con esto ya puedo conectar mi base de datos con pgAdmin.
Solo falta ejecutar los scripts sql que se ven en clase y realizar un select a alguna de las tablas para comprobar los datos. En mi caso yo cambie los datos.
Modifique mi archivo applcation-dev.properties y mi applcation-prod.properties
Finalmente ejecute le aplicación y sin problema.
Como conectar SpringBoot a una Base de Datos
Spring Boot te permite conectarte a una base de datos de forma simple y con minimas configuraciones.
Veamos en este post como conectarse a una base de datos.
Como conectar Spring Boot con una base de datos
Puedes crear una conexión a una base de datos en Spring Boot con pocos pasos.
Define la base de datos que quieres utilizar.
Incluye las dependencias.
Define los parámetros de conexión en el archivo de propiedades.
Define la base de datos
En este ejemplo, nosotros usaremos MySql, pero la configuración aplica a cualquier base de datos. La única diferencia es la dependencia necesaria para conectar tu base de datos con tu servicio.
Dependencias para crear la conexión con la base de datos en Spring Boot
Para crear una DB conexión, tu necesitas las siguientes dependencias.
Para MySql necesitas:
'mysql:mysql-connector-java:8.0.28'
Para PostgreSQL:
'org.postgresql:postgresql'
Para Oracle:
'com.oracle.database.jdbc:ojdbc8'
Para MSSQL:
'com.microsoft.sqlserver:mssql-jdbc'
Los parámetros de conexión en el archivo de propiedades
En estas propiedades, nosotros primero debemos establecer el path de conexión con la DB. Luego indicamos el user y el password. Con esta minima configuración y la dependencia, ya es suficiente para Spring entender como conectarse.
La configuración minima para conectar a la base queda así:
*Observa que el puerto y la url podrían cambiar dependiendo de la instalación de cada base de datos.
/* para los que usan mysql ya esta con datos y relaciones */
-- Host: localhost
-- Versión del servidor: 5.7.24 - MySQL Community Server (GPL)
-- SO del servidor: Win64
-- HeidiSQL Versión: 11.0.0.5919
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;
/!40101 SET NAMES utf8 /;
/!50503 SET NAMES utf8mb4 /;
/!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /;
/!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-- Volcando estructura de base de datos para platzi-market
CREATE DATABASE IF NOT EXISTS platzi-market /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci */;
USE platzi-market;
-- Volcando estructura para tabla platzi-market.categorias
CREATE TABLE IF NOT EXISTS categorias (
id_categoria int(11) NOT NULL AUTO_INCREMENT,
descripcion varchar(45) NOT NULL DEFAULT '0',
estado int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (id_categoria),
KEY id_categoria (id_categoria)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
-- Volcando datos para la tabla platzi-market.categorias: ~8 rows (aproximadamente)
DELETE FROM categorias;
/*!40000 ALTER TABLE categorias DISABLE KEYS /;
INSERT INTO categorias (id_categoria, descripcion, estado) VALUES
(1, 'Frutas y verduras', 1),
(2, 'Pastelería', 1),
(3, 'Carnes y pescados', 1),
(4, 'Frutas y verduras', 1),
(5, 'Bebidas', 1),
(6, 'Licores', 1),
(7, 'Cuidado personal', 1),
(8, 'Despensa', 1);
/!40000 ALTER TABLE categorias ENABLE KEYS */;
-- Volcando estructura para tabla platzi-market.clientes
CREATE TABLE IF NOT EXISTS clientes (
id varchar(20) NOT NULL,
nombre varchar(40) DEFAULT NULL,
apellidos varchar(100) DEFAULT NULL,
celular decimal(10,0) DEFAULT '0',
direccion varchar(80) DEFAULT '0',
correo_electronico varchar(70) DEFAULT '0',
PRIMARY KEY (id),
KEY id (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Volcando datos para la tabla platzi-market.clientes: ~3 rows (aproximadamente)
DELETE FROM clientes;
/*!40000 ALTER TABLE clientes DISABLE KEYS /;
INSERT INTO clientes (id, nombre, apellidos, celular, direccion, correo_electronico) VALUES
('2552243', 'Galileo', 'Galilei', 3462257293, 'Cl 1 # 11 - 11', 'gali@leo.com'),
('4546221', 'Johannes', 'Kepler', 3104583224, 'Cl 3 # 33 - 33', 'kepler@me.com'),
('983824', 'Nicolás', 'Copernico', 3019392466, 'Cl 2 # 22 - 22', 'nico@cope.com');
/!40000 ALTER TABLE clientes ENABLE KEYS */;
-- Volcando estructura para tabla platzi-market.compras
CREATE TABLE IF NOT EXISTS compras (
id_compra int(11) NOT NULL AUTO_INCREMENT,
id_cliente varchar(20) NOT NULL DEFAULT '',
fecha datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
medio_pago char(1) DEFAULT '',
comentario varchar(300) DEFAULT '',
estado char(1) DEFAULT '',
PRIMARY KEY (id_compra),
KEY id_compra (id_compra),
KEY id_cliente (id_cliente),
CONSTRAINT FK_compras_clientes FOREIGN KEY (id_cliente) REFERENCES clientes (id)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-- Volcando datos para la tabla platzi-market.compras: ~1 rows (aproximadamente)
DELETE FROM compras;
/*!40000 ALTER TABLE compras DISABLE KEYS /;
INSERT INTO compras (id_compra, id_cliente, fecha, medio_pago, comentario, estado) VALUES
(1, '4546221', '1992-10-08 17:30:00', 'E', '', 'P');
/!40000 ALTER TABLE compras ENABLE KEYS */;
-- Volcando estructura para tabla platzi-market.compras_productos
CREATE TABLE IF NOT EXISTS compras_productos (
id_compra int(11) NOT NULL,
id_producto int(11) NOT NULL,
cantidad int(11) DEFAULT NULL,
total decimal(16,2) DEFAULT NULL,
estado tinyint(4) DEFAULT NULL,
KEY id_compra (id_compra),
KEY id_producto (id_producto),
CONSTRAINT FK_compras_productos_compras FOREIGN KEY (id_compra) REFERENCES compras (id_compra),
CONSTRAINT id_productofk FOREIGN KEY (id_producto) REFERENCES productos (id_producto)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Volcando datos para la tabla platzi-market.compras_productos: ~6 rows (aproximadamente)
DELETE FROM compras_productos;
/*!40000 ALTER TABLE compras_productos DISABLE KEYS /;
INSERT INTO compras_productos (id_compra, id_producto, cantidad, total, estado) VALUES
(1, 1, 10, 3000.00, 1),
(1, 36, 1, 40000.00, 1),
(1, 27, 1, 9000.00, 1),
(1, 49, 2, 16400.00, 1),
(1, 24, 1, 4000.00, 1);
/!40000 ALTER TABLE compras_productos ENABLE KEYS */;
-- Volcando estructura para tabla platzi-market.productos
CREATE TABLE IF NOT EXISTS productos (
id_producto int(11) NOT NULL AUTO_INCREMENT,
nombre varchar(50) DEFAULT '0',
id_categoria int(11) NOT NULL DEFAULT '0',
codigo_barras varchar(50) DEFAULT '0',
precio_venta decimal(16,2) DEFAULT '0.00',
cantidad_stock int(11) NOT NULL DEFAULT '0',
estado tinyint(4) DEFAULT '0',
PRIMARY KEY (id_producto),
KEY id_producto (id_producto),
KEY id_categoria (id_categoria),
CONSTRAINT FK_productos_categorias FOREIGN KEY (id_categoria) REFERENCES categorias (id_categoria)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') /;
/!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) /;
/!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
Si les da error al ejecutar el archivo data.sql en la línea: