Този пример ще ви каже как да използвате JPA данни за пружинно зареждане, за да приложите операция за вмъкване, актуализиране, изтриване и избор на таблица на база данни в таблицата на базата данни на MySQL. С данните за пружинно зареждане JPA командата за операция на таблицата на базата данни е обвита в метод, просто трябва да създадете java интерфейс, който разширява основния интерфейс на JPA репозитория на данни за пружинно зареждане (например CrudRepository ), тогава трябва само да дефинирате метод на работа с таблица на база данни (като findBy<име на колона> , изтриванеПо<име на колона>, и т.н.) в персонализирания интерфейс на хранилището, а името на метода трябва да следва специални правила за именуване. Не е необходимо да пишете SQL команди в интерфейса на хранилището.
1. Създайте MySQL таблица с база данни.
- Създайте MySQL база данни с името dev2qa_example . Сравняване по подразбиране на базата данни трябва да бъде utf8 – utf8_bin .
CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
- Създайте таблица user_account в горния dev2qa_example база данни със следния SQL израз. Идентитът колоната трябва да е AI ( автоматизирано увеличение), в противен случай ще бъде изхвърлена грешка Spring Boot JPA Table 'dbname.hibernate_sequence' не съществува.
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. Създайте Spring Boot проект.
- Стартирайте пакета пружинни инструменти, щракнете върху Файл —> Нов —> Spring Starter Project елемент от менюто, който да се отвори под Нов проект Spring Starter съветник. Въведете свързана с проекта информация, както е по-долу. И щракнете върху бутона Напред.
- Добавете JPA , MySQL, и Мрежата библиотеки в съветника за зависимости. И щракнете върху Край бутон, за да завършите инициализацията на проекта.
3. Spring Boot JPA CRUD Примерни проектни файлове.
По-долу са изходните файлове в този проект. Ще ги представим един по един.
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
Това е примерът за пролетно зареждане при стартиране на java клас. Той ще бъде зареден и стартиран първо в приложението за зареждане на пружината.
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
Това е java класът на пружинния MVC контролер, който ще съпоставя URL адреса на потребителската заявка към метода на обработка.
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(); } }"); } връщане retBuf.toString(); } /* * Пример за съпоставяне на URL адрес:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody публичен низ findByName(@RequestParam String userName) {B StufBufferName =нов StringBuffer(); List
"); } } if (retBuf.length() ==0) { retBuf.append("Няма намерен запис."); } връщане retBuf.toString(); } /* * Пример за съпоставяне на URL адрес:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody публичен низ updateUser( @RequestParam String потребителско име, @RequestParam String парола, @RequestParam String имейл) { StringBuffer retBuf =new StringBuffer(); Списък
3.3 UserAccount.java
Това е java класът на обекта, който ще бъде съпоставен с MySQL таблица user_account . Моля, обърнете внимание на id стратегията за генериране трябва да е GenerationType.IDENTITY , ако използвате Generation.AUTO и колоната с идентификатор на таблицата на MySQL е настроена на автоматично увеличение, след което ще бъде изведена грешка.
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
Това е персонализираният интерфейс на JPA за хранилище с данни за пружинно зареждане, който разширява CrudRepository . Просто трябва да дефинирате свързани методи, след което пружинната рамка автоматично ще изпълни свързаната SQL команда, за да приложи метода. Това прави кодирането по-бързо.
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 application.properties
Това е ресурсният файл, който съдържа данни за връзка с MySQL JDBC източник на данни, използвани в примера.
# 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 Изпълнете примера.
- Щракнете с десния бутон върху името на проекта.
- Щракнете върху Изпълни като —> Spring Boot App елемент от менюто от списъка с изскачащи менюта.
- След стартирането на приложението въведете URL адреса за съпоставяне за свързания UserAccountController java клас метод в уеб браузър, за да видите резултата.
4. Въпрос и отговор.
4.1 Методите за пролетно зареждане findAll, findById, deleteById всички връщат празни резултати.
- Искам да използвам Spring boot + MySQL, за да внедря REST приложение, което ще изпълнява CRUD действия за манипулиране на MySQL таблица. Но намирам, когато изпълня findAll() метод, той връща празен списък, това не е това, което очаквам. Когато изпълня findById() метод, той връща съобщението за грешка java.util.NoSuchElementException:Няма налична стойност . И когато извърша действие за изтриване чрез метода на пружинно зареждане deleteById() , също така ми казва, че Не съществува обект от клас org.dev2qa.entity.Article с идентификатор 10 ! Изглежда моята таблица на базата данни е празна, но не е така. В какъв случай могат да възникнат тези грешки?
- Моят персонализиран клас хранилище разширява JpaRepository клас и неговия findAll() методът също връща празен списък. Моята база данни също е базата данни MySql. Когато добавя един запис в MySQL базата данни, findAll() метод връщане [{}] и когато добавя два записа в базата данни MySQL, findAll() метод връщане [{},{}] . Номерът на елемента от списъка е правилен, но данните за елемента са празни, това не е правилно. Може ли някой да ми помогне? Благодаря много.
- Ако свойствата на вашия клас обект не са публични, тази грешка може да възникне. Първо трябва да декларирате свойствата на класа на обекта с @Column анотацията и декларацията на свойствата могат да бъдат частни, след което добавете метода на getters и setter към тези свойства и направете метода getters и setters публичен. След това JpaRepository може да създаде обект на обект и да попълни свойствата на обекта с данните, прочетени обратно от базата данни MySQL. И вашият findAll() методът изобщо няма да върне празен списък.
Справка
- Как да инсталирате MySQL на Ubuntu
- Разрешаване на грешка в JPA таблицата на Spring Boot „dbname.hibernate_sequence“ не съществува