Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Contoh Spring Boot CRUD Dengan MySQL

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 , hapusDengan, dll) di antarmuka Repositori khusus, dan nama metode harus mengikuti aturan penamaan khusus. Anda tidak perlu menulis perintah SQL di antarmuka Repositori.

1. Buat Tabel Database MySQL.

  1. 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 ;
  2. 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.

  1. 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.
  2. 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 userAccountList =(Daftar) userAccountRepository.findByUsername(namapengguna); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("nama pengguna ="); retBuf.append(userAccount.getUsername()); retBuf.append(", kata sandi ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Tidak ada catatan yang ditemukan."); } kembalikan retBuf.toString(); } /* * Contoh url pemetaan:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(@RequestParam String nama pengguna , @RequestParam String kata sandi) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(List) userAccountRepository .findByUsernameAndPassword(Namapengguna, kata sandi); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("nama pengguna ="); retBuf.append(userAccount.getUsername()); retBuf.append(", kata sandi ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } 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 userAccountList =userAccountRepository.findByUsername(namapengguna); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { userAccount.setUsername(namapengguna); userAccount.setPassword(sandi); userAccount.setEmail(email); userAccountRepository.save(userAccount); } } retBuf.append("Data pengguna berhasil diupdate."); kembalikan retBuf.toString(); } /* * Contoh url pemetaan:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String userName) { StringBuffer retBuf =baru StringBuffer(); userAccountRepository.deleteByUsername(namapengguna); retBuf.append("Data pengguna berhasil dihapus."); kembalikan retBuf.toString(); } /* * Contoh url pemetaan:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @ResponseBody public String deleteByUserNameAndPassword(@NameRequestAndPassword pengguna @RequestParam String kata sandi) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(namapengguna, kata sandi); retBuf.append("Data pengguna berhasil dihapus."); kembalikan retBuf.toString(); }}

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.

  1. Klik kanan nama proyek.
  2. Klik Run As —> Aplikasi Spring Boot item menu dari daftar menu popup.
  3. 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.

  1. 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?
  2. 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.
  3. 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

  1. Cara Menginstal MySQL Di Ubuntu
  2. Selesaikan Spring Boot JPA Table ‘dbname.hibernate_sequence’ Tidak Ada Kesalahan

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan fungsi password_hash dan password_verify PHP 5.5

  2. Cara mereset AUTO_INCREMENT di MySQL

  3. Bagaimana Fungsi REGEX_REPLACE() Bekerja di MySQL

  4. MySQL – Dapatkan Biaya Permintaan Terakhir Menggunakan SHOW STATUS LIKE 'Last_Query_Cost'

  5. Bagaimana menjadwalkan prosedur tersimpan di MySQL