【持久層框架】- SpringData - JPA( 三 )


文章插圖
使用JPQL的方式查詢(注解式SQL)通過Query注解可以實現更多靈活的條件查詢等SQL·操作 。@Query 注解的使用非常簡單,只需在方法上面標注該注解,同時提供一個JPQL查詢語句即可,并且 , 在這些SQL語句中都是使用實體來進行操作,并非數據庫的表結構來操作 。
計數通過Query可以寫自己的SQL語句
@Query("select count(u) from User u") // 這里使用的是實體,并不是數據庫的表名和字段Integer countUser();測試
@Testvoid CountUser() {Integer integer = userRepository.countUser();System.out.println(integer);}結果

【持久層框架】- SpringData - JPA

文章插圖
參數傳遞在通過注解寫SQL的時候,也需要是攜帶參數的 , 而Query通過?占位符來獲得傳來的參數數據,通過參數的位置定位哪個參數 。
//修改數據 一定加上@Modifying 注解@Transactional@Modifying@Query("update User set username=?1 where id=?2")int updateUsernameByIds(String username,Long id);結果
【持久層框架】- SpringData - JPA

文章插圖
也可以使用原生的SQL,只需要加上 nativeQuery = true 即可 。
實體關系對應jpa中實體包括一對一,一對多,多對多,多對一關系,并且提供了相應的注解 。接下來通過案例來實現關系 。
一對一首先創建部門表,使用戶指向一個部門 。
package com.jpa.demo.domain;import lombok.Data;import javax.persistence.*;import java.io.Serializable;/** * @author: lyd * @description: 部門 * @Date: 2022/10/2 */@Entity@Data@Table(name="sys_dept")public class Dept implements Serializable {@Id@Column(name = "dept_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;}在User實體中加字段,通過OneToOne注解完成 。
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) //設置關聯操作為ALL@JoinColumn(name = "dept_id")private Dept dept;這里的關聯級別也是有多個,一般設置為all就行
  • ALL:所有操作都進行關聯操作
  • PERSIST:插入操作時才進行關聯操作
  • REMOVE:刪除操作時才進行關聯操作
  • MERGE:修改操作時才進行關聯操作這樣就可以編寫測試
@Testvoid OneToOneTest() {User user = new User();user.setNickName("愛國德德");user.setUsername("lyd_code_studio");user.setPassword("lyd_open");Dept dept = new Dept();dept.setName("研發部");user.setDept(dept);User save = userRepository.save(user);System.out.println(save);}通過測試可得數據庫結果,
【持久層框架】- SpringData - JPA

文章插圖
【持久層框架】- SpringData - JPA

文章插圖
通過關聯 , 會在兩個表中進行插入,刪除也是會刪除兩個表中數據 。
一對多@OneToMany:作用:建立一對多的關系映射屬性:targetEntityClass:指定多的多方的類的字節碼mappedBy:指定從表實體類中引用主表對象的名稱 。cascade:指定要使用的級聯操作fetch:指定是否采用延遲加載orphanRemoval:是否使用孤兒刪除創建一個文章表來實現一對多關系,一個用戶可以發表多個文章,一個文章只屬于一個用戶 , 因此在用戶表中是一對多,在文章表就是多對一 。通過@ManyToOne注解完成關系
package com.jpa.demo.domain;import lombok.Data;import javax.persistence.*;/** * @author: lyd * @description: 文章表 * @Date: 2022/10/2 */@Data@Entity@Table(name="yun_article")public class Article {@Id@Column(name = "article_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, length = 50) // 映射為字段 , 值不能為空private String title;@Basic(fetch = FetchType.LAZY) // 懶加載@Column(nullable = false) // 映射為字段 , 值不能為空private String content;@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)//可選屬性optional=false,表示user不能為空 。刪除文章,不影響用戶@JoinColumn(name="user_id")//設置在article表中的關聯字段(外鍵)private User user;}在user實體這邊就是一對多關系 , 并且通過注解完成 。
@OneToMany(mappedBy = "user",cascade=CascadeType.ALL,fetch=FetchType.LAZY)//級聯保存、更新、刪除、刷新;延遲加載 。當刪除用戶,會級聯刪除該用戶的所有文章//擁有mappedBy注解的實體類為關系被維護端private Set<Article> articles;測試,需要創建ArticleRepository
@Testvoid OneToMany() {User user = userRepository.getById(1L);Article article1=new Article();article1.setTitle("如何寫好博客");article1.setContent("如何寫好博客");article1.setUser(user);articleRepository.save(article1);Article article2=new Article();article2.setTitle("如何更進一步學習");article2.setContent("不斷地卷");article2.setUser(user);articleRepository.save(article2);}

推薦閱讀