天天看點

spring data jpa 自定義接口實作

沒錯,spring data jpa很優秀,但有一些東西,我們就想自己來,我除了想用你的,還想用我自己的

首先,我要spring data jpa的接口,為什麼,因為很友善啊

public interface TaskDao extends JpaRepository<Task,Long>{

}
           

然後我想自己定義一些接口,咋辦呢,那我就再定義個接口bean吧,然後再定義一些接口方法

public interface TaskDaoCustom<T,ID>{

    void method();
}
           

那這裡,我想要spring data jpa的,也想要我自己的,那我就繼承吧

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

}
           

這時候,你在service應該就可以用method()方法了,但是這時候,method是空的,我們得自己來實作它,那實作吧

public class TaskDaoImpl implements TaskDaoCustom{

    @Override
    public void method() {
        // TODO Auto-generated method stub
        System.out.println("who are you !!");
    }

}
           

有心的朋友應該有注意到,為什麼我實作TaskDaoCustom的bean不應該是TaskDaoCustomImpl嗎?如果你這樣子做的話,編譯器就報錯了

那為什麼呢,因為任何繼承了Repository(JpaRepository最終也是繼承于Repository)spring都會為他生成一個實作類,因為TaskDao 繼承于TaskDaoCustom,而TaskDaoCustom中的method不是spring data jpa規範查詢方法的規則,如果就報找不到找不到屬性了。

或許你會問,TaskDaoCustom不會有TaskDaoCustomImpl的實作類嗎,按照spring文檔說的,隻要配置好實作的字尾名,就會用他來實作方法麼,是的,我們是這樣子配置字尾的,确實也有Impl。

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

這裡要糾正一下,這裡的實作spring data jpa規定命名方法是繼承于spring data jpa Repository的那個命名 + Impl,例如我們是TaskDao繼承于JpaRepository,如果實作類應該是TaskDaoImpl,而不是TaskDaoCustomImpl。

spring data jpa 秉承約定大于實作,隻要按照規定和約定來,就能省很多麻煩事。

到這裡,你應該就能自己自定義接口了,但這個對于子產品是起到了作用,如果我在搭建項目,我想直接,定義 一個BaseDao,然後自定義一些常用的公共方法,然後再利用spring data jpa的優點,隻要子子產品,繼承于BaseDao,就能同時擁有自定義的公用方法和spring data jpa的優點,該怎麼做??下一篇再看看??

繼續閱讀