1. 程式人生 > >Spring data Repository

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