`

Spring Data JPA 全局DAO的扩展

jpa 
阅读更多
转自http://blog.csdn.net/yyzhq/article/details/8006923

前几天看了springside4的mini-web代码发现确实有不少新的东东,咱这次单说说Spring Data JPA吧。

引用springside4的 wiki关于对Spring Data JPA的简介

Spring Data JPA在JPA上又做了一层封装,只要编写接口就够了,不用写一行实现代码,CRUD方法啦,分页啦,自动将findByLoginName()的方法定义翻译成适当的QL啦都由它包了:

public interface UserDao extends PagingAndSortingRepository<User, Long> {
User findByLoginName(String loginName);
}
使用上很简单,快速浏览一下下面的资料就够了。

只有一个坑爹的地方,如果要为UserDao扩展方法(而不是接口),要新增一个UserDaoCustom接口,这时候,实现类的名字必须是UserDaoImpl,而不是UserDaoCustomImpl。

另外,除了智能地翻译连Less,Not,And,Or都支持的方法名,它当然也可以直接用@Query在方法上标注复杂的查询语句。

资料
官方文档
使用 Spring Data JPA 简化 JPA 开发 IBM DW上的中文版教程.


如果看完上面的资料 也许你对Spring Data JPA有了初步的认识,动动手你就知道他的强大,但是对DAO的扩展上有点麻烦,上面红字部分是对单个dao进行扩展的方法。下面我们来说一下对全局DAO的扩展,创建你自己的CustomRepository。



首先咱们要建一个自己的扩展接口类MyRepository


import java.io.Serializable;   
  
import org.springframework.data.jpa.repository.JpaRepository;   
  
public interface MyRepository<T, ID extends Serializable>    
extends JpaRepository<T, ID> {   
  
String  sharedCustomMethod();   
}  



其中sharedCustomMethod是全局的共享自定义方法。



然后在建一个实现类MyCustomRepository


import java.io.Serializable;   
  
import javax.persistence.EntityManager;   
  
import org.springframework.data.jpa.repository.support.JpaEntityInformation;   
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;   
import org.springframework.data.repository.NoRepositoryBean;   
  
@NoRepositoryBean  
public class MyCustomRepository<T, ID extends Serializable>    
extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {   
  
       
private final EntityManager entityManager;   
       
public MyCustomRepository(Class<T> domainClass, EntityManager em) {   
        super(domainClass, em);   
        // TODO Auto-generated constructor stub  
           
        entityManager=em;   
    }   
  
public MyCustomRepository(final JpaEntityInformation<T, ?> entityInformation, final EntityManager entityManager) {   
    super(entityInformation, entityManager);   
    this.entityManager = entityManager;   
}   
  
  
public String sharedCustomMethod() {   
    return "hello sharedCustomMethod";   
  // implementation goes here  
}    
}  



注意 @NoRepositoryBean一定要有的,还有全局的扩展实现类不要用Imp作为后缀名,不然会报异常的(目前还没搞清楚报异常的具体原因,个人猜测可能是和局部的扩展有冲突吧)。


然后在定义MyRepositoryFactory


import java.io.Serializable;   
  
import static org.mockito.Mockito.*;   
  
import javax.persistence.EntityManager;   
  
import org.springframework.data.jpa.repository.JpaRepository;   
import org.springframework.data.jpa.repository.support.JpaEntityInformation;   
import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;   
import org.springframework.data.repository.core.RepositoryMetadata;   
  
  
public class MyRepositoryFactory extends JpaRepositoryFactory {   
  
    public MyRepositoryFactory(EntityManager entityManager) {   
        super(entityManager);   
        // TODO Auto-generated constructor stub  
    }   
    @Override  
    @SuppressWarnings("unchecked")   
    protected JpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager em) {   
  
        JpaEntityInformation<Object, Serializable> entityMetadata = mock(JpaEntityInformation.class);   
        when(entityMetadata.getJavaType()).thenReturn((Class<Object>) metadata.getDomainType());   
        return new MyCustomRepository<Object, Serializable>(entityMetadata, em);   
    }   
  
    /*  
     * (non-Javadoc)  
     *   
     * @see  
     * org.springframework.data.repository.support.RepositoryFactorySupport# 
     * getRepositoryBaseClass() 
     */  
    @Override  
    protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {   
  
        return MyCustomRepository.class;   
    }   
}  



接着在建一个MyRepositoryFactoryBean


import java.io.Serializable;   
  
import javax.persistence.EntityManager;   
  
import org.springframework.data.jpa.repository.JpaRepository;   
import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;   
import org.springframework.data.repository.core.support.RepositoryFactorySupport;   
  
public class MyRepositoryFactoryBean<T extends JpaRepository<Object, Serializable>> extends JpaRepositoryFactoryBean<T, Object, Serializable> {   
  
       
    @Override  
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) {   
  
        return new MyRepositoryFactory(em);   
    }   
}  



最后在配置文件里需要定义

<jpa:repositories base-package="org.springside.examples.miniweb"  transaction-manager-ref="transactionManager"

factory-class="org.springside.examples.miniweb.dao.account.MyRepositoryFactoryBean"

entity-manager-factory-ref="entityManagerFactory"/>

其实这里还有个repository-impl-postfix=" "个人理解他是来定义局部扩展库的实现类的后缀的默认是Imp。



呵呵 这样你就可以使用全局的自定义扩展库了。

public interface UserDao extends MyRepository<User, Long> ,JpaSpecificationExecutor<User>{   
  
}  
分享到:
评论

相关推荐

    Spring Data JPA Demo

    Spring Data JPA 提供了一种声明式的方式,通过Repository 接口来操作数据库,无需编写大量的DAO层代码。它支持自动查询生成,简化了CRUD(创建、读取、更新、删除)操作,并且可以轻松地处理复杂的查询。 2. **...

    仓库管理系统,SpringBoot+Spring Data JPA+......zip

    通过Spring Data JPA,开发者可以避免编写大量繁琐的DAO层代码,只需定义Repository接口,就能自动生成CRUD操作。此外,它还支持高级查询功能,如 Specifications 和 Querydsl,这使得编写复杂的数据库查询变得简单...

    agile-jpa : spring-data-jpa扩展

    持久层工具合并 使用该组件后,全局仅需要注入唯一的Dao工具,无需再声明其他Dao/Repository,一个工具搞定所有Dao,极大简化持久层代码量。原生动态sql解析支持 依靠agile-sql(动态sql解析器)实现jpa中对sql语法...

    struts2.0+spring2.5+JPA整合框架

    Struts2.0、Spring2.5和JPA(Java Persistence API)是Java...然而,随着技术的发展,现在更推荐使用Spring Boot或Spring MVC + Spring Data JPA的组合,它们简化了配置,提供了更强大的自动化配置和开箱即用的功能。

    Spring+Struts2+JPA

    Struts2与Spring的整合使得业务逻辑层可以方便地利用Spring的DI特性,增强了系统的可扩展性。 **JPA框架** JPA是Java EE 5引入的ORM规范,它允许开发者使用面向对象的方式来操作数据库,降低了数据库操作的复杂性...

    spring 练习小项目

    Spring Boot简化了Spring应用的初始配置,Spring Data JPA则提供了对ORM(对象关系映射)的高级支持,而Spring Security则提供了安全控制功能。 总结,这个"spring练习小项目"是一个绝佳的学习平台,涵盖了Spring...

    基于Spring Boot的健身房预约管理系统.zip

    数据访问Spring Data JPA 数据库MySQL 安全认证JWT 前端框架暂未提及(可根据实际项目情况补充) 项目结构 com.fzh.com项目主包 config配置类,包括全局CORS配置、登录拦截器配置等。 controller控制器类...

    JAVAEE SSH分页

    Spring框架提供了一种基于JPA(Java Persistence API)的分页解决方案,例如使用Spring Data JPA或Hibernate的Criteria API。Spring Data JPA提供了Pageable接口,允许我们轻松地在Repository方法中实现分页查询。...

    SpringMVC 与底层数据库的交互

    6. **Spring Data JPA**:Spring Data JPA是Spring提供的一个模块,它简化了JPA(Java Persistence API)的使用。通过提供Repository接口,可以自动实现基本的CRUD操作,同时支持复杂查询。 7. **MyBatis**:...

    基于SpringBoot+Vue前后端分离的毕业设计选题管理系统源码.zip

    Spring Data JPA是Spring的一个模块,它简化了持久层的开发,通过提供一套高级的Repository接口,使得开发者无需编写大量的DAO层代码就能完成数据库操作。在本系统中,Spring Data JPA可能用于与数据库(如MySQL、...

    Springboot-JPA-博客

    - **Repository扩展**:通过定义自定义的Repository接口并继承Spring Data JPA提供的基本接口,可以方便地实现CRUD操作。 - **查询方法命名**:Spring Data JPA支持通过方法名自动生成对应的SQL查询,例如`findAll...

    基于springboot+vue的客户信息管理系统源码数据库.zip

    在这个系统中,Spring Data JPA帮助开发者以声明式的方式操作数据库,减少了编写SQL和DAO层的代码量。 3. **Hibernate**: Hibernate是JPA的一种实现,它是一个对象关系映射(ORM)框架。通过Hibernate,开发者可以...

    【springboot项目源码】成绩管理系统.rar

    在Spring Boot项目中,数据库连接通常通过配置文件(如application.properties或application.yml)进行设置,并使用Spring Data JPA或MyBatis的注解来定义实体和DAO层。 6. 模型-视图-控制器(MVC)架构:尽管...

    Spring MVC框架实例

    - 引入 Spring Data JPA 或 MyBatis 进行数据访问。 - 使用 Spring Security 进行权限控制。 - 集成其他中间件,如 Redis 缓存、Quartz 定时任务等。 总结,Spring MVC 为开发者提供了灵活且强大的 Web 开发框架,...

    springboot项目实现活动的增删改查.zip

    - **Repository接口**:Spring Data JPA允许开发者通过定义Repository接口来操作数据库,无需编写具体的DAO层代码。例如,实现ActivityRepository接口,可以轻松实现对活动的增删改查操作。 3. **Thymeleaf模板...

    基于SpringBoot+Vue的学生管理系统源码.zip

    在本项目中,可能使用了Spring Data JPA来实现数据库的CRUD操作,通过Repository接口,可以方便地执行SQL查询,而无需编写大量的DAO层代码。 4. **Vue.js** Vue.js是一个轻量级的前端JavaScript框架,以其易学易用...

    Spring Framework 开发参考手册(中文)

    - **介绍**:Spring Data项目中的一个子模块,用于简化Java持久层的开发,提供了一种声明式的JPA实现。 - **作用**:大大减少了编写DAO层代码的工作量,提高了开发效率。 #### 6. **Spring Boot** - **介绍**:...

    spring-boot,mysql,mybatis Java项目

    使用JDBC(Java Database Connectivity)驱动,Spring Boot可以通过Spring Data JPA或者MyBatis与MySQL进行交互。 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有...

    Spring.MVC学习指南.pdf

    - 与Spring Data JPA或MyBatis等持久层框架结合,简化数据访问操作。 9. **配置方式**: - XML配置:传统的配置方式,所有的组件都在Spring配置文件中声明。 - Java配置:通过@Configuration和@Bean注解,更易读...

Global site tag (gtag.js) - Google Analytics