日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

spring data jpa 定義全局接口BaseDao

 aaie_ 2016-11-23

好,現(xiàn)在我要搭一個(gè)項(xiàng)目,我想定義一個(gè)BaseDao,然后直接讓其他模塊的dao直接繼承我這個(gè)BaseDao,BaseDao有通用的方法也有spring data jpa提供的便捷方法

那就新建一個(gè)BaseDao唄,這個(gè)BaseDao應(yīng)該是繼承JpaRepository,JpaSpecificationExecutor因?yàn)槲覀兿胗胹pring data jpa,然后你再定義自己一些常用方法,例如myMethod

@NoRepositoryBean
public interface BaseDao<T,ID extends Serializable> extends JpaRepository<T, ID>,JpaSpecificationExecutor<T> {

    void myMethod();

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

接下來應(yīng)該就是實(shí)現(xiàn)了

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() {



    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

繼承于SimpleJpaRepository不單可以讓我們獲取操作數(shù)據(jù)庫(kù)的EntityManager ,還可以實(shí)現(xiàn)JpaRepository,JpaSpecificationExecutor的方法,這樣我們就可以只寫我們自己方法的實(shí)現(xiàn)

接下來再定義下factory,他的作用是將我們的basedao的實(shí)現(xiàn)類扔給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;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

然后再定義一個(gè)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);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

public interface TaskDao extends BaseDao<Task,Long>{

}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

在service層,你就可以用spring data jpa的方法和自己定義的一些通用方法了,如果你還想在自己模塊再定義一些方法,那參考
http://blog.csdn.net/yingxiake/article/details/51017699
然后我們就這么寫

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

}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

然后,畢竟有一些東西,框架還是幫我們不了啊,太復(fù)雜的業(yè)務(wù),想自己寫操作數(shù)據(jù)庫(kù),想自己寫sql原生語句,那咋辦啊,親,那就只能利用EntityManager了,利用jpa api直接自己干了,下次看看怎么用EntityManager自己干活了

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多