SpringData JPA中查詢(xún)接口Repository的使用
什么是JPA
SpringData是Spring提供的一個(gè)數(shù)據(jù)操作框架,而SpringData JPA則是該框架下基于JPA標(biāo)準(zhǔn)進(jìn)行數(shù)據(jù)操作的模塊。
SpringData JPA簡(jiǎn)化了持久層代碼的操作,只需編寫(xiě)接口即可實(shí)現(xiàn)。
JPA,全稱(chēng)Java Persistence API,是Spring Data的子項(xiàng)目之一。它是JDK 5.0的注解或XML描述對(duì)象與關(guān)系表映射關(guān)系的工具,可以將運(yùn)行時(shí)的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。
JPA和Mybatis都是持久層框架,具有相同的功能。然而,由于Mybatis的廣泛使用,現(xiàn)在了解和使用JPA的人較少。
JPQL 是從 Hibernate 的 HQL 演變而來(lái)的,其語(yǔ)法與 HQL 非常相似。HQL,即 Hibernate Query Language(Hibernate查詢(xún)語(yǔ)言),而 SQL 是 Structure Query Language(結(jié)構(gòu)化查詢(xún)語(yǔ)言)。
它們的主要區(qū)別在于:SQL 直接操作數(shù)據(jù)庫(kù)中的表和字段,而 HQL 則操作實(shí)體對(duì)象和屬性。
需要注意的是,我們編寫(xiě)的 JPQL 最終仍會(huì)被轉(zhuǎn)換成 SQL 語(yǔ)句進(jìn)行執(zhí)行。
接口繼承關(guān)系

Repository<T, ID>接口 最頂層接口 作用自定義JPQL語(yǔ)句
/**
* 使用@Query注解,自定義JPQL語(yǔ)句
* JPQL語(yǔ)句中,使用的不是表名,而是實(shí)體類(lèi)名,不是列名,而是屬性名,
* 例如SQL語(yǔ)句:select * from user JPQL語(yǔ)句是:select User from User
* 如果是條件查詢(xún),之前語(yǔ)句中的占位符?可以使用(:xxx)進(jìn)行表示
* 此時(shí)xxx會(huì)根據(jù)方法中同名的形參自動(dòng)綁定值
*/
public interface UsersRepositoryByQuery extends Repository<User, Integer> {
//如果是查詢(xún)所有列,可以省略select ....,從from開(kāi)始寫(xiě)
@Query("from User where name=:name")
List<User> selectByName(String name); //select * from user where name=?
@Query("select u from User u where name=:name and age=:age")
List<User> selectByNameAndAge(String name, Integer age); //select * from user where name=? and age=?
@Query("from User where name=:name and age=:age")
List<User> selectByNameLike(String name);//select * from user where name like ?
//除了使用JPQL語(yǔ)句,也是可以使用sql原生語(yǔ)句,在注解中設(shè)置參數(shù)nativeQuery = true,不推薦!
@Query(value = "select * from user where name=:name",nativeQuery = true)
List<User> selectByNameSQl(String name);//select * from user where name=?
}CrudRepository接口 繼承了Repository接口,內(nèi)置類(lèi)增刪改查的方法
PagingAndSortingRepository接口繼承了CrudRepository接口增加了分頁(yè)和排序方法
@Autowired
private UserRepositoryPage userRepositoryPage;
/**
* 分頁(yè)
*/
@Test
void testPage(){
//第一個(gè)參數(shù)是頁(yè)碼數(shù),0表示第一頁(yè);第二參數(shù)是分頁(yè)單位;
Pageable Pageable = PageRequest.of(0, 2);
Page<User> page = userRepositoryPage.findAll(Pageable);
System.out.println("總數(shù)據(jù)量"+page.getTotalElements());
System.out.println("總頁(yè)數(shù)"+page.getTotalPages());
List<User> content = page.getContent();
for (User user : content) {
System.out.println(user);
}
}
/**
* 排序
*/
@Test
void testSort(){
//根據(jù)id排序
Sort sort = Sort.by(Sort.Order.desc("id"));
Iterable<User> all = userRepositoryPage.findAll(sort);
for (User user : all) {
System.out.println(user);
}
}JpaRepository<T, ID> 接口
繼承了 PagingAndSortingRepository<T, ID>
和查詢(xún)接口 QueryByExampleExecutor
特點(diǎn)是可以幫助我們將其他接口的方法的返回值做適配處理。可以使得我們?cè)陂_(kāi)發(fā)時(shí)更方便的使用這些方法
JpaSpecificationExecutor 接口 主要提供了多條件查詢(xún)的支持,并且可以在查詢(xún)中添加分頁(yè)與排序
JpaSpecificationExecutor接口與以上接口沒(méi)有關(guān)系,完全獨(dú)立。不能單獨(dú)使用,需要配合著JPA 中的其他接口一起使用。
//接口
public interface UserRepositoryExJPA extends JpaRepository<User,Integer>,JpaSpecificationExecutor<User> {
}
//使用
@Autowired
private UserRepositoryExJPA userRepositoryExJPA;
/**
* 自定義規(guī)則,可以多條件查詢(xún)
*/
@Test
void testExJPA2() {
Specification<User> specification = new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//模糊查詢(xún)
Predicate predicate = criteriaBuilder.like(root.get("name"), "張%");
//模糊查詢(xún)+性別篩選+年齡篩選
Predicate predicate2 = criteriaBuilder.and(criteriaBuilder.like(root.get("name"), "張%"),
criteriaBuilder.equal(root.get("sex"), "男"), criteriaBuilder.gt(root.get("age"), 24));
return predicate2;
}
};
//進(jìn)行排序年齡進(jìn)行倒序排列
Sort sort = Sort.by(Sort.Order.desc("age"));
//分頁(yè)+追加排序
Pageable pageable = PageRequest.of(0, 2, sort);
Page<User> page = userRepositoryExJPA.findAll(specification, pageable);
System.out.println("根據(jù)條件查詢(xún)到" + page.getTotalElements() + "條數(shù)據(jù)");
System.out.println("根據(jù)條件查詢(xún)到" + page.getTotalPages() + "頁(yè)數(shù)據(jù)");
System.out.println("當(dāng)頁(yè)數(shù)據(jù)");
for (User user : page) {
System.out.println(user);
}
} JpaRepositoryImplementation<T, ID> 接口
繼承了 JpaRepository<T, ID>, JpaSpecificationExecutor 接口
實(shí)現(xiàn)類(lèi)為SimpleJpaRepository<T, ID> 接口 功能最強(qiáng)大
關(guān)鍵命名查詢(xún)
根據(jù) Spring Data 的規(guī)范,查詢(xún)方法應(yīng)以 find、read 或 get 開(kāi)頭(例如 find、findBy、read、readBy、get、getBy)。當(dāng)涉及到查詢(xún)條件時(shí),應(yīng)使用條件關(guān)鍵字連接屬性,并確保條件屬性的首字母大寫(xiě)。在解析方法名時(shí),框架會(huì)先去除多余的前綴,然后對(duì)剩余部分進(jìn)行解析。
你可以直接在接口中定義查詢(xún)方法,只要符合規(guī)范,就無(wú)需編寫(xiě)實(shí)現(xiàn)或 SQL。目前支持的關(guān)鍵字寫(xiě)法如下:


到此這篇關(guān)于SpringData JPA中查詢(xún)接口Repository的使用的文章就介紹到這了,更多相關(guān)SpringData JPA Repository內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置Hikari數(shù)據(jù)庫(kù)連接池的詳細(xì)步驟
Spring Boot是一個(gè)開(kāi)源的Java框架,它簡(jiǎn)化了基于Spring的應(yīng)用程序的開(kāi)發(fā)和部署,HikariCP是一個(gè)高性能的Java數(shù)據(jù)庫(kù)連接池,被廣泛應(yīng)用于Java開(kāi)發(fā)領(lǐng)域,它是目前最快和最輕量級(jí)的連接池之一,本文介紹了SpringBoot配置Hikari數(shù)據(jù)庫(kù)連接池的詳細(xì)步驟,需要的朋友可以參考下2024-08-08
Java實(shí)現(xiàn)簡(jiǎn)單的模板渲染
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的模板渲染的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
classloader類(lèi)加載器_基于java類(lèi)的加載方式詳解
下面小編就為大家?guī)?lái)一篇classloader類(lèi)加載器_基于java類(lèi)的加載方式詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
tomcat目錄結(jié)構(gòu)簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了tomcat目錄結(jié)構(gòu)簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-07-07
Spring IoC容器常見(jiàn)獲取Bean的方式匯總示例解析
這篇文章主要為大家介紹了Spring IoC容器常見(jiàn)獲取Bean的方式匯總示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
SpringBoot+MyBatisPlus對(duì)Map中Date格式轉(zhuǎn)換處理的方法詳解
在?SpringBoot?項(xiàng)目中,?如何統(tǒng)一?JSON?格式化中的日期格式。本文將為大家介紹一種方法:利用MyBatisPlus實(shí)現(xiàn)對(duì)Map中Date格式轉(zhuǎn)換處理,需要的可以參考一下2022-10-10

