Spring Boot - Servicio RESTful con Base de Datos

- Prerequisitos

Genera tu proyecto con Spring Boot INITIALIZR.

- Spring boot starter test.

- Spring boot starter data JPA.

- H2 como manejador de BD (esta en particular vive en memoria y solo es para esta cápsula). Puedes utilizar la BD que soporte Spring.

- Spring boot starter web.

 

 

1. Configuración MAVEN.

<groupId>com.ledzedev.springboot</groupId>

<artifactId>demo-spring-boot-restful</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo-spring-boot</name>
<description>Proyecto demo de un Servicio RESTful con Base de datos y Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.BUILD-SNAPSHOT</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

 

2. Agregamos la entidad que vamos a insertar en la BD.

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 09/Nov/2016.
*/
//Entidad para escribirle a la base de datos.
@Entity
class Noticia{


@Id
@GeneratedValue
private Long id;


private String tituloNoticia;

public Noticia() { //constructor vacío porque así lo dice JPA
}


public Noticia(String tituloNoticia) {
this.tituloNoticia = tituloNoticia;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getTituloNoticia() {
return tituloNoticia;
}

public void setTituloNoticia(String tituloNoticia) {
this.tituloNoticia = tituloNoticia;
}

@Override
public String toString() {

//es buena práctica sobreescribir el método toString para poder conocer el contenido de cada objeto
return "Noticia{" +

"id=" + id +
", tituloNoticia='" + tituloNoticia + '\'' +
'}';
}
}

 

 

3. Interfaz que hable con la BD. Que escriba y lea las noticias en/de la BD.

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 09/Nov/2016.
*/
//Interfaz que hable con la base de datos y que escriba las noticias que quiero almacenar.
interface NoticiasRepositorio extends JpaRepository<Noticia, Long>{

//por convención hay que llamar los métodos en inglés y automáticamente SpringBoot intuye el nombre de la propiedad
// en este caso solo agrego el findBy=buscaPor
// TituloNoticia = nuestro objeto Noticia tiene una propiedad tituloNoticia
Collection<Noticia> findByTituloNoticia(String tn);


// Agrego un método para que busque por id
Noticia findById(Long id);


}

4. Servicio RESTful.

 

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 09/Nov/2016.
*/
/* Para exponer un servicio REST, solo hay que agregar el controlador = Controller con la anotación @RestController */
@RestController
class NoticiasRestController{


/*Agregamos la información de la ruta para encontrar el servicio*/
@RequestMapping("/noticias")

Collection<Noticia> noticias(){
return noticiasRepositorio.findAll();
}

@Autowired
private NoticiasRepositorio noticiasRepositorio;

}



5. Aplicación principal que levanta el servicio.

 

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 09/Nov/2016.
*/
@SpringBootApplication
public class DemoSpringBootApplication {

/* Código para escribir en la base de datos algunas noticias.
- la clase principal debe tener la anotación @SpringBootApplication.
*/
private static final Logger log = LoggerFactory.getLogger(DemoSpringBootApplication.class);


public static void main(String[] args) {
SpringApplication.run(DemoSpringBootApplication.class, args);
}

/*
- Utilizamos la interfa CommandLineRunner que nos proporciona SpringBoot y
tiene un solo método que tiene la función de cargar cuando se ejecuta el main.
- Recuerda que nuestra base de datos es h2 para este ejemplo, pero puedes utilizar el manejador de BD que te guste.
- Escribimos el runner como un bean para que sea detectado por spring boot y que cargue lo que necesitamos
al arranque*/
@Bean
CommandLineRunner commandLineRunner(NoticiasRepositorio nr){

//como es java 8 puedo ocupar un lambda ya que esta interfaz solo tiene 1 método
return args -> {

//inserto en la BD
log.info("\n");

log.info("Guardando en la BD.\n");
Arrays.asList("Industria de Drones, mucho mas que cámaras voladoras.",
"Drones recuperarán autos robados en algunas zonas de la CDMX.",
"Drones para hackear al mundo",
"Japón quiere volver a ser el rey de las vías.",
"Pixar salvó a Steve Jobs y a Apple.")
.forEach( n -> nr.save(new Noticia(n)) );


log.info("Consulto todos los registros existentes en la BD.");
//busco los elementos y los imprimo en el log
nr.findAll().forEach(

n -> {log.info(n.toString());
});
log.info("\n");


log.info("Consulta por el método que agregamos.");
//ahora busco con el método que nosotros hicimos.
nr.findByTituloNoticia("Drones para hackear al mundo").forEach(

n -> {log.info("id de noticia encontrada por título: "+n.getId());
});

log.info("\n");

//Por último buscamos la noticia que tiene por id el número 2
Noticia n = nr.findById(2L);

log.info("Noticia encontrada por id ("+n.getId()+") título: "+n.getTituloNoticia());
log.info("\n");
};
};
}


6. Resultado.

 


1) La consulta en web de nuestro servicio RESTful.




2) En consola se muestran los registro que se consultaron de la BD y un par de métodos que agregamos.





Te puedes descargar mi código directamente del repositorio en github o te los puedes descargar en formato zip.


Artículos Relacionados



- Spring Boot INITIALIZR
- Spring Boot con Base de Datos

 

Como siempre dame un poquito de crédito y no le quites la firma a mi código.