Spring data Repository
———–Spring data repository
1.Repository是一個空介面,即是一個標記介面。
若我們定義的介面繼承了Repository,則該介面會被IOC容器識別為一個Repository Bean,納入到IOC容器中,進而可以在該介面中定義滿足一定規範的方法。IOC容器中實際存放了繼承了Repository的介面的實現類,而這個實現類由spring幫助完成 。在applicationContext.xml中我們配置了springdata:這裡的base-package指定了Repository Bean所在的位置,在這個包下的所有的繼承了Repository的介面都會被IOC容器識別並納入到容器中,如果沒有繼承Repository則IOC容器無法識別。
我們也可以通過註解的方式替代繼承Repository介面@RepositoryDefinition(domainClass=需要處理的實體類的型別,IdClass=逐漸的型別)。
除了使用註解和繼承Repository介面我們還可以繼承Repository的子介面與實現類
CrudRepository:繼承Repository,實現了一組CRUD操作相關的方法。 PagingAndSortingRepository:繼承CrudRepository,實現了一組分頁排序相關的方法。
JpaRepository:繼承PagingAndSortingRepository,實現一組JPA規範的相關方法。
自定義的XxxxRepository:需要繼承JpaRepository,這樣的XxxxRepository
JpaSpecificationExecutor:不屬於Repository體系,實現一組JPACriteria查詢相關的方法。
———–Spring data Crudrepository
package org.springframework.data.repository;
import java.io.Serializable;
/**
* Interface for generic CRUD operations on a repository for a specific type.
*
* @author Oliver Gierke
* @author Eberhard Wolff
*/
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> save(Iterable<S> entities);
T findOne(ID id);
boolean exists(ID id);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> ids);
long count();
void delete(ID id);
void delete(T entity);
void delete(Iterable<? extends T> entities);
void deleteAll();
}
當在刪除某個物件的時候:
/**
* 根據id 刪除
* Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
Hibernate: delete from spj_student where id=?
*/
@Test
public void test_delete(){
this.studentCrudRepository.delete(11);
}
/**
* 刪除物件
* Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
* Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
* Hibernate: delete from spj_student where id=?
*/
@Test
public void test_delete_T(){
StudentPO studentPO = this.studentCrudRepository.findOne(10);
this.studentCrudRepository.delete(studentPO);
}
/* 刪除list
Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
//delete(Iterable) 執行的語句
Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
Hibernate: delete from spj_student where id=?
Hibernate: delete from spj_student where id=?
Hibernate: delete from spj_student where id=?
*/
@Test
public void test_delete_Iterable(){
List<StudentPO> idList = new ArrayList<>();
idList.add(this.studentCrudRepository.findOne(9));
idList.add(this.studentCrudRepository.findOne(8));
idList.add(this.studentCrudRepository.findOne(7));
this.studentCrudRepository.delete(idList);
}
———–Spring data PagingAndSortingRepository
Iterable<T> findAll(Sort sort); //查詢所有,排序,不進行分頁
Page<T> findAll(Pageable pageable);
PagingAndSortingRepository 介面繼承於 CrudRepository 介面,擁有CrudRepository 介面的所有方法
特有方法有兩個 分頁,和 排序, 這兩個方法的缺陷是不能有篩選條件
例項:
package com.ncsi.SpringData.Repository;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.ncsi.SpringData.Entity.Person;
public interface PersonPagingAndSortingRepository extends PagingAndSortingRepository<Person,Integer> {
}
Test:
package com.ncsi.SpringData;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.domain.Sort.Direction;
import com.ncsi.SpringData.Entity.Person;
import com.ncsi.SpringData.Repository.PersonPagingAndSortingRepository;
public class PagingAndSortingRepositoryTest {
private ApplicationContext ctx;
private PersonPagingAndSortingRepository personPagingAndSortingRepository;
{
ctx = new ClassPathXmlApplicationContext("springdata.xml");
personPagingAndSortingRepository = ctx.getBean(PersonPagingAndSortingRepository.class);
}
@Test
/**
* Hibernate:
select
person0_.id as id1_0_,
person0_.birth as birth2_0_,
person0_.email as email3_0_,
person0_.last_name as last_nam4_0_
from
jpa_person person0_
order by
person0_.id desc,
person0_.last_name desc
*/
public void test_findAll_Sort(){
Order idOrder =new Order(Direction.DESC,"id");
Order nameOrder=new Order(Direction.DESC,"lastName");
Sort sort =new Sort(idOrder,nameOrder);
List<Person> persons=(List<Person>) this.personPagingAndSortingRepository.findAll(sort);
System.out.println(persons);
}
@Test
public void test_findAll_page(){
int currentPage=1;//當前頁:從第幾頁開始 這裡是第一頁
int pageSize=5;//總頁數
//排序
Order idOrder =new Order(Direction.DESC,"id");
Order nameOrder=new Order(Direction.DESC,"lastName");
Sort sort =new Sort(idOrder,nameOrder);
PageRequest pagerequest=new PageRequest(currentPage,pageSize,sort);
Page<Person> page=this.personPagingAndSortingRepository.findAll(pagerequest);
System.out.println("總記錄數:" + page.getTotalElements());
System.out.println("總頁數:" + page.getTotalPages());
System.out.println("當前頁(request):" + page.getNumber());
System.out.println("當前頁總記錄數(request):" + page.getSize());
System.out.println("當前頁記錄總數:" + page.getNumberOfElements());
/**
* 如何得到第二頁的資料
* currentPage+1
*/
List<Person> persons2 = page.getContent();
for (Person p : persons2) {
System.out.println(p);
}
}
}
———–Spring data JpaRepository