Spring Boot實戰(三):Spring Boot使用Spring Data Jpa對MySQL數據庫進行CRUD操做

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

Spring Boot實戰(二):Spring Boot鏈接MySQL數據庫鏈接了MySQL數據庫。java

本文在以前的基礎上,使用Spring Data Jpa對MySQL數據庫進行CRUD——增長(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete) 操做。spring

Spring Data Jpa

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

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

  • ORM映射元數據

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

  • API

用來操做實體對象,執行CRUD操做,框架在後臺替代咱們完成全部的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。dom

  • 查詢語言

這是持久化操做中很重要的一個方面,經過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。post

Spirng Data Jpa是spring提供的一套簡化JPA開發的框架,按照約定好的「方法命名規則」寫Dao層接口,就能夠在不寫接口實現的狀況下,實現對數據庫的訪問和操做。學習

在學習的過程當中,查詢了許多資料,我以爲博客園的這篇總結的挺好:spring boot(五):spring data jpa的使用this

下面正式開始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層代碼,提高開發效率。

相關文章
相關標籤/搜索