Spring Boot - Servicio RESTful con Base de Datos
- Details
- Created: Wednesday, 09 November 2016 01:22
- Written by Gerardo Pucheta Figueroa
- Hits: 3594
- 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.