Ticker

6/recent/ticker-posts

Conexión e inserción de datos con PostgreSQL y Spring Boot


La conexión a base de datos nos permite almacenar gran número de información en base a inserciones ya sea desde una interfaz usuario o una simple sentencia SQL. En este tutorial revisaremos la conexión a una base de datos, en especifico, nos conectareos a la base de datos PostgreSQL con Spring Boot.

Requisitos:

  • PostgreSQL 14.
  • pgAmin
  • Java 17.
  • Maven 3.8.6.
  • Spring Initializr.
  • Spring Boot 3.0.1.
  • IntelliJ IDEA Ultimate.

Lo que veremos en este tutorial:

  1. ¿Que es PostgreSQL?
  2. Características PostgreSQL.
  3. Creando el poryecto con Spring Initializ.
  4. Creando la conexión a la base de datos.
  5. Ejecutando el proyecto.

1. ¿Qué es PostgreSQL?

PostgreSQL es un sistema de gestión de base de datos relacional open source de muy alta disponibilidad, gratuito y libre, optimizada de forma constante gracias a su activa comunidad de expertos. Además, nos permite procesar data de manera gratis a diferentes tipos de base de datos y de gran complejidad, PostgreSQL nos ofrece un rendimiento optimizado que nos permite realizar  consultas relacionales en basa a setencias SQL, mientras que las no relacionales hacen uso de JSON.

PostgreSQL posee data types (tipos de datos) avanzados y permite ejecutar optimizaciones de rendimiento avanzadas, que son características que por lo general solo se aplican en sistemas de bases de datos comerciales, como por ejemplo SQL Server de Microsoft u Oracle.

2. Características PostgreSQL.

PostgreSQL es uno de los sistemas de bases de datos más avanzados y usados en la actualidad, y es importante conocer algunas de sus características:

  • Código abierto: una de las principales razones por la cual PostgreSQL se ha vuelto tan popular es que se trata de un sistema de código abierto. Esto ha permitido que una gran comunidad de desarrolladores crezca para respaldarlo y continuar mejorándolo. Gracias a todo el apoyo con el que cuenta ha logrado transformarse en uno de los mejores gestores de bases de datos a nivel mundial.
  • Gratuito: como cabe esperarse se trata de un sistema totalmente gratis, no tenemos que pagar nada por utilizarlo. Cualquier persona es libre de descargar PostgreSQL desde su sitio web oficial y darle uso sin ningún costo.
  • Multiplataforma: una característica genial que de hecho es común en muchos grandes proyectos de código abierto es el hecho de que se trata de software multiplataforma, es decir, es un software que puede correr bajo distintos entornos y sistemas operativos, y es compatible con muchos de los servidores web más populares como Apache, Nginx y LiteSpeed por mencionar algunos.
  • Fácil de usar: la facilidad de uso de PostgreSQL es sin dudas otra de las principales características de este sistema. Su administración se vuelve muy sencilla por medio de paneles con PgAdmin, que básicamente viene a ser un phpMyAdmin orientado para PostgreSQL. La posibilidad de realizar diversos procedimientos en forma sencilla hacen que PgAdmin sea ampliamente utilizado, aunque también permite realizar tareas más complejos, así que tanto novatos como usuarios expertos hacen uso de él.
  • Almacena y maneja un gran volumen de datos: una característica extremadamente importante de PostgreSQL es su gran capacidad para el manejo de grandes volúmenes de datos, algo en lo que otros sistemas como MySQL aún no hacen tan bien. Las bases de datos de gran tamaño pueden hacer pleno uso del MVCC de PostgreSQL, resultando en un gran rendimiento. MVCC es un método de control que nos permite realizar tareas de escritura y lectura simultáneamente.
  • Soporte total de ACID: otro punto muy importante que no se debe dejar de lado es el cumplimiento de ACID. ¿Qué es ACID? Estas siglas en inglés refieren a: atomicity, consistency, isolation y durability, que si lo traducimos al español básicamente hablan de la atomicidad, consistencia, aislamiento y durabilidad de las transacciones que se realizan en una base de datos. ¿Y por qué es tan importante? Porque tener soporte completo de ACID da la seguridad de que, si se produce una falla durante una transacción, los datos no se perderán ni terminarán donde no deban.

3. Creando el poryecto con Spring Initializ.

Se sugiere revisar el siguinete tutorial con relación a Creando proyectos con Spring Initializr, donde se detalla la consideración y se crea nuestro primer proyecto con Spring Initializr, asimismo, se abre el proyecto con IntelliJ IDEA se específica la estructura del proyecto generado desde Spring Initializr.

A nuestro proyecto generado con Spring Initializr se determinado con el nombre de conexion-postgresql

Para la conexión a base de datos PostgreSQL, se deben agregar a nuestro proyecto las siguientes dependencias de tipo SQL:

  1. Spring Data JPA SQL: Datos de persistencia de almacenamiento SQL con la API de persistencia de Java utilizando Spring Data e Hibernate
  2. PostgreSQL Driver SQL: Controlador JDBC y R2DBC que permite que los programas Java se conecten a una base de datos PostgreSQL utilizando código Java estándar e independiente de la base de datos.

La dependeicas Spring Web y Spring Boot DevTools también son parte del proyecto.


4. Creando la conexión a la base de datos.

Recordemos que para el punto 4 ya se tiene que tener creado la base de datos, sugiero revisar el siguiente tutorial acerca de Creando una base de datos con pgAdmin Management Tools for PostgreSQL, el nombre de la base de datos es db_demo.

Comencemos con los pasos necesarios para la conexión e inserción de datos en nuestra base de datos PostgreSQL:

4.1. Abrir nuestro proyecto generado con Spring Initializr de nombre conexion-postgresql desde IntelliJ IDEA.

4.2. Ubicar el archivo application.properties dentro del directorio sub directorio resources.

4.3. Seguidamente agregar los parámetros necesarios para lograr la conexión a la base de datos PostgreSQL:

Sugiero ejecutar la aplicación con la finalida de validar nuestra configuración a la base de datos PostgreSQL

4.4. Finalmente creamos los objetos de tipo persistente con la finalidad de poder crear nuestra tabla de nombre tbproduct e insertar datos desde código Spring Boot; esto se logrará en base a Hibernate y JPA. A continuación se detallan los siguientes pasos:

4.4.1. Crear nuestros paquetes con relación a la entidad (entity), repositorio (repository) y negocio (business). Los tres paquetes representas las capas de nuestra aplicación:
En este tutiral solo se utilizará los 3 paquetes detallados

4.4.2. Crear e implementar nuestra entidad de nombre tbproduct (se crea desde código Spring Boot gracias a Hibernate):

Para un mejor entendimiento del código, sugiero leer los comentarios que están en el codigo de la clase Product.

 

  • Clic derecho en el paquete entidad (entity) y seleccionar New/Java Class para y crear la clase Product, seguidamente implementamos nuestra entidad (tabla) tbproduct con 4 atributos (campo) como son code, description, price y stock:
package com.hadsonpar.conexionpostgresql.entity;

import jakarta.persistence.*;

@Entity
@Table(name = "tbproduct")
public class Product {
/*@Id: Representa a un primary key (llama primario) de
nuestra tabla tbproduct*/
@Id
/*@GeneratedValue: Representa a un campo autogereado (secuencial),
equivalente a un campo identity de una sentencia SQL.*/
@GeneratedValue (strategy = GenerationType.IDENTITY)
private Long code;
private String description;
private double price;
private int stock;
}
  • Seguidamente crear nuestro constructor en base a los 4 atributos creados:

Clic derecho estándo en la clase Product y seleccionar la opción Generate / Constructor


Seleccionar los atributos y clic en OK


  • Finalmente crear los Set y Get en base a los 4 atributos creados, clic derecho estándo en la clase Product y seleccionar la opción Generate / Getter and Setter:

Clic en Getter and Setter


Seleccionar los atributos clic en OK, y automaticamente se crean los Get y Set

Con esto pasos se ha implementado nuestra clase Product, teniendo en consideración a nuestra 
entidad de nombre tbproduct que se creará en nuestra base de datos db_demo:

package com.hadsonpar.conexionpostgresql.entity;

import jakarta.persistence.*;

@Entity
@Table(name = "tbproduct")
public class Product {
/*@Id: Representa a un primary key (llama primario) de
nuestra tabla tbproduct*/
@Id
/*@GeneratedValue: Representa a un campo autogereado (secuencial),
equivalente a un campo identity de una sentencia SQL.*/
@GeneratedValue (strategy = GenerationType.IDENTITY)
private Long code;
private String description;
private double price;
private int stock;

/*Constructor creado manualmente, util para realizar busqueda o no se
quiere enviar ningún atributo*/
public Product() {
}

//Constructor generado por la misma Herramienta de IntelliJ IDEA
public Product(Long code, String description, double price, int stock) {
this.code = code;
this.description = description;
this.price = price;
this.stock = stock;
}

//Set's y Get's generado por la misma Herramienta de IntelliJ IDEA
public Long getCode() {
return code;
}

public void setCode(Long code) {
this.code = code;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public int getStock() {
return stock;
}

public void setStock(int stock) {
this.stock = stock;
}
}


4.4.3. Crear e implementar nuestra clase INTERFAZ REPOSITORIO de nombre IProductRepository:

  • Clic derecho en el paquete repositorio (repository) y seleccionar New/Java Class para y crear la clase de tipo Interface de nombre IProductRepository, seguidamente implementamos nuestra Interface Repositorio:
Creando la Interface IProductRepository


  • Seguidamente se extendiente nuestra Interface IProductRepository a JpaRepository.
    • Al crear la interfaz, inicialmente el codigo es de la siguiente manera:
package com.hadsonpar.conexionpostgresql.repository;

public interface IProductRepository {

}
    • Al extender nuestro interfaz, el codigo quedará de la siguiente manera.
package com.hadsonpar.conexionpostgresql.repository;
import com.hadsonpar.conexionpostgresql.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;

/*Long: Representa el tipo de dato con relación al id de la entidad Product
ES DECIR ES EL SIGUIENTE CODIGO CON RELACION AL Id DE LA CLASE Product:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long code;
*/
public interface IProductRepository extends JpaRepository<Product, Long> {

}

Jparepository: Extiende las clases para conectarse a la base de datos, con la finalidad de gestionar la información, es decir, nos permite relizar busquedas, eliminar, actualizar e insertar registros en la base de datos.

 

4.4.4. Seguidamente, crear e implementar nuestra clase INTERFAZ NEGOCIO de nombre IProductBusiness (para crear nuestro metodo de insertar registros):

  • Clic derecho en el paquete negocio (businessy seleccionar New/Java Class para y crear la clase de tipo Interface de nombre IProductBusiness, seguidamente implementamos nuestra Interface Negocio:

Creando la Interface IProductBusiness 


  • Finalmente implementamos nuestro metodo insertar (insertproduct) en nuestra clase de tipo Interface de nombre IProductBusiness:

package com.hadsonpar.conexionpostgresql.business;

import com.hadsonpar.conexionpostgresql.entity.Product;

public interface IProductBusiness {
public Product insertproduct(Product product);
}


4.4.5. Finalmente, implementamos nuestra clase NEGOCIO para insertar (save) registros:

  • Clic derecho en el paquete negocio (businessy seleccionar New/Java Class para y crear la clase de tipo Clase de nombre ProductBusiness.
Creardo la clase ProductBusiness

  • Agregamos la extensión de implementación (implements IProductBusiness) a nuestra clase negocio de nombre ProductBusiness:

package com.hadsonpar.conexionpostgresql.business;

public class ProductBusiness implements IProductBusiness {

}
  • Seguidamente implementamos nuestro método insertproduct:

La forma más rápida es haciendo clic en el foco y seleccionar Impement methods

Seleccionar el metodo insertproduct y clic en OK (en esta venta, lista todo los metodos creadas en nuestra INTERFAZ NEGOCIO - IProductBusiness).


 
  • Finalmente para aplicar inserción de registro importamos Service y Autowired; asimismo, referenciamos a nuestro IProductRepository e invocamos al método save del paquete JPARepository.

package com.hadsonpar.conexionpostgresql.business;

import com.hadsonpar.conexionpostgresql.entity.Product;
import com.hadsonpar.conexionpostgresql.repository.IProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductBusiness implements IProductBusiness {
@Autowired
//Referenciamos a nuestro IProductRepository
IProductRepository iProductRepository;
@Override
public Product insertproduct(Product product) {
//Save se encarga de registra los datos.
return iProductRepository.save(product);
}
}

Recordemos que el nombre de nuestra base de datos es db_demo.


5. Ejecutando el proyecto.

Con todos los pasos realizados, se tiene se tiene que ejecuatar la aplicación con la finalidad inicialmente de:
  1. Conectarse a la base de datos.
  2. Crear la tabal tbproduct.

Ejecutamos nuestra aplicacion desde la clase ConexionPostgresqlApplication

Conección a la base de datos y crear de la tabal tbproduct.

Refrescamos la base de datos db_demo de pgAdmin para verificar la creacion de la tabla tbproduct. son los mismo atributos que se definido en el punto 4.4.2 con relación a la tabla tbproduct, sin embargo, los tipos de datos son los equivalentes a la sentencia SQL y por defecto sea definido la longitud de datos (ejemplo: campo description)


Seguidamente, realizaremos los siguiente paso para la inserción de registros desde la opción test de nuestro proyecto creado de nombre conexion-postgresql, con los siguientes pasos a realizar estoy iniciando los @Test Unitarios que se revisará en el siguiente tutorial.

  1. Aplicamos Autowired y referenciamos a nuestro IProductBusiness
  2. Creamos un metodo de tipo @Test y de nombre testInsert en nuestra clase class ConexionPostgresqlApplicationTests
  3. Invocar nuestro constructor public Product() declarado en nuestra entidad Product
  4. Asignamos valores según los atributos de nuestra entidad Product y pasarlos en base al constructor.
  5. Finalidad invocamos al método insertproduct de nuestro IProductBusiness

package com.hadsonpar.conexionpostgresql;

import com.hadsonpar.conexionpostgresql.business.IProductBusiness;
import com.hadsonpar.conexionpostgresql.entity.Product;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ConexionPostgresqlApplicationTests {


//1. Aplicamos Autowired y referenciamos a nuestro IProductRepository
@Autowired(required=true)
private IProductBusiness productBusiness;
@Test
void contextLoads() {
}

//2. Creamos un metodo de tipo @Test y de nombre contextInsert
@Test
void testInsert() {
//3. Invocar nuestro constructor
Product product = new Product();

//4. Asignamos valores...
product.setDescription("Laptop HP");
product.setPrice(3100);
product.setStock(3);

//5. Finalidad invocamos al método insertproduct
productBusiness.insertproduct(product);
}
}


Finalmente, ejecutamos el @Test de nombre testInsert y verificamos los datos insertados es nuestra tabla tbproduct de la base de datos db_demo:



En el siguiente tutorial desarrollaremos los métodos recuperar (Sentencia SQL equivalente a select), actualizar (Sentencia SQL equivalente a update) y eliminar (Sentencia SQL equivalente a delete); asimismo, realizaremos ejecuciones @Test unitario a nuestra aplicación según los métodos a desarrollar.



Referencias:


Código disponible en GitHub

Gracias nuevamente 😊; comentarios y apreciaciones son bienvenido, un fuerte abrazo para todos ✌...!!! 

Publicar un comentario

1 Comentarios

  1. Pensé que iba a explicar cómo hacer la conexión con la base de datos. Y lo único que hay de explicación es: "Seguidamente agregar los parámetros necesarios para lograr la conexión a la base de datos PostgreSQL"

    ResponderBorrar