Questo esempio ti spiegherà come utilizzare i dati di avvio primaverile JPA per implementare l'operazione di inserimento, aggiornamento, eliminazione e selezione della tabella del database sulla tabella del database MySQL. Con i dati di avvio primaverile JPA il comando operativo della tabella del database è stato inserito in un metodo, devi solo creare un'interfaccia java che estenda l'interfaccia del repository JPA dei dati di avvio primaverili di base (ad esempio CrudRepository ), quindi devi solo definire il metodo operativo della tabella del database (come findBy
1. Crea una tabella del database MySQL.
- Crea un database MySQL con il nome dev2qa_example . Le confrontazioni predefinite del database dovrebbe essere utf8 – utf8_bin .
CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
- Crea una tabella account_utente in dev2qa_example sopra database con la seguente istruzione SQL. L'id la colonna dovrebbe essere AI ( incremento automatico ), altrimenti verrà generata una tabella JPA Spring Boot di errore 'dbname.hibernate_sequence' non esiste.
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. Crea progetto Spring Boot.
- Avvia la suite di strumenti Spring, fai clic su File —> Nuovo —> Progetto Spring Starter voce di menu da aprire sotto New Spring Starter Project procedura guidata. Inserisci le informazioni relative al progetto come di seguito. E fai clic sul pulsante Avanti.
- Aggiungi APP , MySQL, e Web librerie nella procedura guidata delle dipendenze. E fai clic su Fine per completare l'inizializzazione del progetto.
3. File di progetto di esempio di Spring Boot JPA CRUD.
Di seguito sono riportati i file di origine in questo progetto. Li presenteremo uno per uno.
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
Questo è l'esempio di avvio primaverile che avvia la classe java. Verrà caricato ed eseguito per primo nell'applicazione 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
Questa è la classe java del controller MVC di primavera che mapperà l'URL della richiesta dell'utente al metodo di elaborazione.
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(); } }"); } restituisce retBuf.toString(); } /* * Esempio di mappatura dell'URL:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =nuovo StringBuffer(); List
"); } } if (retBuf.length() ==0) { retBuf.append("Nessun record trovato."); } restituisce retBuf.toString(); } /* * Esempio di mappatura dell'URL:* 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
3.3 UserAccount.java
Questa è la classe java dell'entità che verrà mappata sulla tabella MySQL user_account . Si prega di notare l'id la strategia di generazione deve essere GenerationType.IDENTITY , se utilizzi Generazione.AUTO e la colonna dell'ID della tabella MySQL è impostata sull'incremento automatico, verrà generato un errore.
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
Questa è l'interfaccia del repository JPA dei dati di avvio primaverile personalizzata che estende CrudRepository . Devi solo definire i metodi correlati, quindi il framework di primavera eseguirà automaticamente il relativo comando SQL per implementare il metodo. Ciò rende la codifica più rapida.
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 proprietà.applicazione
Questo è il file di risorse che contiene i dati di connessione all'origine dati JDBC MySQL utilizzati dall'esempio.
# 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 Esegui l'esempio.
- Fai clic con il pulsante destro del mouse sul nome del progetto.
- Fai clic su Esegui come —> App Spring Boot voce di menu dall'elenco dei menu a comparsa.
- Dopo l'avvio dell'applicazione, inserisci l'URL di mappatura per il relativo UserAccountController metodo della classe java in un browser web per vedere il risultato.
4. Domanda e risposta.
4.1 I metodi di avvio primaverili findAll, findById, deleteById all restituiscono risultati vuoti.
- Voglio usare Spring boot + MySQL per implementare un'applicazione REST che eseguirà azioni CRUD per manipolare una tabella MySQL. Ma trovo quando eseguo findAll() metodo, restituisce un elenco vuoto, questo non è quello che mi aspetto. Quando eseguo findById() metodo, restituisce il messaggio di errore java.util.NoSuchElementException:nessun valore presente . E quando eseguo un'azione di eliminazione con il metodo di avvio primaverile deleteById() , mi dice anche che Non esiste alcuna entità di classe org.dev2qa.entity.Article con ID 10 ! Sembra che la mia tabella del database sia vuota ma non lo è. In che caso possono verificarsi questi errori?
- La mia classe di repository personalizzata estende JpaRepository class e il relativo findAll() il metodo restituisce anche un elenco vuoto. Il mio database è anche il database MySql. Quando aggiungo un record nel database MySQL, findAll() metodo di ritorno [{}] e quando aggiungo due record nel database MySQL, findAll() metodo di ritorno [{},{}] . Il numero dell'elemento dell'elenco è corretto ma i dati dell'elemento sono vuoti, questo non è corretto. Qualcuno può darmi un aiuto? Grazie mille.
- Se le proprietà della tua classe di entità non sono pubbliche, potrebbe verificarsi questo errore. Devi prima dichiarare le proprietà della classe di entità con @Column l'annotazione e la dichiarazione delle proprietà possono essere private, quindi aggiungere il metodo getter e setter a tali proprietà e rendere pubblico il metodo getter e setter. Successivamente, JpaRepository può creare un oggetto entità e popolare le proprietà dell'oggetto con i dati letti dal database MySQL. E il tuo findAll() il metodo non restituirà affatto un elenco vuoto.
Riferimento
- Come installare MySQL su Ubuntu
- Risolvi l'errore della tabella JPA di Spring Boot "dbname.hibernate_sequence"