Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Ví dụ về Spring Boot CRUD với MySQL

Ví dụ này sẽ cho bạn biết cách sử dụng dữ liệu khởi động mùa xuân JPA để thực hiện thao tác chèn, cập nhật, xóa và chọn bảng cơ sở dữ liệu trên bảng cơ sở dữ liệu MySQL. Với dữ liệu khởi động mùa xuân JPA, lệnh hoạt động bảng cơ sở dữ liệu đã được gói thành một phương thức, bạn chỉ cần tạo giao diện java mở rộng dữ liệu khởi động mùa xuân cơ bản Giao diện kho lưu trữ JPA (ví dụ: CrudRepository ), sau đó bạn chỉ cần xác định phương thức hoạt động của bảng cơ sở dữ liệu (chẳng hạn như findBy , deleteBy , vv) trong giao diện Kho lưu trữ tùy chỉnh và tên phương thức phải tuân theo các quy tắc đặt tên đặc biệt. Bạn không cần phải viết các lệnh SQL trong giao diện Kho lưu trữ.

1. Tạo Bảng cơ sở dữ liệu MySQL.

  1. Tạo cơ sở dữ liệu MySQL với tên dev2qa_example . Đối chiếu mặc định của cơ sở dữ liệu phải là utf8 - utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Tạo bảng user_account trong dev2qa_example ở trên cơ sở dữ liệu với câu lệnh SQL bên dưới. id cột phải là AI (tự động tăng), nếu không sẽ xuất hiện lỗi Spring Boot JPA Table 'dbname.hibernate_sequence' Doesn’t Exist.
    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. Tạo dự án khởi động mùa xuân.

  1. Khởi chạy bộ công cụ mùa xuân, nhấp vào Tệp -> Mới -> Dự án Spring Starter mục menu để mở bên dưới Dự án khởi động mùa xuân mới Thuật sĩ. Nhập thông tin dự án liên quan như bên dưới. Và nhấp vào nút Tiếp theo.
  2. Thêm JPA , MySQL, Web thư viện trong trình hướng dẫn phụ thuộc. Và nhấp vào nút Hoàn tất để hoàn tất quá trình khởi tạo dự án.

3. Tệp dự án mẫu JPA CRUD Spring Boot.

Dưới đây là các tệp nguồn trong dự án này. Chúng tôi sẽ giới thiệu từng cái một.

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

Đây là ví dụ khởi động mùa xuân bắt đầu lớp java. Nó sẽ được tải và chạy đầu tiên trong ứng dụng khởi động mùa xuân.

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

Đây là lớp java bộ điều khiển MVC mùa xuân sẽ ánh xạ url yêu cầu của người dùng với phương thức xử lý.

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();
    }

}
"); } trả về retBuf.toString (); } / * * Ánh xạ url exmaple:* http:// localhost:8080 / userAccount / findByName? UserName =Jerry * / @GetMapping (path ="/ findByName") @ResponseBody public String findByName (@RequestParam String userName) {StringfBuffer =new StringBuffer (); List userAccountList =(List ) 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 ("Không tìm thấy bản ghi."); } trả về retBuf.toString (); } / * * Lập bản đồ url exmaple:* http:// localhost:8080 / userAccount / findByNameAndPassword? UserName =Jerry &* password =888888 * / @GetMapping (path ="/ findByNameAndPassword") @ResponseBody public String findByNameAndestName , @RequestParam String password) {StringBuffer retBuf =new StringBuffer (); List userAccountList =(List ) 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 ("
"); }} if (retBuf.length () ==0) {retBuf.append ("Không tìm thấy bản ghi."); } trả về retBuf.toString (); } / * * Ánh xạ 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 (); Danh sách userAccountList =userAccountRepository.findByUsername (userName); if (userAccountList! =null) {for (UserAccount userAccount:userAccountList) {userAccount.setUsername (userName); userAccount.setPassword (mật khẩu); userAccount.setEmail (email); userAccountRepository.save (userAccount); }} retBuf.append ("Cập nhật dữ liệu người dùng thành công."); trả về retBuf.toString (); } / * * Ánh xạ url exmaple:* http:// localhost:8080 / userAccount / deleteByUserName? UserName =Richard * / @GetMapping (path ="/ deleteByUserName") @ResponseBody public String deleteByUserName (@RequestParam String userName) { =new StringBuffer (); userAccountRepository.deleteByUsername (userName); retBuf.append ("Dữ liệu người dùng đã được xóa thành công."); trả về retBuf.toString (); } / * * Bản đồ url exmaple:* http:// localhost:8080 / userAccount / deleteByUserNameAndPassword? UserName =* Richard &password =888888 * / @GetMapping (path ="/ deleteByUserNameAndPassword") @ResponseBody public String deleteByestUserNameName @RequestParam String password) {StringBuffer retBuf =new StringBuffer (); userAccountRepository.deleteByUsernameAndPassword (userName, mật khẩu); retBuf.append ("Dữ liệu người dùng đã được xóa thành công."); trả về retBuf.toString (); }}

3.3 UserAccount.java

Đây là lớp java thực thể sẽ được ánh xạ tới bảng MySQL user_account . Vui lòng lưu ý id chiến lược tạo phải là GenerationType.IDENTITY , nếu bạn sử dụng Generation.AUTO và cột id bảng MySQL được đặt thành tự động tăng, sau đó sẽ xuất hiện lỗi.

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

Đây là giao diện kho lưu trữ JPA dữ liệu khởi động mùa xuân tùy chỉnh mở rộng CrudRepository . Bạn chỉ cần xác định các phương thức liên quan sau đó Spring framework sẽ tự động chạy lệnh SQL liên quan để triển khai phương thức. Điều này làm cho việc viết mã nhanh hơn.

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

Đây là tệp tài nguyên chứa dữ liệu kết nối nguồn dữ liệu MySQL JDBC được ví dụ sử dụng.

# 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 Chạy ví dụ.

  1. Nhấp chuột phải vào tên dự án.
  2. Nhấp vào Run As -> Spring Boot App mục menu từ danh sách menu bật lên.
  3. Sau khi khởi động ứng dụng, hãy nhập url ánh xạ cho UserAccountController có liên quan phương thức lớp java trong trình duyệt web để xem kết quả.

4. Hỏi &Đáp.

4.1 Các phương thức khởi động mùa xuân findAll, findById, deleteById đều trả về kết quả trống.

  1. Tôi muốn sử dụng Spring boot + MySQL để triển khai ứng dụng REST sẽ thực hiện các hành động CRUD để thao tác bảng MySQL. Nhưng tôi thấy khi tôi thực thi findAll () , nó trả về một danh sách trống, đây không phải là điều tôi mong đợi. Khi tôi thực thi findById () , nó trả về thông báo lỗi java.util.NoSuchElementException:Không có giá trị nào . Và khi tôi thực hiện hành động xóa bằng phương pháp khởi động mùa xuân thì deleteById () , nó cũng cho tôi biết rằng Không tồn tại thực thể lớp org.dev2qa.entity.Article có id 10 ! Có vẻ như bảng cơ sở dữ liệu của tôi trống nhưng không phải vậy. Những lỗi này có thể xảy ra trong trường hợp nào?
  2. Lớp kho lưu trữ tùy chỉnh của tôi mở rộng JpaRepository findAll () của nó phương thức cũng trả về một danh sách trống. Cơ sở dữ liệu của tôi cũng là cơ sở dữ liệu MySql. Khi tôi thêm một bản ghi trong cơ sở dữ liệu MySQL, findAll () phương thức trả về [{}] và khi tôi thêm hai bản ghi trong cơ sở dữ liệu MySQL, thì findAll () phương thức trả về [{}, {}] . Số phần tử danh sách là đúng nhưng dữ liệu phần tử trống thì điều này không đúng. Bất cứ ai có thể cho tôi một số giúp đỡ? Cảm ơn rất nhiều.
  3. Nếu thuộc tính của lớp thực thể của bạn không công khai, lỗi này có thể xảy ra. Trước tiên, bạn nên khai báo các thuộc tính của lớp thực thể với @Column chú thích và khai báo thuộc tính có thể là riêng tư, sau đó thêm phương thức getters và setters vào các thuộc tính đó và đặt phương thức getters và setters ở chế độ công khai. Sau đó, JpaRepository có thể tạo một đối tượng thực thể và điền vào các thuộc tính của đối tượng với dữ liệu được đọc lại từ cơ sở dữ liệu MySQL. Và findAll () của bạn phương thức sẽ hoàn toàn không trả về một danh sách trống.

Tham khảo

  1. Cách cài đặt MySQL trên Ubuntu
  2. Giải quyết Bảng JPA Spring Boot ‘dbname.hibernate_sequence’ không tồn tại lỗi

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cài đặt MySQL 8 mới nhất trên Debian 10

  2. MySQL MariaDB - Truy vấn sử dụng bảng tạm thời

  3. Danh sách SELECT không nằm trong mệnh đề GROUP BY và chứa cột không được tổng hợp .... không tương thích với sql_mode =only_full_group_by

  4. Cách tôi lưu và truy xuất hình ảnh trên máy chủ của mình trong ứng dụng web java

  5. Loại dữ liệu MySQL nào để sử dụng để lưu trữ các giá trị boolean