让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,有本身的语法,就一个接口方法,多表关联复杂条件查询不少时候就须要用到这个,还没细研究。再议。

相关文章
相关标签/搜索