Tento příklad vám řekne, jak používat jarní spouštěcí data JPA k implementaci operace vkládání, aktualizace, mazání a výběru databázové tabulky v databázové tabulce MySQL. S spring boot data JPA byl příkaz pro operaci databázové tabulky zabalen do metody, stačí vytvořit rozhraní Java, které rozšíří základní rozhraní JPA Repository s jarními bootovacími daty (například CrudRepository ), pak stačí definovat metodu operace databázové tabulky (například findBy
1. Vytvořte tabulku databáze MySQL.
- Vytvořte databázi MySQL s názvem dev2qa_example . Výchozí řazení databáze by měl být utf8 – utf8_bin .
VYTVOŘTE SCHÉMA `dev2qa_example` VÝCHOZÍ SADA ZNAKŮ utf8 COLLATE utf8_bin;
- Vytvořte tabulku user_account ve výše uvedeném příkladu_dev2qa databázi s níže uvedeným příkazem SQL. ID sloupec by měl být AI (automatizovaný přírůstek), jinak bude vyvolána chyba Spring Boot JPA Tabulka 'dbname.hibernate_sequence' Neexistuje.
CREATE TABLE `dev2qa_example`.`user_account` ( `id` INT NOT NULL AUTO_INCREMENT, `user_name` VARCHAR (100) NULL, `heslo` VARCHAR(100) NULL, `e-mail` VARCHAR(100) NULL, PRIMÁRNÍ KLÍČ (`id`))ENGINE =InnoDBDEFAULT CHARACTER SET =utf8COLLATE =utf8_bin;
2. Vytvořte projekt Spring Boot.
- Spusťte sadu jarních nástrojů, klikněte na Soubor —> Nový —> Spring Starter Project položka nabídky, kterou otevřete pod Novým jarním začátečnickým projektem kouzelník. Zadejte související informace o projektu, jak je uvedeno níže. A klikněte na tlačítko Další.
- Přidat JPA , MySQL, a Web knihovny v průvodci závislostmi. A klikněte na Dokončit tlačítko pro dokončení inicializace projektu.
3. Spring Boot JPA CRUD ukázkové soubory projektu.
Níže jsou zdrojové soubory v tomto projektu. Představíme je jeden po druhém.
3.1 SpringBootCrudMySqlApplication.java
Toto je příklad jarního spouštění začínající třídou Java. Bude načten a spuštěn jako první v jarní spouštěcí aplikaci.
package com.dev2qa.example;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.context.annotation.ComponentScan;import.org.context.springframework. Configuration;//@SpringBootApplication@Configuration@ComponentScan(basePackages ={ "com.dev2qa.example" })@EnableAutoConfigurationpublic class SpringBootCrudMySqlApplication { public static void main(String[] args) {SpringApplication,runCargspplication.SpringBootApplication }}
3.2 UserAccountController.java
Toto je jarní třída java řadiče MVC, která mapuje adresu URL uživatelského požadavku na metodu zpracování.
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.ex entity.UserAccount;import com.dev2qa.example.repository.UserAccountRepository;@Controller@RequestMapping(cesta ="/userAccount") veřejná třída UserAccountController { @Autowired UserAccountRepository userAccountRepository; /* * Příklad adresy URL mapování:* http://localhost:8080/userAccount/add?userName=Jerry&password=888888&email=* [email protected] * http://localhost:8080/userAccount/add?userName=88email&pass =* [email protected] */ @GetMapping(cesta ="/add") @ResponseBody public String addUser(@RequestParam String userName, @RequestParam String heslo, @RequestParam String email) { UserAccount userAccount =new UserAccount(); userAccount.setUsername(userName); userAccount.setPassword(heslo); userAccount.setEmail(e-mail); userAccountRepository.save(userAccount); String ret ="Uživatelský účet byl přidán, uživatelské jméno =" + uživatelské jméno + ", heslo =" + heslo + ", email =" + email; návrat ret; } /* * Příklad adresy URL mapování:http://localhost:8080/userAccount/findAll */ @GetMapping(cesta ="/findAll") @ResponseBody public String findAllUser() { StringBuffer retBuf =new StringBuffer(); ListuserAccountList =(List ) userAccountRepository.findAll(); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { retBuf.append("jméno uživatele ="); retBuf.append(userAccount.getUsername()); retBuf.append(", heslo ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Nenalezen zaznam."); } else { retBuf.insert(0, " "); retBuf.append(""); } return retBuf.toString(); } /* * Příklad mapovací adresy URL:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer =new StringBuffer(); ListuserAccountList =(List ) userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { retBuf.append("jméno uživatele ="); retBuf.append(userAccount.getUsername()); retBuf.append(", heslo ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Nenalezen zaznam."); } return retBuf.toString(); } /* * Příklad adresy URL pro mapování:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseName String String UserPassme , @RequestParam String heslo) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(List ) userAccountRepository .findByUsernameAndPassword(userName, password); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { retBuf.append("jméno uživatele ="); retBuf.append(userAccount.getUsername()); retBuf.append(", heslo ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Nenalezen zaznam."); } return retBuf.toString(); } /* * Příklad adresy URL mapování:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String uživatelské jméno, @RequestParam String heslo, @RequestParam String email) { StringBuffer retBuf =new StringBuffer(); ListuserAccountList =userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { userAccount.setUsername(userName); userAccount.setPassword(heslo); userAccount.setEmail(e-mail); userAccountRepository.save(userAccount); } } retBuf.append("Úspěšná aktualizace uživatelských dat."); return retBuf.toString(); } /* * Příklad adresy URL mapování:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String UserBume) {String String jméno_uživatele =new StringBuffer(); userAccountRepository.deleteByUsername(jméno uživatele); retBuf.append("Uživatelská data byla úspěšně smazána."); return retBuf.toString(); } /* * Příklad adresy URL mapování:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @ResponseBodyPassword delete@AndResponseBodyParams public String @RequestParam String password) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(jméno uživatele, heslo); retBuf.append("Uživatelská data byla úspěšně smazána."); return retBuf.toString(); }}
3.3 UserAccount.java
Toto je java třída entity, která bude mapována do tabulky MySQL user_account . Všimněte si prosím id generovat strategii musí být GenerationType.IDENTITY , pokud používáte Generation.AUTO a sloupec ID tabulky MySQL je nastaven na automatické zvýšení, pak bude vyvolána chyba.
package com.dev2qa.example.entity;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;/* Mapujte tuto třídu entity do tabulky uživatelského_účtu. */@Entity(name ="user_account") veřejná třída UserAccount { @Id @GeneratedValue(strategy =GenerationType.IDENTITY) private Long id; @javax.persistence.Column(name ="user_name") private String uživatelské jméno; heslo soukromého řetězce; soukromý řetězec e-mailu; public Long getId() { return id; } public void setId(Dlouhé id) { this.id =id; } public String getUsername() { return username; } public void setUsername(String uživatelské jméno) { this.username =uživatelské jméno; } 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
Toto je vlastní rozhraní úložiště dat JPA na jaře, které rozšiřuje CrudRepository . Stačí definovat související metody a potom jarní rámec automaticky spustí související příkaz SQL k implementaci metody. Díky tomu je kódování rychlejší.
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;veřejné rozhraní UserAccountRepository rozšiřuje CrudRepository{ /* * Získejte seznam uživatelů podle uživatelského jména. Vezměte prosím na vědomí, že formát by měl být * findBy . */ List findByUsername(String username); /* * Získejte seznam uživatelů podle uživatelského jména a hesla. Vezměte prosím na vědomí, že formát by měl být * findBy And . */ List findByUsernameAndPassword(String uživatelské jméno, String heslo); @Transactional void deleteByUsernameAndPassword(String username, String password); @Transactional void deleteByUsername(String username);}
3.5 application.properties
Toto je zdrojový soubor, který obsahuje data připojení zdroje dat MySQL JDBC použitá v příkladu.
# připojení MySQL jdbc url.spring.datasource.url=jdbc:mysql://localhost:3306/dev2qa_example# Název třídy ovladače jdbc MySQL.spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver# MySQL uživatelské jméno a heslo databázespring.datasource.username=rootspring.datasource.password=root
3.6 pom.xml
4.0.0 com.example SpringBootCRUDMySQL 0.0.1-SNAPSHOT jar SpringBootCRUDMySQL Jarní bootovací přístup k mysql s crud operací. 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 Spusťte příklad.
- Klikněte pravým tlačítkem na název projektu.
- Klikněte na Spustit jako —> Aplikace Spring Boot položku nabídky ze seznamu vyskakovací nabídky.
- Po spuštění aplikace zadejte adresu URL mapování pro související UserAccountController metoda třídy java ve webovém prohlížeči, abyste viděli výsledek.
4. Otázka a odpověď.
4.1 Spring boot metody findAll, findById, deleteById všechny vrátí prázdné výsledky.
- Chci použít Spring boot + MySQL k implementaci aplikace REST, která bude provádět akce CRUD pro manipulaci s tabulkou MySQL. Ale najdu, když spustím findAll() metoda, vrací prázdný seznam, to není to, co očekávám. Když spustím findById() metoda, vrátí chybovou zprávu java.util.NoSuchElementException:Žádná hodnota . A když provedu akci odstranění pomocí jarní spouštěcí metody deleteById() , také mi to říká, že Neexistuje žádná entita třídy org.dev2qa.entity.Article s ID 10 ! Zdá se, že moje tabulka databáze je prázdná, ale není. V jakém případě k těmto chybám může dojít?
- Moje třída vlastního úložiště rozšiřuje JpaRepository třída a její findAll() metoda také vrací prázdný seznam. Moje databáze je také databáze MySql. Když přidám jeden záznam do databáze MySQL, findAll() metoda return [{}] a když přidám dva záznamy do databáze MySQL, findAll() metoda return [{},{}] . Číslo prvku seznamu je správné, ale data prvku jsou prázdná, to není správné. Může mi někdo pomoci? Díky moc.
- Pokud vlastnosti vaší třídy entit nejsou veřejné, může dojít k této chybě. Nejprve byste měli deklarovat vlastnosti třídy entity pomocí @Column anotace a deklarace vlastností mohou být soukromé, pak k těmto vlastnostem přidejte metodu getter a setter a udělejte metodu getter a setter veřejnou. Poté může JpaRepository vytvořit objekt entity a naplnit vlastnosti objektu daty načtenými zpět z databáze MySQL. A vaše findAll() metoda vůbec nevrátí prázdný seznam.
Reference
- Jak nainstalovat MySQL na Ubuntu
- Vyřešit chybu Spring Boot JPA Table „dbname.hibernate_sequence“ neexistuje