1. 程式人生 > 程式設計 >Spring Boot實戰(三):Spring Boot使用Spring Data Jpa對MySQL資料庫進行CRUD操作

Spring Boot實戰(三):Spring Boot使用Spring Data Jpa對MySQL資料庫進行CRUD操作

Spring Boot實戰(一):只需兩步!Eclipse+Maven快速構建第一個Spring Boot專案構建了第一個Spring Boot專案。

Spring Boot實戰(二):Spring Boot連線MySQL資料庫連線了MySQL資料庫。

本文在之前的基礎上,使用Spring Data Jpa對MySQL資料庫進行CRUD——增加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete) 操作。

Spring Data Jpa

JPA是什麼?看看百度怎麼說。JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體

物件持久化到資料庫中。

JPA的總體思想和現有Hibernate、TopLink、JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:

  • ORM對映元資料

JPA支援XML和JDK5.0註解兩種元資料的形式,元資料描述物件和表之間的對映關係,框架據此將實體物件持久化到資料庫表中;

  • API

用來操作實體物件,執行CRUD操作,框架在後臺替代我們完成所有的事情,開發者從繁瑣的JDBC和SQL程式碼中解脫出來。

  • 查詢語言

這是持久化操作中很重要的一個方面,通過面向物件而非面向資料庫的查詢語言查詢資料,避免程式的SQL語句緊密耦合。

Spirng Data Jpa是spring提供的一套簡化JPA開發的框架,按照約定好的“方法命名規則”寫Dao層介面,就可以在不寫介面實現的情況下,實現對資料庫的訪問和操作。

在學習的過程中,查詢了許多資料,我覺得部落格園的這篇總結的挺好:spring boot(五):spring data jpa的使用

下面正式開始CRUD:

增加(Create)

在UserController.java中新增方法:

    @RequestMapping("/addUser")
    @ResponseBody
    public User addUser(String userName,String PassWord) {
        User user = new User();
        user.setUserName(userName);
        user.setPassWord(PassWord);
        userRepository.save(user);
        return
user; } 複製程式碼

使用Postman訪問http://localhost:8080//user/addUser?userName=Laplace&PassWord=math

資料庫裡面增加了一條id為5,username為Laplace,password為math的記錄:

image

為了方便查詢,再利用相同的操作插入一些資料。

查詢(Retrieve)

上一篇已經完成了簡單的findAll和findByUserName。這裡進行一些自定義查詢操作。

Spring data 大部分的SQL都可以根據方法名定義的方式來實現,也支援自己寫SQL語句來查詢。

在SQL的查詢方法上面使用@Query註解,如涉及到刪除和修改在需要加上@Modifying.也可以根據需要新增 @Transactional 對事物的支援。

例如查詢id大於等於6的記錄,SQL語句:SELECT * FROM USER t WHERE t.id >= 6,這條語句在Navicat中新建查詢中執行是沒有問題的,新增到Dao中卻是有問題的,會丟擲異常:

java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List

在Dao中新增:

    @Query("SELECT * FROM USER t WHERE t.id >= 6")
    List<User> getUser();
複製程式碼

這是由於Jpa無法自動完成查詢結果到自定義實體的對映。需要改成下面這個樣子的,寫實體類的路徑,From後面加的不是表的名字,而是對應的實體類的名字

    @Query("SELECT new  com.example.demo.domain.User(t.id,t.userName,t.passWord) FROM  User t WHERE t.id >= 6")
    List<User> getUser();
複製程式碼

還需要在實體類User.java中間新增對應的構造方法(與上面SQL語句中的保持一致),才能夠返回實體類的物件的:

    public User(Long id,String userName,String passWord) {
        super();
        this.id = id;
        this.userName = userName;
        this.passWord = passWord;
    }
複製程式碼

userController.java 中的內容如下:

    @RequestMapping("/getUser")
    public List<User> getUser() {
        List<User> res = userRepository.getUser();
        return res;
    }
複製程式碼

使用Postman訪問http://localhost:8080//user/getUser

image

這是資料庫中的內容:

image

更新(Update)

更新可以使用save方法;這裡使用自定義SQL語句進行更新,試用一下@Modifying註解。

Dao:

    @Modifying
    @Query("UPDATE User u SET u.userName = ?1 WHERE u.id = ?2")
    void updateUserNameById(String userName,Long id);
複製程式碼

Controller:

    @RequestMapping("/updateUserNameById")
    @Transactional
    public String updateUserNameById(@RequestParam("name")  String name,@RequestParam("id") Long id) {
        userRepository.updateUserNameById(name,id);
        return "更新成功";
    }
複製程式碼

使用Postman訪問http://localhost:8080//user/updateUserNameById?name=AAAAAA&id=6

image

可以看到資料庫發生了改變:

image

刪除(Delete)

根據id刪除記錄,直接在Controller中新增:

    @RequestMapping("/deleteUserById")
    public String deleteUserById(@RequestParam("id") Long id) {
        userRepository.deleteById(id);
        return "刪除成功";
    }
複製程式碼

使用Postman訪問http://localhost:8080//user/deleteUserById?id=11

image

可以完成刪除操作:

image

總結

本文使用Spring Boot JPA進行資料操作,不難發現,使用JPA可以大量減少Dao層程式碼,提升開發效率。