You are on page 1of 17
Capitulo 6: Conectando una aplicacion de arranque de primavera a MySQL Introduccién Sabemos que Spring-Boot se ejecuta de forma predeterminada utilizando la base de datos H2. En este articulo, veremos cémo modificar la configuracién predeterminada para que funcione con la base de datos MySQL. Observaciones Como requisito previo, aseguirese de que MySQL ya se esté ejecutando en el puerto 3306 y de que se haya creado su base de datos. Examples Ejemplo de arranque de primavera usando MySQL Seguiremos la guia oficial para spring-boo! y spring-data-jpa . Vamos a construir la aplicacion utilizando Gradle. 1. Crear el archivo de compilacién de Gradle construir.gradle buildsceipt ( mavencentral () > dependencies { classpath (org. springfranework boot: spring-boot-gradle-plugin:1.4.3.RELZASE") ) ) apply plugin: 'javat apply plugin: ‘eclipse! apply plugin: 'ideat apply plugin: ‘org.springframework.boct* jar 4 baseNane = ‘gs-accessing-data~jpa’ version = '0.1.0" , repositories { mavenCentral () maven { url "https: //repository. jboss.org/nexus/content /repositories/releases" | https://riptutorial.com/es/home 26 sourceCompatibility = 1.8 targetConpatibility = 1.8 dependencies { compile (Yorg.springframework boot :spring-boot-starter-data~spa") runtime (‘mysql :mysql-connector—java") testConpile(*junit: junit") 2. Crea la entidad cliente src / main / java / hello / Customer.java eentity public class Customer { era QGeneratedVaiue (strategy-GenerationType.AU70) private Long id? private string firstName; private String lastNane; protected Customer() { public Customer (String firstName, String lastName) { this. £irstName = firstNane; this.lastName - lastNane; » goverride public String tostring() ( return String.format ( “customer [id=td, firstName='$s', lastNane="$s']", 44, CirstName, LastName) ; 3. Crea Repositorios src / main / java / hello / CustomerRepository java import java.util.List; import org. springfranework.data, repository.CrudRepository; public interface CustonerRepository extends CrudRepository { List findByLastName (String LastName); } 4, Crear el archivo application. properties ###EEEEEEREEEEEEESE DataSource Configuration HHS4as##HHEHHHHHEEEEES SAE jdbc. driverClassNane=con.mysql.. jdbe.Driver Jabe. Jabe-useraane Jdbe.password-password \dbe:mysql://Loca:host :3306/your_datanase_nane https://riptutorial.com/es/home 27 inital alse A#HHEEEHAHEEEEEEEE aibernate Configuration HEHEaAAeHHEHTHHHREEREE EAE hibernate, dialect=org.hibernate. dial hibernate. show_sq! hibernate hbm2dai auto-update -MysguDialect 5. Crea el archivo PersistenceConfig,java En el paso 5, definiremos cémo se cargara la fuente de datos y como nuestra aplicacién se conecta a MySQL. El fragmento de cédigo anterior es la configuracion minima que necesitamos para conectarnos a MySQL. Aqui ofrecemos dos frijoles: @configurat ion @EnableTraneact ionManagement @2nabledpakepositories (basePackage! public class Persistencecontig 1 helio") @autowired private Environment env; @zean public LocalContainerfntityManagerFactoryBean entityManagerFactory () ‘ LocaiContainersntityManagerFactoryBean factory = new LocalContainerBnt ityNanagerFactoryBean() HibernateJpaVendoradapter vendorAdapter = new HibernateJpaVendoradapter (); vendorAdapter. setGenerateDdl (Boolean. TRUE); vendorhdapter. set ShowSql (Boolean. TRUE); factory -setDatasource (datasource ()) 7 factory. set JpaVendorAdapter (vendorAdapter) ; factory.setPackagesToScan ("hello") ; Properties jpaProperties = new Properties(); jpaProperties.put ("hibernate.hbm2ddl .auto", env.geteroperty (Whibernate.hbn2dal auto"); factory. setJpaProperties (jpa?roperties) ; factory-afterPropertiesset (); factory. setLoadTineNeaver (new Instrument ationLoadTimeweaver ()); return factory; , @zean public Datasource datasource () ‘ brivertianagerDataSource dataSource = new DriverManagerDataSoures (); dataSource. setDriverClassName (env.getProperty (* jab datasource. setUrl (env. getProperty (*jabe-url")); c.driverClassNane")); jataSource set Username (env. getProperty("jdbe.usernane")); dataSource. setPassword (env.getProperty (" jobc.passwora") ); return datasource; https://riptutorial.com/es/home 28 + LocalContainerEntityManagerFactoryBean Esto nos permite controlar las configuraciones de EntityManagerFactory y nos permite realizar personalizaciones. También nos permite inyectar el PersistenceContext en nuestros componentes de la siguiente manera: ePersistencecontext private EntityManager em; + Fuente de datos Aqui devolvemos una instancia de privertianagerbatasource . Es una implementacién simple de la interfaz JDBC DataSource estandar, que configura un controlador JDBC antiguo y sencillo a través de las propiedades del bean, y devueive una nueva conexién para cada llamada de getConnection. Tenga en cuenta que recomiendo usar esto estrictamente para propésitos de prueba, ya que hay mejores alternativas como sasicbatasource disponibles, Consulte aqui para mas detalles. 6. Crear una clase de aplicacién src / main / java / hello / Application java @springBootapplication public class Application { private static final Logger log = LogserFactory.getLogger (Applicat ion.class); @autowired private CustomerRepository repository: public static void main(String{) args) ( springhpplication.run(TestCoreApplication.class, args); ) eBean public CommandbineRunner demo() ( return (args) -> { // save @ couple of customers repository.save(new Custoner(*"Jack", "Bauer")); repository.save(new Customer ("Chioe", "O'Brian")); repository.save(new Customer ("Kim™, "Baver")}; repository.save(new Custoner(*"David", "Palner")}; repository.save (new Customer ("Michelle", "Dessler"}); Wf fetch ald log.info("Custemers found with findAll():"); log. info(" op for (Customer custoner : repository.findAll()) ( Log. info (customer.toString()); \stomere ) Log.info(""); // fetch an individual customer by 1D repository. findone (12); log.info("Customer found with findone(1L):"); log. info(" yp Log. info (customer. toString ()) log.info("*); Customer customer // fetch customers by last name https://riptutorial.com/es/home 29 log.info ("Customer found with findBybastMane ( Log. info(" for (Customer bauer : repository. findayLastName("Bauer")) { Log. info (bauer. toString ()); , Log.info(*"); ip } 7. Ejecutando la aplicacién Si esta utilizando un IDE como STS , puede simplemente hacer clic derecho en su proyecto -> Ejecutar como -> Generar Gradle (STS) ... En la lista de tareas, escriba bootRun y Ejecutar. Si esta utilizando gradle en la linea de comandos , simplemente puede ejecutar la aplicacién de la siguiente manera: ee Deberia ver algo como esto: Customers found with findAll(): custoner[idel, firstName='Jack’, lastName="Bauer'] tomer[id=2, firstName='Chloe', lastNane='0' Brian") Custoner(id+3, firstName='Kin', lastName="Bauer'] custoner[id-4, "David', LastName="Palmer') Custoner(1d-5, firstName="Michelle', lastNane='Dessier"|] =- customer found with findone(1u) + customer [1d=1, {iretNane='Jack", lastName='Bauer'] == Customer found with findByLastNane ("Bauer"): tomer[id=1, firstName="Jack', lastName="Bauer' ] Custoner(id+3, firstName='Xin', lastName='Bauer'] Lea Conectando una aplicacién de arranque de primavera a MySQL en linea: https://riptutorial.com/es/spring-boot/topic/8588/conectando-una-aplicacion-de-arranque-de- primavera-a-mysql https://riptutorial.com/es/home 30 Capitulo 7: Controladores Introduccion En esta seccién agregaré un ejemplo para el controlador de resto de inicio de Spring con Get y post request. Examples Controlador de reposacabezas de muelle En este ejemplo, mostraré como formular un controlador de descanso para obtener y publicar datos en la base de datos utilizando JPA con la mayor facilidad y el menor codigo. En este ejemplo, nos referiremos a la tabla de datos llamada buyerRequirement. BuyingRequirementjava @Entity @Table (name = "BUYINGREQUIREMENTS") @NamedQueries ((@NamedQuery (name = "BuyingRequirement findAll’, query = "SELECT b FROM BuyingRequirement b"))) clase publica BuyingRequirement Extensiones de dominio Serializable {privado final final privado serialVersionUID = 1L; @column {name ~ "PRODUCT_NAME", nullable ~ false} private String productname; @columa (name ~ "NAME", nullable ~ false) private String name; @columa (name ~ "MOBILE", nullable ~ false) private String mobile; @columa (name ~ "EMAIL", nullable ~ false) private string @columa (name = private string enail; sorry") citys public BuyingRequirement () ( ) public String getProductnane() { return productname; ) public void setPreductname (string preductname) { this.productname = productname; ) https://riptutorial.com/es/home 34 Public String getName() { ) public void setName(string name) ( this.name = name; ) public String getMobile() ( return mobile; ) public void setMobile(string mobile) { this.mobile = mobile; ) public String getémail() ( return email; ) public void setimail(string email) { this.email ~ email; ) public String getcity() { return citys ) public void setcity(string city) ( this.city = citys ) } Esta es la clase de entidad que incluye el parametro que se refiere a las columnas en la tabla byuingRequirement y sus captadores y definidores. IBuyingRequirementsRepository java (interfaz JPA) aRepository @RepositoryRestResource Public interface TBuyingRequirementsRepository extends JpaRepository { // Page findAllByorderByCreatedDesc (Pageable pageable) ; Page findAllzyOrderByCreatedDesc (Pageable pageable); Page findByNameContainingIgnoreCase (@Param ("name") String name, Pageable pageable); ) BuyingRequirementController.java @Restcontroller @RequestMapping ("/api/vi") public class BuyingRequirenentController { @natowired TBayingRequirenentsRepository iBsyingRequirementsRepository; https://riptutorial.com/es/home 32 Snail email - new Bmail(); BuyerRequirenentTemplate buyerRequirementTemplate = new BuyerRequirenentTemplate (); private String To ~ "support @pharmerz..con' 7/ private String To = "anigujarathi¢gmail..com*; private String Subject - "Buyer Request From Pharm @PostMapping (value = */buyingRequirement") public Responsetnt ity CreateBuyingRequirement (Request Body BuyingRequirement buyingRequirements) { String productname - buyingRequirenents.getProductname() 7 String name ~ buyingRequirements.getName (); String mobile = buyingRequirements.getMobile(); String emails = buyingRequirements.getmail(); String city ~ buyingRequirements.getcity(); if (city == null) ( ety ) String HTMLBODY ~ buyerRequirement Template. template (productname, name, emails, mobile, city); email.SendMail(To, Subject, STMLBODY) ; iBuyingRequirenent sRepository. save (buyingRequirements) ; return new ResponseEntity(buyingRequirements, HttpStatus CREATED) ; AGetMapping (value = */buyingRequirements") Public Page getAliBuyingRequirements (Pageable pageable) { Page requirenents = ABuyingRequirenent sRepository. findAl lByOrderByCreatedbesc (pageable} ; return requirements; , @cetMapping (value ~ "/buyingRequirmentByNane/{nane}") public Page getSyNane (@2athVariable String name,Pageable pageable) | Page buyersbyNane — ABuyingRequirementsRepository, findByNaneContaininglgnorecase (name, pageable) ; return bayersByNane; Incluye el método 1. Método de publicacién que publica los datos en la base de datos. 2. Obtenga el método que obtiene todos los registros de la tabla de compras de requisitos. 3. Este es también un método de obtencién que encontrard el requisito de compra por el nombre de la persona. Lea Controladores en linea: https://riptutorial.com/es/spring-boot/topic/10635/controladores. https://riptutorial.com/es/home 33 Capitulo 8: Creacion y uso de multiples archivos de aplicaciones.propiedades Examples Dev y Prod entorno utilizando diferentes fuentes de datos Después de configurar con éxito la aplicacién Spring-Boot, toda la configuracién se maneja en un archivo application.properties. Encontrara el archivo en src/nain/resources/ Normaimente es necesario tener una base de datos detras de la aplicacion. Para el desarrollo es bueno tener una configuracién de aev y un entomo de prod . Mediante el uso de varios archivos ties puede indicar a Spring-Boot con qué entorno debe iniciar la aplicacién. application.prop Un buen ejemplo es configurar dos bases de datos. Uno para dev y otro para vzoductive « Para el ev entorno se puede utilizar una base de datos en memoria como ii2 . Cree un nuevo archivo en el directorio src/nain/cesouzees/ llamado appiicat ion~ ties . Dentro del archivo esta la configuracién de la base de datos en memoria: spring.datasource-url=jdbe:h2:mem:test. spring.datasource.driverClassNam spring. datasource username: spring. datasource.password= Para el entorno po , nos conectaremos a una base de datos "real", por ejemplo, postszeso1 Cree un nuevo archivo en el directorio sxc/main/resources/ llamado appiicacion-prod. properties Dentro del archivo esta la configuracién de la base de datos postarescr spring.datasource.url- jdbe:postgresql ://1ocalhost :5432/yourDs. spring. datasource. username=postgres spring.datasource.password=secret En su archivo ape1icat‘on.propersies predeterminado app1icat ion.properties ahora puede establecer qué perfil es activado y usado por Spring-Boot. Solo establece un atributo dentro: spring.profiles.active-dev spring.profiles.active-prod Es importante que la parte posterior - en ties Sea el identificador del archivo. Ahora puede iniciar la aplicacién Spring-Boot en modo de desarrollo o produccién simplemente https://riptutorial.com/es/home 34 cambiando el identificador. Se iniciaré una base de datos en memoria o la conexién a una base de datos "real". Claro que también hay muchos mas casos de uso para tener miltiples archivos de propiedades. Establezca el perfil de resorte correcto construyendo la aplicacién automaticamente (maven) Al crear multiples archivos de propiedades para los diferentes entornos o casos de uso, a veces es dificil cambiar manualmente el valor de active.protite al correcto. Pero hay una manera de Configurar el active.profsie @N el archivo appiication.properties Mientras se construye la aplicacién utilizando maven-profiies Digamos que hay tres entornos de archivos de propiedades en nuestra aplicacién: application-dev-properties = spring.profiles.active-dev application-test .properti rofiles active=test iport=8082 spring application-prod.properties « spring.profiles.active-prod server.port=8083 Esos tres archivos solo difieren en puerto y nombre de perfil activo. En el archivo principal azp1icaticn.properties Configuramos nuestro perfil de primavera usando una variable maven application.properties . spring profiles. activentprofilenctived Después de eso solo tenemos que agregar los perfiles de Maven en nuestro pom.xml - Estableceremos los perfiles para los tres entornos: deve/id> true dev dev https://riptutorial.com/es/home 35 cbuild.profile, id>test test prod prod prod Ahora puedes construir la aplicacién con maven. Sino configura ningtin perfil de Maven, esta creando el predeterminado (en este ejemplo es dev). Para especificar uno tienes que usar una palabra clave maven. La palabra clave para establecer un perfil en maven es -r seguida directamente por el nombre del perfil: n clean install -Ptest Ahora, también puede crear compilaciones personalizadas y guardarlas en su zz para compilaciones mas rapidas. Ejemplos: — ANN CONDESA Woorim cit a) Ye ee ISS (v1.5.3. RELEASE) Spring Boot 2017-06-06 11:24:44.885 INFO 6328 --- [ main] com.deno.springBlobapplicaticnTests Starting SpringApplicaticnTests on KB242 with PID 6328 (started by me in :\DATA\Workspaces\spring-deno) 2017-06-06 11:24:44.886 INFO 6328 main] com.deno.SpringkpplicationTests ANNAN TVVA\N 2017-06-06 14:43:31,067 INFO 5932 --- [ main] com.demo.SpringBlobApplicationTests Starting springApplicationTests on KB242 with PID 6328 (started by me in \DATA\Workspaces\spring-deno) https://riptutorial.com/es/home 36 2017-06-05 14:43:31.069 INFO 5932 ~~~ [ main] com.demo.SpringkpplicationTests : The following profiles are active: prod Lea Creacién y uso de miltiples archivos de aplicaciones. propiedades en linea: https://riptutorial.com/es/spring-boot/topic/6334/creacion-y-uso-de-multiples-archivos-de- aplicaciones-propiedades https://riptutorial.com/es/home 37 Capitulo 9: Escaneo de paquetes Introduccion En este tema, haré una visién general de la exploracién del paquete de arranque de primavera. Puede encontrar informacién basica en Spring Boots en el siguiente enlace ( \ising-boot- strucluring-your-code ) pero intentaré proporcionar informacién mas detallada. Spring boot, y spring en general, proporcionan una funcién para escanear automaticamente paquetes para ciertas anotaciones con el fin de crear veans ¥ configuration Parametros Anotacién principal de la aplicacién de arranque de muelle. se @SpringBootApplication _utiliza una vez en la aplicacién, contiene un método principal y acttia como paquete principal para el escaneo de paquetes Indica que una clase proporciona la aplicacién Spring Boot. Debe declararse solo una vez en la aplicacién, generalmente de forma automatica mediante la configuracién de aspringBoct Application @SpringBootConfiguration Habilitar la configuracién automatica del contexto de la aplicacién Spring. Debe declararse solo una vez en la aplicacién, generalmente de forma automatica mediante la configuracién de espringbootapplication @EnableAutoConfiguration Se utiliza para activar el escaneo automatico de paquetes en @ComponentScan un paquete determinado y sus hijos o para configurar el escaneo de paquetes personalizados Se utiliza para declarar uno o mas métodos ezean . Puede seleccionarse mediante el escaneo automatico de paquetes para declarar uno 0 mas métodos esean lugar de la configuracién xml tradicional @Configuracién Indica que un método produce un bean para ser administrado por el contenedor Spring. Por e22an general, los métodos @Frijol anotados de enean se colocaran en las clases anotadas de econfigurazion que Se Seleccionaran mediante el escaneo del paquete para crear beans basados en la configuracién de Java. @Componente Al declarar una clase como aconponent Se convierte en un https://riptutorial.com/es/home 38 candidato para la deteccién automatica cuando se utiliza la configuracién basada en anotaciones y el escaneo de classpath. Por lo general, una clase anotada con econsoneat $@ convertiré en un bean en la aplicacién Definido originalmente por Domain-Driven Design (Evans, 2003) como "un mecanismo para encapsular el almacenamiento. Normalmente se usa para indicar un tory Pala spring data @Repositorio Rep Muy similar en la practica a econponent . originalmente definido por Domain-Driven Design (Evans, 2003) como "una operacin ofrecida como una interfaz que se mantiene aislada en el modelo, sin estado encapsulado”. @Senicio Indica que una clase anotada es un "Controlador” (por ejemplo, \Controlador @ un controlador web). Una anotacién de conveniencia que se anota con econcro ter ¥ okesponse2ody . Se seleccionara automaticamente de forma predeterminada porque contiene la anotacién acont roi1er que se selecciona de forma predeterminada. @RestController Examples @SpringBootApplication La forma més bsica de estructurar su cédigo utilizando Spring Boot para un buen escaneo automatico de paquetes es mediante la anotacién espsinge . Esta anotacion proporciona en si misma otras 3 anotaciones que ayudan con el escaneo automatico: figuration , éconponentsean (mas informacién sobre cada @springzoot anotacién en la seccién raranecers ). nableautoc @sprin Application 8@ eolocara en el paquete principal y todos los demas componentes se colocaran en paquetes bajo este archivo: Application 10 éspring tApplication , @spring! ++ example nyproject 4+ Application. java (annotated with @springBootapplication) Customer. java CustomerRepository. java https://riptutorial.com/es/home 39 4 web += CustomerController. java Amenos que se indique lo contrario, Spring Boot detecta las econtigusation , €Conponent ekepository , @Service , €Controller , @Res:Cont roller automaticamente en los paquetes escaneados ( écontiguration ¥ #Restcontzel ler $@ Seleccionan porque estan anotadas por econponent ¥ @controt ier Consecuencia ). Ejemplo de cédigo basico: aspringBootApplication public class Application ( public static void main(stringl] args) ( SpringApplication.run(application.class, args); , Configurando paquetes / clases explicitamente Desde la version 1.3 también puede decirle a Spring Boot que scantasePackases paquetes especificos configurando scantase2ackages 0 scantasePackayeClasses @N ESpring2ootappiication @N lugar de especificar econponentsean 1. aspringhootagpl ication (scanhasePack: 5 = "con.exanpie.myproject™) : establece como el paquete base para escanear. ication (scanBasePackageClasses = CustonerCont segura para el scanvasePackages @ scant. cu mypro 2. aspringboota: oller.class) : una alternativa sePackages establece el paquete de merConteoller. java , com.exanple.mypzoject.wab , COMO el paquete base para escanear. Excluyendo la autoconfiguracién Otra caracteristica importante es la capacidad de excluir clases especificas de configuracién automatica utilizando exctude © exciudeNane (existe excludenane desde la version 1.3 ). 1. aspeingBootapplication (exclude = DeneConfiguration.class) : @XCIUITA DeneconCiguration de la exploracién automatica de paquetes. 2. aspringbootAgplicat ion excludeNane ~ *DenoContigurat ion") - hard lo mismo usando el nombre completamente clasificado de la clase. @ComponentScan Puede usar econsonen » para configurar un analisis de paquetes mas complejo. También hay scans que acttian como una anotacién de contenedor que agrega varias anotaciones de Ejemplos de cédigo basico acomponent scan https://riptutorial.com/es/home 40 16 DemoAutoConfiguration ( spent Scans ((@Component Scan ( examplel"), @ComponentSean ("com.exanple2") )) public class Demehutoconfiguration ( ) La indicacién de econponentscan Sin configuracién acta como espring2ootappt ication y analiza todos los paquetes de la clase anotada con esta anotacién En este ejemplo, econvo: rent sean algunos de los atributos titiles de mponent Sean 1. Los paquetes base se pueden usar para indicar paquetes especificos para escanear. 2. useDefaultFilters : al establecer este atributo en falso (el valor predeterminado es verdadero), puede asegurarse de que Spring no escanee econponent, automaticamente: 3. includeFilters : se puede usar para incluir anotaciones de primavera / patrones de expresiones regulares para incluir en el escaneo de paquetes. 4, excludeFilters : se pueden usar para excluir anotaciones especificas de primavera / patrones de expresiones regulares para incluir en el escaneo de paquetes. BRepository , QService © acontro: Hay muchos mas atributos, pero esos son los mas utilizados para personalizar el escaneo de paquetes, Creando tu propia autoconfiguracién. Spring Boot se basa en muchos proyectos primarios de autoconfiguracién prefabricados. Ya debe estar familiarizado con los proyectos de arranque de arranque de primavera, Puede crear facilmente su propio proyecto de inicio siguiendo estos sencillos pasos: 1. Cree algunas clases de econtigucat ion para definir beans predeterminados. Debe utilizar propiedades externas tanto como sea posible para permitir la personalizacién y tratar de utilizar las anotaciones del ayudante de configuracién automatica como enutocont singtean etc. Se puede encontrar informacién més detallada sobre cada anotacién en los oficiales documentacién anolaciones Estado 2. Coloque un archivo / archivos de configuracién automatica que agregue todas las clases de » @AutoCenfigureAfter , @Con ionalonBean , @Conditionalonkt econfiguration 3. Cree un archivo llamado spring. factories Y Coloquelo eN sr/main/= 4. En spring. factories , establezca la propiedad sspringfranework comas de sus clases de econ ces /META con valores separados por nfigure.Enableaut ot figurat Ke boot - aut figure. Enableast Config autoconfigure. LibxautoConfiguration, bXhebAut oconfiguration com.mycorp. 1ibx-autoconfigu https://riptutorial.com/es/home a1 Usando este método, puede crear sus propias clases de configuracién automatica que seran seleccionadas por spring-boot. Spring-boot escanea automaticamente todas las dependencias de maven / gradle en busca de un archivo spring. factories , Si encuentra uno, agrega todas écone on Clases de econt:queation especificadas en él a su proceso de configuracién automatica. boot maven Aseguirese de que su proyecto de inicio de au:o-contigurat ion NO contenga spe: plugin ya que empaquetard el proyecto como un JAR ejecutable y no seré cargado por el classpath como se spzing. factories no cargara tu configuracién Lea Escaneo de paquetes en linea: https://riptutorial.com/es/spring-boot/topic/9354/escaneo-de- Paquetes https://riptutorial.com/es/home 42

You might also like