Contoh ini akan memberitahu Anda bagaimana menggunakan spring boot data JPA untuk mengimplementasikan operasi insert, update, delete dan pilih database table pada tabel database MySQL. Dengan spring boot data JPA, perintah operasi tabel database telah digabungkan ke suatu metode, Anda hanya perlu membuat antarmuka java yang memperluas antarmuka data spring boot JPA Repository (misalnya CrudRepository ), maka Anda hanya perlu mendefinisikan metode operasi tabel database ( seperti findBy
1. Buat Tabel Database MySQL.
- Buat database MySQL dengan nama dev2qa_example . pengumpulan default database harus utf8 – utf8_bin .
CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
- Buat tabel user_account dalam dev2qa_example di atas database dengan pernyataan SQL di bawah ini. id kolom harus AI ( peningkatan otomatis ), jika tidak, kesalahan Spring Boot JPA Table 'dbname.hibernate_sequence' Don't Exist akan ditampilkan.
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. Buat Proyek Boot Musim Semi.
- Luncurkan rangkaian alat pegas, klik File —> Baru —> Proyek Pemula Musim Semi item menu untuk dibuka di bawah Proyek Pemula Musim Semi Baru Penyihir. Masukkan info proyek terkait seperti di bawah ini. Dan klik tombol Berikutnya.
- Tambahkan JPA , MySQL, dan Web perpustakaan di wizard dependensi. Dan klik tombol Selesai tombol untuk menyelesaikan inisialisasi proyek.
3. Contoh File Proyek JPA CRUD Spring Boot.
Di bawah ini adalah file sumber dalam proyek ini. Kami akan memperkenalkan mereka satu per satu.
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
Ini adalah contoh boot musim semi yang memulai kelas Java. Ini akan dimuat dan dijalankan terlebih dahulu di aplikasi booting pegas.
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
Ini adalah kelas java pengontrol MVC pegas yang akan memetakan url permintaan pengguna ke metode pemrosesan.
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(); } }"); } kembalikan retBuf.toString(); } /* * Contoh url pemetaan:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =new StringBuffer(); List
"); } } if (retBuf.length() ==0) { retBuf.append("Tidak ada catatan yang ditemukan."); } kembalikan retBuf.toString(); } /* * Contoh url pemetaan:* 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
Ini adalah kelas entitas java yang akan dipetakan ke tabel MySQL user_account . Harap perhatikan id menghasilkan strategi harus GenerationType.IDENTITY , jika Anda menggunakan Generation.AUTO dan kolom id tabel MySQL diatur ke peningkatan otomatis, maka kesalahan akan muncul.
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
Ini adalah antarmuka penyimpanan JPA data boot musim semi khusus yang memperluas CrudRepository . Anda hanya perlu mendefinisikan metode terkait maka kerangka pegas akan secara otomatis menjalankan perintah SQL terkait untuk mengimplementasikan metode tersebut. Ini membuat pengkodean lebih cepat.
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
Ini adalah file sumber daya yang berisi data koneksi sumber data MySQL JDBC yang digunakan oleh contoh.
# 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 Jalankan Contoh.
- Klik kanan nama proyek.
- Klik Run As —> Aplikasi Spring Boot item menu dari daftar menu popup.
- Setelah aplikasi dimulai, masukkan url pemetaan untuk UserAccountController terkait metode kelas java di browser web untuk melihat hasilnya.
4. Tanya Jawab.
4.1 Metode booting pegas findAll, findById, deleteById semuanya mengembalikan hasil kosong.
- Saya ingin menggunakan Spring boot + MySQL untuk mengimplementasikan aplikasi REST yang akan melakukan tindakan CRUD untuk memanipulasi tabel MySQL. Tetapi saya menemukan ketika saya menjalankan findAll() metode, ini mengembalikan daftar kosong, ini bukan yang saya harapkan. Saat saya menjalankan findById() metode, ini mengembalikan pesan kesalahan java.util.NoSuchElementException:Tidak ada nilai yang ada . Dan ketika saya melakukan tindakan penghapusan dengan metode booting pegas deleteById() , ini juga memberi tahu saya bahwa Tidak ada entitas kelas org.dev2qa.entity.Article dengan id 10 ! Sepertinya tabel database saya kosong tetapi tidak. Dalam kasus apa kesalahan ini bisa terjadi?
- Kelas repositori kustom saya memperluas JpaRepository kelas, dan findAll() metode juga mengembalikan daftar kosong. Database saya adalah database MySql juga. Saat saya menambahkan satu record di database MySQL, findAll() pengembalian metode [{}] , dan ketika saya menambahkan dua catatan di database MySQL, findAll() pengembalian metode [{},{}] . Nomor elemen daftar benar tetapi data elemen kosong ini tidak benar. Adakah yang bisa memberi saya bantuan? Terima kasih banyak.
- Jika properti kelas entitas Anda tidak bersifat publik, kesalahan ini dapat terjadi. Anda harus terlebih dahulu mendeklarasikan properti kelas entitas dengan @Column anotasi dan deklarasi properti dapat bersifat pribadi, lalu tambahkan metode getter dan setter ke properti tersebut dan buat metode getter dan setter menjadi publik. Setelah ini, JpaRepository dapat membuat objek entitas dan mengisi properti objek dengan data yang dibaca kembali dari database MySQL. Dan findAll() . Anda metode tidak akan mengembalikan daftar kosong sama sekali.
Referensi
- Cara Menginstal MySQL Di Ubuntu
- Selesaikan Spring Boot JPA Table ‘dbname.hibernate_sequence’ Tidak Ada Kesalahan