如何優雅的實現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的常用用法:
-
首先需要定義一個介面,並繼承自JpaRepository,並在該介面類上使用@Repository註解,告知springboot這是一個Repository類
-
在外部呼叫使用@Resource將該介面注入
-
如果方法不夠我們的業務使用,則可以在UserJpa中自己寫方法,強大的jpa語法幾乎不需要你自己寫sql語句,當然如果你業務需要,也可以自己定義。
-
如果要自己寫sql,則在UserJpa上自己定義方法,但是不需要自己實現。並使用@Query註解該方法,在@Query內使用value寫sql或者hql,如果寫的是sql,則需要使用nativeQuery=true
-
自己寫的jpa方法,並使用了@Query註解,但是裡面執行的是update或者delete的sql語句的話要使用@Modifying註解。
怎麼樣,很簡單吧。jpa就是這麼強大,更多jpa語法和內容等待你去發掘,下期我們講下事務Transaction。 - 更多原創閱讀:https://javawu.com