1. 程式人生 > >spring data jpa 定義全域性介面BaseDao

spring data jpa 定義全域性介面BaseDao

好,現在我要搭一個專案,我想定義一個BaseDao,然後直接讓其他模組的dao直接繼承我這個BaseDao,BaseDao有通用的方法也有spring data jpa提供的便捷方法

那就新建一個BaseDao唄,這個BaseDao應該是繼承JpaRepository,JpaSpecificationExecutor因為我們想用spring data jpa,然後你再定義自己一些常用方法,例如myMethod

@NoRepositoryBean
public interface BaseDao<T,ID extends Serializable> extends JpaRepository
<T, ID>,JpaSpecificationExecutor<T> {
void myMethod(); }

接下來應該就是實現了

public class BaseDaoImpl<T,ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BaseDao<T,ID>{

    private final EntityManager em; 

    public BaseDaoImpl(Class<T> domainClass, EntityManager em) {
        super
(domainClass, em); this.em = em; } @Override public void myMethod() { } }

繼承於SimpleJpaRepository不單可以讓我們獲取操作資料庫的EntityManager ,還可以實現JpaRepository,JpaSpecificationExecutor的方法,這樣我們就可以只寫我們自己方法的實現

接下來再定義下factory,他的作用是將我們的basedao的實現類扔給factorybean

public class BaseDaoFactory
<S, ID extends Serializable> extends JpaRepositoryFactory {
public BaseDaoFactory(EntityManager entityManager) { super(entityManager); } @SuppressWarnings({ "rawtypes", "unchecked", "hiding" }) @Override protected <T, ID extends Serializable> SimpleJpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) { // TODO Auto-generated method stub return new BaseDaoImpl(metadata.getDomainType(), entityManager); } @Override protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) { // TODO Auto-generated method stub return BaseDao.class; } }

然後再定義一個factorybean,接到factory之後,把factory扔了spring data jpa

public class BaseDaoFactoryBean<R extends JpaRepository<S, ID>, S, ID extends Serializable>
        extends JpaRepositoryFactoryBean<R, S, ID> {

    @SuppressWarnings("rawtypes")
    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
        // TODO Auto-generated method stub
        return new BaseDaoFactory(entityManager);
    }

}

spring data jpa來接了,在配置檔案配置自己定義的FactoryBean,這樣就可以直接使用你的baseDao了

<jpa:repositories base-package="com.liuxg.**.dao"
        repository-impl-postfix="Impl" 
        query-lookup-strategy = "create-if-not-found"
        factory-class="com.liuxg.base.dao.BaseDaoFactoryBean"
        entity-manager-factory-ref="entityManagerFactory"
        transaction-manager-ref="transactionManager" >
    </jpa:repositories>

然後下次我們要用,就這樣子用

public interface TaskDao extends BaseDao<Task,Long>{

}
public interface TaskDao extends BaseDao<Task,Long>,TaskDaoCustom<Task, Long>{

}

然後,畢竟有一些東西,框架還是幫我們不了啊,太複雜的業務,想自己寫操作資料庫,想自己寫sql原生語句,那咋辦啊,親,那就只能利用EntityManager了,利用jpa api直接自己幹了,下次看看怎麼用EntityManager自己幹活了