1. 程式人生 > 其它 >如何優雅的實現Mysql 增刪改查,看完你就會了

如何優雅的實現Mysql 增刪改查,看完你就會了

接著上期說,上期沒寫一條sql就把資料查詢出來了,那如果要儲存或者更新資料怎麼辦呢?能不能自己寫sql呢?

儲存資料

@GetMapping("save")//儲存資料

public void save(@RequestBody User user){
    userJpa.save(user);
}

在UserController裡面新增上面的方法。使用@RequestBody接收資料,然後呼叫userJpa的save方法儲存資料,接下來我們用postman試下。

執行之後到資料庫去看下資料,資料已經加進來了。

ps:我們資料庫表主鍵生成方式是自增,所以再在呼叫save方法的時候不需要手動指定主鍵。另外我可以看下控制檯的輸出:

Hibernate: insert into user (age, dpt_id, email, head_img, name) values (?, ?, ?, ?, ?)

可以看到後臺其實是執行了sql的。

刪除資料:

@GetMapping("delete")//按主鍵刪除資料

public void delete(@RequestParam("id")Long id){
    userJpa.deleteById(id);
}

postman執行:

localhost:8080/user/delete?id=6

小夥伴們再到資料庫去看下,剛剛新增的那條資料被刪除了,再看看控制檯。

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.dpt_id as dpt_id3_0_0_, user0_.email as email4_0_0_, user0_.head_img as head_img5_0_0_, user0_.name as name6_0_0_ from user user0_ where user0_.id=?
Hibernate: delete from user where id=?

為什麼會有兩條sql呢,其實jpa是先將資料查詢出來判斷是否存在,然後再執行的刪除動作。如果資料不存在會怎麼樣呢?大家可以在執行一遍刪除請求,後臺是不是報錯了?那如果在實際業務中需要刪除那不是要判斷,很麻煩。別急,我們可以自己寫sql刪除,怎麼做呢?接著往下看。

按名稱刪除

UserController新增方法

@GetMapping("deleteByUserName")//按使用者名稱刪除資料
public void deleteByUserName(@RequestParam("name")String name){
    this.userJpa.deleteByName(name);
}

UserJpa新增方法:

@Modifying//告訴jpa這個是update或delete方法,會對資料庫中的資料產生變更

@Query(value = "delete from user where name=:name",nativeQuery = true)//jpa會將:name用引數@Param中的名字替換

public int deleteByName(@Param("name") String name);//引數變數

postman執行請求

localhost:8080/user/deleteByUserName?name=Jone

更新資料:

UserController新增方法

@GetMapping("update")//更新資料

public void update(@RequestParam("id")Long id,@RequestParam("name")String name){
    User user = this.userJpa.findById(id).get();//先更加id將資料load出來
    user.setName(name);//變更資料
    this.userJpa.save(user);//儲存資料
}

postman執行請求

localhost:8080/user/update?id=2&name=Jack123

自己偷偷的看下資料庫,資料變了嗎?

自定義查詢

UserController中新增方法

@GetMapping("findByAge")//按年齡查詢資料

public List<User> findByAge(@RequestParam("age")Integer age){
    return this.userJpa.findByAge(age);
}

UserJpa中新增方法:

@Query(value = "select * from user where age>?1",nativeQuery = true)

public List<User> findByAge(Integer Age);

Postman執行請求:

localhost:8080/user/findByAge?age=20

查詢出來的結果是不是符合預期?jpa就是這麼強大。

下面我們來總結下jpa的常用用法:

    1. 首先需要定義一個介面,並繼承自JpaRepository,並在該介面類上使用@Repository註解,告知springboot這是一個Repository類

    2. 在外部呼叫使用@Resource將該介面注入

    3. 可以使用該jpa介面類中很多自定義的方法,比如:其中加粗字型的是我們在UserJpa中自己定義的方法。

    4. 如果方法不夠我們的業務使用,則可以在UserJpa中自己寫方法,強大的jpa語法幾乎不需要你自己寫sql語句,當然如果你業務需要,也可以自己定義。

    5. 如果要自己寫sql,則在UserJpa上自己定義方法,但是不需要自己實現。並使用@Query註解該方法,在@Query內使用value寫sql或者hql,如果寫的是sql,則需要使用nativeQuery=true

    6. 自己寫的jpa方法,並使用了@Query註解,但是裡面執行的是update或者delete的sql語句的話要使用@Modifying註解。
      怎麼樣,很簡單吧。jpa就是這麼強大,更多jpa語法和內容等待你去發掘,下期我們講下事務Transaction。

    7. 更多原創閱讀:https://javawu.com