Spring data jpa(java persistence API), Spring Data JPA是更大的Spring data系列的一部分桑腮,可以輕松實(shí)現(xiàn)基于JPA的存儲(chǔ)庫(kù)。此模塊處理對(duì)基于JPA的數(shù)據(jù)訪問層的增強(qiáng)支持稿黄。它使構(gòu)建使用數(shù)據(jù)訪問技術(shù)的Spring驅(qū)動(dòng)應(yīng)用程序變得更加容易归形。下面直接來介紹干貨糯景。
1拴泌、Spring-data-jpa的基本介紹
JPA誕生的緣由是為了整合第三方ORM框架贱案,建立一種標(biāo)準(zhǔn)的方式肛炮,百度百科說是JDK為了實(shí)現(xiàn)ORM的天下歸一,目前也是在按照這個(gè)方向發(fā)展宝踪,但是還沒能完全實(shí)現(xiàn)侨糟。在ORM框架中,Hibernate是一支很大的部隊(duì)瘩燥,使用很廣泛秕重,也很方便,能力也很強(qiáng)厉膀,同時(shí)Hibernate也是和JPA整合的比較良好溶耘,我們可以認(rèn)為JPA是標(biāo)準(zhǔn),JPA幾乎都是接口服鹅,實(shí)現(xiàn)都是Hibernate在做汰具,宏觀上面看,在JPA的統(tǒng)一之下Hibernate很良好的運(yùn)行菱魔。
2留荔、基本使用
2.1 CrudRepository接口
顧名思義,這個(gè)接口的功能就是幫助使用者完成各種各樣的crud操作澜倦。
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
<S extends T> S save(S entity);
T findOne(ID primaryKey);
Iterable<T> findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
}
1聚蝶、保存給定的實(shí)體(該實(shí)體對(duì)應(yīng)的是數(shù)據(jù)庫(kù)中的table,實(shí)體中的屬性對(duì)應(yīng)table中的colomn)
2藻治、返回由給定id標(biāo)識(shí)的實(shí)體碘勉。(主鍵)
3、返回所有實(shí)體
4桩卵、返回實(shí)體數(shù)量
5验靡、刪除給定的實(shí)體。
6雏节、指示是否存在具有給定id的實(shí)體胜嗓。
2.2 PagingAndSortingRepository
public interface PagingAndSortingRepository<T, ID extends Serializable>
extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
PagingAndSortingRepository接口是Jpa提供的分頁(yè)接口,Pageable類型在創(chuàng)建時(shí)钩乍,需要傳入頁(yè)碼page辞州、該頁(yè)的最大item數(shù)量size,還可以傳入一個(gè)Sort類型的對(duì)象寥粹,指定好升序降序以及排序字段(可傳入多個(gè)排序字段)变过,完成分頁(yè)埃元。
2.3 創(chuàng)建對(duì)應(yīng)數(shù)據(jù)庫(kù)表的DTO
下圖是一張數(shù)據(jù)庫(kù)表所對(duì)應(yīng)的DTO(data transform object),id對(duì)應(yīng)的是主鍵媚狰,@GeneratedValue對(duì)應(yīng)的是主鍵的生成策略岛杀。GenerationType.IDENTITY的意思是主鍵由數(shù)據(jù)庫(kù)自動(dòng)生成(自增型),AUTO的意思是主鍵由程序生成崭孤。@Column指的是表中的字段名楞件。
@Table(name = "partner")
public class PartnerDTO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "partner_name")
private String partnerName;
@Column(name = "operator")
private String operator;
@Column(name = "password")
private String password;
@Column(name = "create_time")
private String createTime;
@Column(name = "partner_type")
private String partnerType;
@Column(name = "update_time")
private Timestamp updateTime;
@Column(name = "product_type")
private Integer productType;
@Column(name = "status")
private Integer status;
2.4 創(chuàng)建jpa的數(shù)據(jù)庫(kù)訪問對(duì)象Repository
這里的Repository和我們平常理解的DAO層是一個(gè)概念,和mybatis中叫它為mapper一樣裳瘪,在spring data jpa中我們叫它Repository。我們現(xiàn)在只需要?jiǎng)?chuàng)建一個(gè)接口罪针,讓它實(shí)現(xiàn)上述的CRUDRepository彭羹、PagingAndSortingRepository或者是JpaRepository中的一種。如下圖所示:
public interface PartnerDao extends PagingAndSortingRepository<PartnerDTO, Long> {
List<PartnerDTO> findAllByStatusAndPartnerType(Integer status, String partnerType);
List<PartnerDTO> findAllByPartnerType(String type);
}
Java8以后泪酱,允許我們直接調(diào)用接口中的方法派殷,不需要我們?cè)兕~外提供實(shí)現(xiàn)類。現(xiàn)在我們可以在service層中調(diào)用這兩個(gè)方法墓阀,jpa就會(huì)將方法翻譯成語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD操作毡惜。
2.5 @Query
使用 @Query 創(chuàng)建查詢
@Query 注解的使用非常簡(jiǎn)單,只需在聲明的方法上面標(biāo)注該注解斯撮,同時(shí)提供一個(gè) JP QL 查詢語(yǔ)句即可经伙,如下所示:
清單 16. 使用 @Query 提供自定義查詢語(yǔ)句示例
public interface UserDao extends Repository<AccountInfo, Long> {
@Query("select a from AccountInfo a where a.accountId = ?1")
public AccountInfo findByAccountId(Long accountId);
@Query("select a from AccountInfo a where a.balance > ?1")
public Page<AccountInfo> findByBalanceGreaterThan(Integer balance, Pageable pageable);
}
很多開發(fā)者在創(chuàng)建 JP QL 時(shí)喜歡使用命名參數(shù)來代替位置編號(hào),@Query 也對(duì)此提供了支持勿锅。JP QL 語(yǔ)句中通過": 變量"的格式來指定參數(shù)帕膜,同時(shí)在方法的參數(shù)前面使用 @Param 將方法參數(shù)與 JP QL 中的命名參數(shù)對(duì)應(yīng),示例如下:
清單 17. @Query 支持命名參數(shù)示例
public interface UserDao extends Repository<AccountInfo, Long> {
public AccountInfo save(AccountInfo accountInfo);
@Query("from AccountInfo a where a.accountId = :id")
public AccountInfo findByAccountId(@Param("id")Long accountId);
@Query("from AccountInfo a where a.balance > :balance")
public Page<AccountInfo> findByBalanceGreaterThan(@Param("balance")Integer balance, Pageable pageable);
}
此外溢十,開發(fā)者也可以通過使用 @Query 來執(zhí)行一個(gè)更新操作垮刹,為此,我們需要在使用 @Query 的同時(shí)张弛,用 @Modifying 來將該操作標(biāo)識(shí)為修改查詢荒典,這樣框架最終會(huì)生成一個(gè)更新的操作,而非查詢吞鸭。如下所示:
清單 18. 使用 @Modifying 將查詢標(biāo)識(shí)為修改查詢
@Modifying
@Query("update AccountInfo a set a.salary = ?1 where a.salary < ?2")
public int increaseSalary(int after, int before);
簡(jiǎn)單的Jpa使用就介紹到這兒了寺董,下一篇文章會(huì)介紹在使用jpa過程遇到的一些問題,以及解決方式刻剥。