基於springdata JPA的dao層接口實現以及分頁
1、【舉例】
只需要繼承 JpaRepository<實體類,主鍵類型>
package com.tmall.tmallspringboot.dao;
import com.tmall.tmallspringboot.pojo.Category;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CategoryDao extends JpaRepository<Category,Integer> {
//大部分crud方法都在JpaRepository及其父類中了,所以幾乎不用自己定義
}
2、【源碼】
一步步點進來,從這兩個接口可以看到幾乎提供了所有常用的方法。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.data.jpa.repository;
import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.data.repository;
import java.util.Optional;
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
Optional<T> findById(ID var1);
boolean existsById(ID var1);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> var1);
long count();
void deleteById(ID var1);
void delete(T var1);
void deleteAll(Iterable<? extends T> var1);
void deleteAll();
}
3、【自定義與分頁】
通常情況下我們的數據需要分頁顯示,而且要是需要的方法沒有提供,則需要自己定義。
首先,分頁其實jpa也幫我們做了:
我們需要做的就是:
-
返回類型設置爲Page4Navigator<實體類>
-
將自定義參數封裝進Pageable對象,然後在調用jpa的對應方法時把Pageable對象9行傳入即可
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
public Page4Navigator<Category> list(int start, int size, int navigatePages) {
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(start, size, sort);
Page pageFromJPA = categoryDao.findAll(pageable);
return new Page4Navigator<>(pageFromJPA, navigatePages);
}
自定義條件查詢加分頁則需要在上面的基礎上,在dao層中添加一下:
import com.tmall.tmallspringboot.pojo.Category;
import com.tmall.tmallspringboot.pojo.Property;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PropertyDao extends JpaRepository<Property,Integer> {
// 自定義條件查詢
Page<Property> findByCategory(Category category, Pageable pageable);
}