對實體的增刪改查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源碼,它繼承了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接口擁有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接口,便可調用已有的接口。代理
考慮到有些開發不須要使用多餘的操做,可自定義接口,以下: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" />
若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"); }