【轉】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") @ResponseBodypublic 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:
可以完成刪除操作: