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

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

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的記錄:

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

查詢(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

這是資料庫中的內容:

更新(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

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

刪除(Delete)

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

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

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

可以完成刪除操作: