Este ejemplo le dirá cómo usar Spring Boot Data JPA para implementar operaciones de inserción, actualización, eliminación y selección de tabla de base de datos en la tabla de base de datos MySQL. Con Spring Boot Data JPA, el comando de operación de la tabla de la base de datos se ha ajustado a un método, solo necesita crear una interfaz Java que amplíe la interfaz básica de Spring Boot Data JPA Repository (por ejemplo, CrudRepository ), solo necesita definir el método de operación de la tabla de la base de datos (como findBy
1. Crear tabla de base de datos MySQL.
- Cree una base de datos MySQL con el nombre dev2qa_example . La intercalación predeterminada de la base de datos debe ser utf8 – utf8_bin .
CREAR ESQUEMA `dev2qa_example` CONJUNTO DE CARACTERES POR DEFECTO utf8 COLLATE utf8_bin;
- Cree una tabla user_account en el dev2qa_example anterior base de datos con la siguiente instrucción SQL. El identificador la columna debe ser AI (incremento automático), de lo contrario, se generará un error Spring Boot JPA Table 'dbname.hibernate_sequence' Doesn't Exist.
2. Crear proyecto Spring Boot.
- Inicie Spring Tool Suite, haga clic en Archivo —> Nuevo —> Spring Starter Project elemento de menú para abrir a continuación Nuevo proyecto de inicio de primavera mago. Ingrese información relacionada con el proyecto como se muestra a continuación. Y haga clic en el botón Siguiente.
- Añadir JPA ,
MySQL, y Web bibliotecas en el asistente de dependencias. Y haz clic en Finalizar botón para completar la inicialización del proyecto.
3. Archivos de proyecto de ejemplo Spring Boot JPA CRUD.
A continuación se muestran los archivos fuente de este proyecto. Los presentaremos uno por uno.
C:\WORKSPACE\WORK\DEV2QA.COM-EXAMPLE-CODE\SPRINGBOOT\SPRINGBOOTCRUDMYSQL│ pom.xml└───src ├───main │ ├───java │ │ └───com │ │ └─se │ │ └ └─── │ │ │ │ springBootcrudMysqlaPplication.java │ │ │ │ ├ ├ ├ ├── ectroller │ │ │ userAccountController.Java │ │ │ │ ├ ├ ├ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───Pository │ │ UserAccountRepository.Java │ │ │ └ └─seurces │ Application.Properties │ └─ija └test └─Java └─COCOM └─dev2qa treingbootcudmysqlapplicationTests. java
3.1 SpringBootCrudMySqlApplication.java
Este es el ejemplo de arranque de primavera que inicia la clase Java. Se cargará y ejecutará primero en la aplicación Spring Boot.
paquete com.dev2qa.example;importar org.springframework.boot.SpringApplication;importar org.springframework.boot.autoconfigure.EnableAutoConfiguration;importar org.springframework.context.annotation.ComponentScan;importar org.springframework.context.annotation. Configuration;//@SpringBootApplication@Configuration@ComponentScan(basePackages ={ "com.dev2qa.example" })@EnableAutoConfigurationpublic class SpringBootCrudMySqlApplication { public static void main(String[] args) { SpringApplication.run(SpringBootCrudMySqlApplication.class, args); }}
3.2 Controlador de cuentas de usuario.java
Esta es la clase Java del controlador Spring MVC que asignará la URL de solicitud del usuario al método de procesamiento.
paquete com.dev2qa.example.controller;importar java.util.List;importar org.springframework.beans.factory.annotation.Autowired;importar org.springframework.stereotype.Controller;importar org.springframework.web.bind. annotation.GetMapping;importar org.springframework.web.bind.annotation.RequestMapping;importar org.springframework.web.bind.annotation.RequestParam;importar org.springframework.web.bind.annotation.ResponseBody;importar com.dev2qa.example. entidad.CuentaUsuario;importar com.dev2qa.ejemplo.repositorio.RepositorioCuentaUsuario;@Controller@RequestMapping(ruta ="/cuentausuario")public class UserAccountController { @Autowired UserAccountRepository userAccountRepository; /* * Ejemplo de URL de asignación:* http://localhost:8080/userAccount/add?userName=Jerry&password=888888&email=* [email protected] * http://localhost:8080/userAccount/add?userName=Richard&password=888888&email =* [email protected] */ @GetMapping(path ="/add") @ResponseBody public String addUser(@RequestParam String nombre de usuario, @RequestParam String contraseña, @RequestParam String email) { UserAccount userAccount =new UserAccount(); cuenta de usuario.setUsername(nombre de usuario); cuentausuario.setPassword(contraseña); cuenta de usuario.setEmail (correo electrónico); userAccountRepository.save(userAccount); String ret ="Se ha agregado la cuenta de usuario, nombre de usuario =" + nombre de usuario + ", contraseña =" + contraseña + ", correo electrónico =" + correo electrónico; volver ret; } /* * Ejemplo de URL de mapeo:http://localhost:8080/userAccount/findAll */ @GetMapping(path ="/findAll") @ResponseBody public String findAllUser() { StringBuffer retBuf =new StringBuffer(); ListuserAccountList =(List ) userAccountRepository.findAll(); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(cuentausuario.getUsername()); retBuf.append(", contraseña ="); retBuf.append(cuentausuario.getPassword()); retBuf.append(", correo electrónico ="); retBuf.append(cuentausuario.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("No se encontraron registros"); } else { retBuf.insert(0, " "); retBuf.append(""); } devuelve retBuf.toString(); } /* * Ejemplo de URL de asignación:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String nombre de usuario) { StringBuffer retBuf =nuevo StringBuffer(); ListuserAccountList =(List ) userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(cuentausuario.getUsername()); retBuf.append(", contraseña ="); retBuf.append(cuentausuario.getPassword()); retBuf.append(", correo electrónico ="); retBuf.append(cuentausuario.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("No se encontraron registros"); } devuelve retBuf.toString(); } /* * Ejemplo de URL de asignación:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(@RequestParam String nombre de usuario , @RequestParam String contraseña) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(List ) userAccountRepository .findByUsernameAndPassword(nombre de usuario, contraseña); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(cuentausuario.getUsername()); retBuf.append(", contraseña ="); retBuf.append(cuentausuario.getPassword()); retBuf.append(", correo electrónico ="); retBuf.append(cuentausuario.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("No se encontraron registros"); } devuelve retBuf.toString(); } /* * Ejemplo de URL de asignación:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String nombre de usuario, @RequestParam String contraseña, @RequestParam String correo electrónico) { StringBuffer retBuf =new StringBuffer(); ListuserAccountList =userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { userAccount.setUsername(userName); cuentausuario.setPassword(contraseña); cuenta de usuario.setEmail (correo electrónico); userAccountRepository.save(userAccount); } } retBuf.append("Actualización de datos de usuario exitosa."); volver retBuf.toString(); } /* * Ejemplo de URL de asignación:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String userName) { StringBuffer retBuf =nuevo StringBuffer(); userAccountRepository.deleteByUsername(nombre de usuario); retBuf.append("Los datos del usuario se han eliminado correctamente."); volver retBuf.toString(); } /* * Ejemplo de URL de asignación:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @ResponseBody public String deleteByUserNameAndPassword(@RequestParam String userName, @RequestParam String contraseña) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(nombre de usuario, contraseña); retBuf.append("Los datos del usuario se han eliminado correctamente."); volver retBuf.toString(); }}
3.3 CuentaUsuario.java
Esta es la clase Java de la entidad que se asignará a la tabla MySQL user_account . Tenga en cuenta el id generar estrategia debe ser GenerationType.IDENTITY , si usa Generación.AUTO y la columna de ID de la tabla MySQL está configurada para incrementarse automáticamente, se generará un error.
paquete com.dev2qa.example.entity;importar javax.persistencia.Entidad;importar javax.persistencia.GeneratedValue;importar javax.persistencia.GenerationType;importar javax.persistencia.Id;/* Asigne esta clase de entidad a la tabla de cuenta_usuario. */@Entity(name ="user_account")public class UserAccount { @Id @GeneratedValue(strategy =GenerationType.IDENTITY) private Long id; @javax.persistence.Column(name ="user_name") private String nombre de usuario; contraseña de cadena privada; correo electrónico privado de cadena; getId largo público () { ID de retorno; } public void setId(Long id) { this.id =id; } public String getUsername() { devolver nombre de usuario; } public void setUsername(String nombreusuario) { this.username =nombreusuario; } public String getPassword() { devolver contraseña; } public void setPassword(String password) { this.password =contraseña; } public String getEmail() { devolver correo electrónico; } public void setEmail(String email) { this.email =email; }}
3.4 UserAccountRepository.java
Esta es la interfaz de repositorio JPA de datos de arranque de primavera personalizada que amplía CrudRepository . Solo necesita definir métodos relacionados, luego Spring Framework ejecutará automáticamente el comando SQL relacionado para implementar el método. Esto hace que la codificación sea más rápida.
paquete com.dev2qa.example.repository;importar java.util.List;importar org.springframework.data.repository.CrudRepository;importar org.springframework.transaction.annotation.Transactional;importar com.dev2qa.example.entity. UserAccount;public interface UserAccountRepository extends CrudRepository{ /* * Obtener la lista de usuarios por nombre de usuario. Tenga en cuenta que el formato debe ser * findBy . */ List findByUsername(String nombreusuario); /* * Obtiene la lista de usuarios por nombre de usuario y contraseña. Tenga en cuenta que el formato debe ser * findBy And . */ List findByUsernameAndPassword(String nombre de usuario, String contraseña); @Transactional void deleteByUsernameAndPassword(String nombre de usuario, String contraseña); @Transactional void deleteByUsername(String nombre de usuario);}
3.5 aplicación.propiedades
Este es el archivo de recursos que contiene los datos de conexión de la fuente de datos MySQL JDBC utilizados en el ejemplo.
# MySQL jdbc conexión url.spring.datasource.url=jdbc:mysql://localhost:3306/dev2qa_example# MySQL jdbc controlador clase nombre.spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver# MySQL nombre de usuario y contraseña de la base de datosspring.datasource.username=rootspring.datasource.password=root
3.6 pom.xml
4.0.0 com.example SpringBootCRUDMySQL 0.0.1-SNAPSHOT jar SpringBootCRUDMySQL Spring boot accede a mysql con operación crud. org.springframework.boot spring-boot-starter-parent 2.1.0.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-data-jpa org. springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
3.7 Ejecute el ejemplo.
- Haga clic derecho en el nombre del proyecto.
- Haga clic en Ejecutar como —> Aplicación Spring Boot elemento de menú de la lista del menú emergente.
- Después de iniciar la aplicación, ingrese la URL de asignación para el UserAccountController relacionado método de clase java en un navegador web para ver el resultado.
4. Pregunta y respuesta.
4.1 Los métodos de Spring Boot findAll, findById, deleteById devuelven resultados vacíos.
- Quiero usar Spring boot + MySQL para implementar una aplicación REST que realizará acciones CRUD para manipular una tabla MySQL. Pero encuentro cuando ejecuto findAll() método, devuelve una lista vacía, esto no es lo que esperaba. Cuando ejecuto findById() método, devuelve el mensaje de error java.util.NoSuchElementException:No value present . Y cuando realizo una acción de eliminación con el método Spring Boot deleteById() , también me dice que No existe ninguna entidad de clase org.dev2qa.entity.Article con id 10 ! Parece que la tabla de mi base de datos está vacía, pero no lo está. ¿En qué caso pueden ocurrir estos errores?
- Mi clase de repositorio personalizado amplía el JpaRepository clase, y su findAll() El método también devuelve una lista vacía. Mi base de datos es la base de datos MySql también. Cuando agrego un registro en la base de datos MySQL, findAll() método devuelve [{}] , y cuando agrego dos registros en la base de datos MySQL, findAll() el método devuelve [{},{}] . El número del elemento de la lista es correcto pero los datos del elemento están vacíos, esto no es correcto. ¿Alguien puede ayudarme? Muchas gracias.
- Si las propiedades de su clase de entidad no son públicas, puede ocurrir este error. Primero debe declarar las propiedades de la clase de entidad con @Column la anotación y la declaración de propiedades pueden ser privadas, luego agregue el método getters y setters a esas propiedades y haga que el método getters y setters sea público. Después de esto, JpaRepository puede crear un objeto de entidad y completar las propiedades del objeto con los datos leídos de la base de datos MySQL. Y tu findAll() el método no devolverá una lista vacía en absoluto.
Referencia
- Cómo instalar MySQL en Ubuntu
- Resolver el error de la tabla JPA de Spring Boot 'dbname.hibernate_sequence' no existe