讓spring-data-jpa解放你的DAO

第一次寫oschina空間。先試試水,寫得有點亂,改天再整理下。html

最近項目用Spring-data-jpa,確實很方便。若是你也曾經被重複無聊的dao代碼雷到的話,就能夠考慮將ORM framework換成spring-data-jpa了。 只要繼承CrudRepository或者PagingAndSortingRepository,dao層基本上就只剩下定義接口方法這麼一件事情了,連實現都不用寫,由於默認實現SimpleJpaRepository已經幫你實現了基本的CRUD,是否是很方便?基本的CRUD就全解決了。java

廢話少說,上代碼:spring

<!-- lang: java -->
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID>{
   
}

@Transational
public interface TestRepository extends BaseRepository<Test,Long>{
    Test findByName(String name);
}

只需這麼定義,而後testRepository對象就自然擁有CRUD的方法,它會動態將findByName()的方法定義翻譯成適當的HQL。性能

<!-- lang: java -->
@Transational
public class TestServiceImpl{
    @Autowried
    private TestRepository testRepository;
    public void test(){
        testRepository.findOne(id);
        testRepository.findAll(ids);
        testRepository.delete(id);
        testRepository.findByName(name);
    }
}

各類翻譯規則可細看官方文檔翻譯

並且還能夠用@Query的註解。在方法中寫JPQL查詢語句,還支持nativeQuery,能夠使用原生SQL,對報表之類對性能要求比較高的查詢就很給力了。code

若是有時候只是想查詢實體中的某幾個字段,而不是整張表都查詢出來,能夠採用如下方法htm

<!-- lang: java -->
@Transactional
public interface TestRepository extends BaseRepository<Test,Long>{
    
    @Query("select t.id, t.name from Test t")
    public List<Object[]> findSimpleTest()
}

而後在調用該repository的service中遍歷將對應的字段轉換爲相應的字段便可。對象

具體能夠看官方reference繼承

若是SimpleJpaRepository中的方法不夠用,擴展起來也很是方便,只要在BaseRepository定義本身的藉口方法,而後實現類繼承SimpleJpaRepository實現本身的方法,而後將jpa的factory-class替換成本身寫的實現類便可。接口

固然spring data jpa也有criteria實現,叫Specification,有本身的語法,就一個接口方法,多表關聯複雜條件查詢不少時候就須要用到這個,還沒細研究。再議。

相關文章
相關標籤/搜索