Spring Data Repositories使用

  • CrudRepository接口使用

對實體的增刪改查CRUD操做API, CrudRepository接口源碼:java

@NoRepositoryBean
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);  

    // … more functionality omitted.
}

舉例:框架

public interface UserRepository extends CrudRepository<User, Long> {

  Long countByLastname(String lastname);
}
  • PagingAndSortingRepository使用

先看看PagingAndSortingRepository源碼,它繼承了CrudRepository接口。並使用了@NoRepositoryBean標籤。ide

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort var1);

    Page<T> findAll(Pageable var1);
}

添加@NoRepositoryBean標籤後,Spring Data Jpa在啓動時就不會去實例化BaseRepository這個接口。post

舉例:ui

public interface UserRepository extends CrudRepository<User, Long> {

  Long deleteByLastname(String lastname);

  List<User> removeByLastname(String lastname);

}

 

  • JpaRepository接口使用

先看源碼,JpaRepository接口擁有PagingAndSortingRepository、CrudRepository接口功能。this

@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAll(Iterable<ID> var1);

    <S extends T> List<S> save(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);
}

使用時,直接繼承JpaRepository接口,便可調用已有的接口。代理

 

  • 自定義基礎Repository類

考慮到有些開發不須要使用多餘的操做,可自定義接口,以下:code

狀況1:orm

@NoRepositoryBean
interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {

  T findOne(ID id);

  T save(T entity);
}

interface UserRepository extends MyBaseRepository<User, Long> {
  User findByEmailAddress(EmailAddress emailAddress);
}

狀況2:繼承

@NoRepositoryBean
public interface MyRepository<T, ID extends Serializable>
  extends PagingAndSortingRepository<T, ID> {

  void sharedCustomMethod(ID id);//爲全部實體添加基礎接口
}

//自定義Repository基本類定義
public class MyRepositoryImpl<T, ID extends Serializable>
  extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {

  private final EntityManager entityManager;

  public MyRepositoryImpl(JpaEntityInformation entityInformation,
                          EntityManager entityManager) {
    super(entityInformation, entityManager);

    // Keep the EntityManager around to used from the newly introduced methods.
    this.entityManager = entityManager;
  }

  public void sharedCustomMethod(ID id) {
    // implementation goes here
  }
}

在Spring配置文件中添加:
<repositories base-package="com.acme.repository"
     repository-base-class="….MyRepositoryImpl" />

 

  • 擴展Repository接口功能:

若JpaRepository接口、SimpleJpaRepository接口不能知足需求,那麼咱們須要擴展某個業務Repository。

若是沒有配置後綴,默認會找***RepositoryImpl這個類。經過修改repository-impl-postfix參數來修改。

    <jpa:repositories base-package="**.**.jpa.dao"

    repository-impl-postfix="Impl"/>

    則在框架掃描到 AccountDao 接口時,它將嘗試在相同的包目錄下查找 AccountDaoImpl.java,若是找到,便將其中的實現方法做爲最終生成的代理類中相應方法的實現。*注意AccountDao和AccountDaoImpl的前綴必須相同,若是是AccountRepository,對應的實現類必須是AccountRepositroyImpl。不然會報錯!!!如:

//自定義接口
public interface UserInfoCustomDao {
    public Page<Object[]> searchName(String key);
}

//組合原生JpaRepository接口、自定義接口。
@Repository
public interface UserInfoDao extends JpaRepository<UserInfo,Integer>, UserInfoCustomDao {
}

//自定義接口實現
public class UserInfoDaoImpl implements UserInfoCustomDao {
    @PersistenceContext  
    private EntityManager em; 

    @Override
    public Page<Object[]> searchName(String key) {
        String hql = "select o.uuid,o.name from UserInfo o where 1=1 and o.uuid=:uuid";  
        Query q = em.createQuery(hql);  
        q.setParameter("uuid", u.getUuid());          
        q.setFirstResult(0);  
        q.setMaxResults(1);       
        Page<Object[]> page = new PageImpl<Object[]>(q.getResultList(),new PageRequest(0,1),3);   
        return page;  
    }

}

添加配置:
<jpa:repositories base-package="com.***.dao" repository-impl-postfix="Impl" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>


使用時,以下調用:
    @Resource
    private UserInfoDao userInfoDao;

   public Page<Object[]> selectUser() {
        return userInfoDao.searchName("fdfdf");
    }
相關文章
相關標籤/搜索