Cet exemple vous expliquera comment utiliser Spring Boot Data JPA pour implémenter l'opération d'insertion, de mise à jour, de suppression et de sélection de table de base de données sur la table de base de données MySQL. Avec les données de démarrage de printemps JPA, la commande d'opération de table de base de données a été enveloppée dans une méthode, il vous suffit de créer une interface Java qui étend l'interface de base du référentiel JPA de données de démarrage de printemps (par exemple CrudRepository ), alors il vous suffit de définir la méthode d'opération de la table de base de données (telle que findBy
1. Créer une table de base de données MySQL.
- Créez une base de données MySQL avec le nom dev2qa_example . Le classement par défaut de la base de données devrait être utf8 – utf8_bin .
CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
- Créer une table user_account dans le dev2qa_example ci-dessus base de données avec l'instruction SQL ci-dessous. L'identifiant la colonne doit être AI ( incrémentation automatique ), sinon une erreur Spring Boot JPA Table 'dbname.hibernate_sequence' Doesn't Exist sera générée.
CREATE TABLE `dev2qa_example`.`user_account` ( `id` INT NOT NULL AUTO_INCREMENT, `user_name` VARCHAR(100) NULL, `password` VARCHAR(100) NULL, `email` VARCHAR(100) NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin;
2. Créer un projet Spring Boot.
- Lancez la suite d'outils Spring, cliquez sur Fichier —> Nouveau —> Projet Spring Starter élément de menu à ouvrir ci-dessous Nouveau projet de démarrage de printemps sorcier. Saisissez les informations relatives au projet comme ci-dessous. Et cliquez sur le bouton Suivant.
- Ajouter JPA , MySQL, et Web bibliothèques dans l'assistant de dépendances. Et cliquez sur Terminer bouton pour terminer l'initialisation du projet.
3. Spring Boot JPA CRUD Exemple de fichiers de projet.
Vous trouverez ci-dessous les fichiers source de ce projet. Nous allons les présenter un par un.
C:\WORKSPACE\WORK\DEV2QA.COM-EXAMPLE-CODE\SPRINGBOOT\SPRINGBOOTCRUDMYSQL │ pom.xml └───src ├───main │ ├───java │ │ └───com │ │ └───dev2qa │ │ └───example │ │ │ SpringBootCrudMySqlApplication.java │ │ │ │ │ ├───controller │ │ │ UserAccountController.java │ │ │ │ │ ├───entity │ │ │ UserAccount.java │ │ │ │ │ └───repository │ │ UserAccountRepository.java │ │ │ └───resources │ application.properties │ └───test └───java └───com └───dev2qa SpringBootCrudMySqlApplicationTests.java
3.1 SpringBootCrudMySqlApplication.java
Ceci est l'exemple de démarrage de printemps commençant la classe Java. Il sera chargé et exécuté en premier dans l'application Spring Boot.
package com.dev2qa.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; //@SpringBootApplication @Configuration @ComponentScan(basePackages = { "com.dev2qa.example" }) @EnableAutoConfiguration public class SpringBootCrudMySqlApplication { public static void main(String[] args) { SpringApplication.run(SpringBootCrudMySqlApplication.class, args); } }
3.2 UserAccountController.java
Il s'agit de la classe Java du contrôleur Spring MVC qui mappera l'URL de la demande de l'utilisateur à la méthode de traitement.
package com.dev2qa.example.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.dev2qa.example.entity.UserAccount; import com.dev2qa.example.repository.UserAccountRepository; @Controller @RequestMapping(path = "/userAccount") public class UserAccountController { @Autowired UserAccountRepository userAccountRepository; /* * Mapping url exmaple: * 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 userName, @RequestParam String password, @RequestParam String email) { UserAccount userAccount = new UserAccount(); userAccount.setUsername(userName); userAccount.setPassword(password); userAccount.setEmail(email); userAccountRepository.save(userAccount); String ret = "User account has been added, user name = " + userName + ", password = " + password + ", email = " + email; return ret; } /* * Mapping url exmaple: http://localhost:8080/userAccount/findAll */ @GetMapping(path = "/findAll") @ResponseBody public String findAllUser() { StringBuffer retBuf = new StringBuffer(); List<UserAccount> userAccountList = (List<UserAccount>) userAccountRepository.findAll(); if (userAccountList != null) { for (UserAccount userAccount : userAccountList) { retBuf.append("user name = "); retBuf.append(userAccount.getUsername()); retBuf.append(", password = "); retBuf.append(userAccount.getPassword()); retBuf.append(", email = "); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() == 0) { retBuf.append("No record find."); } else { retBuf.insert(0, "<pre>"); retBuf.append("</pre>"); } return retBuf.toString(); } /* * Mapping url exmaple: * http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path = "/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf = new StringBuffer(); List<UserAccount> userAccountList = (List<UserAccount>) userAccountRepository.findByUsername(userName); if (userAccountList != null) { for (UserAccount userAccount : userAccountList) { retBuf.append("user name = "); retBuf.append(userAccount.getUsername()); retBuf.append(", password = "); retBuf.append(userAccount.getPassword()); retBuf.append(", email = "); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() == 0) { retBuf.append("No record find."); } return retBuf.toString(); } /* * Mapping url exmaple: * http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry& * password=888888 */ @GetMapping(path = "/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(@RequestParam String userName, @RequestParam String password) { StringBuffer retBuf = new StringBuffer(); List<UserAccount> userAccountList = (List<UserAccount>) userAccountRepository .findByUsernameAndPassword(userName, password); if (userAccountList != null) { for (UserAccount userAccount : userAccountList) { retBuf.append("user name = "); retBuf.append(userAccount.getUsername()); retBuf.append(", password = "); retBuf.append(userAccount.getPassword()); retBuf.append(", email = "); retBuf.append(userAccount.getEmail()); retBuf.append("<br/>"); } } if (retBuf.length() == 0) { retBuf.append("No record find."); } return retBuf.toString(); } /* * Mapping url exmaple: * http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello& * [email protected] */ @GetMapping(path = "/updateUser") @ResponseBody public String updateUser(@RequestParam String userName, @RequestParam String password, @RequestParam String email) { StringBuffer retBuf = new StringBuffer(); List<UserAccount> userAccountList = userAccountRepository.findByUsername(userName); if (userAccountList != null) { for (UserAccount userAccount : userAccountList) { userAccount.setUsername(userName); userAccount.setPassword(password); userAccount.setEmail(email); userAccountRepository.save(userAccount); } } retBuf.append("User data update successfully."); return retBuf.toString(); } /* * Mapping url exmaple: * http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path = "/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String userName) { StringBuffer retBuf = new StringBuffer(); userAccountRepository.deleteByUsername(userName); retBuf.append("User data has been deleted successfully."); return retBuf.toString(); } /* * Mapping url exmaple: * http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName= * Richard&password=888888 */ @GetMapping(path = "/deleteByUserNameAndPassword") @ResponseBody public String deleteByUserNameAndPassword(@RequestParam String userName, @RequestParam String password) { StringBuffer retBuf = new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(userName, password); retBuf.append("User data has been deleted successfully."); return retBuf.toString(); } }"); } return retBuf.toString(); } /* * Exemple d'URL de mappage :* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =nouveau StringBuffer(); List
"); } } if (retBuf.length() ==0) { retBuf.append("Aucun enregistrement trouvé."); } return retBuf.toString(); } /* * Exemple d'URL de mappage :* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String nom d'utilisateur, @RequestParam String mot de passe, @RequestParam String email) { StringBuffer retBuf =new StringBuffer(); List
3.3 Compteutilisateur.java
Il s'agit de la classe Java de l'entité qui sera mappée à la table MySQL user_account . Veuillez noter l'identifiant la stratégie de génération doit être GenerationType.IDENTITY , si vous utilisez Generation.AUTO et la colonne d'ID de table MySQL est définie sur l'auto-incrémentation, une erreur sera renvoyée.
package com.dev2qa.example.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; /* Map this entity class to user_account table. */ @Entity(name = "user_account") public class UserAccount { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @javax.persistence.Column(name = "user_name") private String username; private String password; private String email; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
3.4 UserAccountRepository.java
Il s'agit de l'interface de référentiel JPA de données de démarrage Spring personnalisée qui étend CrudRepository . Il vous suffit de définir les méthodes associées, puis le framework Spring exécutera automatiquement la commande SQL associée pour implémenter la méthode. Cela rend le codage plus rapide.
package com.dev2qa.example.repository; import java.util.List; import org.springframework.data.repository.CrudRepository; import org.springframework.transaction.annotation.Transactional; import com.dev2qa.example.entity.UserAccount; public interface UserAccountRepository extends CrudRepository<UserAccount, Long> { /* * Get user list by user name. Please note the format should be * findBy<column_name>. */ List<UserAccount> findByUsername(String username); /* * Get user list by user name and password. Please note the format should be * findBy<column_name_1>And<column_name_2>. */ List<UserAccount> findByUsernameAndPassword(String username, String password); @Transactional void deleteByUsernameAndPassword(String username, String password); @Transactional void deleteByUsername(String username); }
3.5 applications.propriétés
Il s'agit du fichier de ressources qui contient les données de connexion à la source de données MySQL JDBC utilisées par l'exemple.
# MySQL jdbc connection url. spring.datasource.url=jdbc:mysql://localhost:3306/dev2qa_example # MySQL jdbc driver class name. spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver # MySQL database username and password spring.datasource.username=root spring.datasource.password=root
3.6 pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>SpringBootCRUDMySQL</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringBootCRUDMySQL</name> <description>Spring boot access mysql with crud operation.</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.7 Exécutez l'exemple.
- Cliquez avec le bouton droit sur le nom du projet.
- Cliquez sur Exécuter en tant que —> Spring Boot App élément de menu dans la liste du menu contextuel.
- Après le démarrage de l'application, saisissez l'URL de mappage pour le UserAccountController associé méthode de classe Java dans un navigateur Web pour voir le résultat.
4. Questions et réponses.
4.1 Les méthodes de démarrage Spring findAll, findById, deleteById renvoient toutes des résultats vides.
- Je veux utiliser Spring boot + MySQL pour implémenter une application REST qui effectuera des actions CRUD pour manipuler une table MySQL. Mais je trouve quand j'exécute le findAll() méthode, elle renvoie une liste vide, ce n'est pas ce que j'attends. Lorsque j'exécute le findById() méthode, elle renvoie le message d'erreur java.util.NoSuchElementException :Aucune valeur présente . Et quand j'effectue une action de suppression par la méthode de démarrage de printemps deleteById() , il me dit aussi que Aucune entité de classe org.dev2qa.entity.Article avec l'id 10 n'existe ! Il semble que ma table de base de données soit vide, mais ce n'est pas le cas. Dans quel cas ces erreurs peuvent-elles se produire ?
- Ma classe de référentiel personnalisé étend le JpaRepository classe, et son findAll() renvoie également une liste vide. Ma base de données est également la base de données MySql. Lorsque j'ajoute un enregistrement dans la base de données MySQL, le findAll() méthode renvoie [{}] , et lorsque j'ajoute deux enregistrements dans la base de données MySQL, le findAll() méthode renvoie [{},{}] . Le numéro d'élément de la liste est correct mais les données de l'élément sont vides, ce n'est pas correct. Est-ce que quelqu'un peut m'aider? Merci beaucoup.
- Si les propriétés de votre classe d'entité ne sont pas publiques, cette erreur peut se produire. Vous devez d'abord déclarer les propriétés de la classe d'entité avec le @Column L'annotation et la déclaration des propriétés peuvent être privées, puis ajoutez la méthode getters et setters à ces propriétés et rendez la méthode getters et setters publique. Après cela, le JpaRepository peut créer un objet entité et remplir les propriétés de l'objet avec les données lues à partir de la base de données MySQL. Et votre findAll() méthode ne retournera pas du tout une liste vide.
Référence
- Comment installer MySQL sur Ubuntu
- Résoudre l'erreur "dbname.hibernate_sequence" n'existe pas dans la table Spring Boot JPA