`
haolx
  • 浏览: 26265 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习Spring Data JPA 小结

阅读更多

前几天看了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>{

}

 

 

分享到:
评论
9 楼 2047699523 2015-05-18  
springdata demo教程源代码下载:http://zuidaima.com/share/kspringdata-p1-s1.htm
8 楼 string2020 2015-01-29  
@NoRepositoryBean 是干啥的?
7 楼 wangleisk 2013-12-23  
搜索了一下午终于找到这篇文章了,正好是我遇到的问题,虽然还不知道原理,但是问题解决了,谢谢
6 楼 zkgale 2013-10-10  
红字上再加上一句吧. impl实现中不能加@Repository注解!!!!!!!!!!!!太坑了
5 楼 402230366 2013-07-24  
请问,为什么继承了SimpleJpaRepository必须要实现其构造方法,而且,不能写自己类的构造方法?
4 楼 libin2722 2013-01-15  
MyRepositoryFactoryBean 这个有什么用
3 楼 liuweizaixian 2012-11-21  
不错,正是我想要的。
2 楼 YYZhQ 2012-09-22  
学习了
1 楼 joehe 2012-08-23  
这是有用啥呢?

相关推荐

    详述 Spring Data JPA 的那些事.docx

    "Spring Data JPA知识点详解" ...小结 Spring Data JPA是一种基于JPA的数据访问技术,它提供了一种简洁的方式来访问关系数据库。使用Spring Data JPA可以简化数据库操作,提高开发效率和可读性。

    spring data jpa 连接mysql8.x的一些问题梳理总结.docx

    小结 在使用 Spring Data JPA 连接 MySQL 8.x 时,需要注意环境变量的配置、数据库连接信息的配置、时区的配置、useSSL 的配置、JDBC 版本的配置等。同时,需要正确地配置方言设置,以避免出现问题。

    Spring-data-jpa 学习笔记.docx

    #### 三、SpringData方法定义规范 Spring Data JPA 通过定义方法名的约定来推断方法的行为。以下是一些常用的方法名前缀和示例: - **查询所有数据**:`findAll()` 或 `findUsers()`(假设实体类名为 User)。 - *...

    Spring Boot + Jpa(Hibernate) 架构基本配置详解

    小结 本文总结了 Spring Boot + Jpa(Hibernate) 架构基本配置的知识点,包括 Spring Boot 和 Jpa(Hibernate) 的简介、配置和 Maven 依赖项的添加。通过本文,读者可以了解如何使用 Spring Boot 和 Jpa(Hibernate) ...

    springboot学习

    Spring Boot Actuator监控端点小结 在传统Spring应用中使用spring-boot-actuator模块提供监控端点 Spring Boot应用的后台运行配置 Spring Boot自定义Banner Dubbo进行服务治理 chapter9-2-1:Spring Boot中使用Dubbo...

    spring boot 全面的样例代码

    - [Spring Boot Actuator监控端点小结](http://blog.didispace.com/spring-boot-actuator-1/) - [在传统Spring应用中使用spring-boot-actuator模块提供监控端点]...

    Spring Boot in Action-chapter 2 sample

    - **Data JPA Starter** (`spring-boot-starter-data-jpa`):提供了JPA支持,包括实体管理、数据库连接等。 - **Security Starter** (`spring-boot-starter-security`):提供了Spring Security的安全认证与授权功能...

    Spring中文帮助文档

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    Spring API

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    SpringBoot整合JPA的实例代码

    八、小结 本篇文章主要介绍了SpringBoot整合JPA的实例代码,使用Hibernate作为JPA Provider,实现了数据持久化和查询等功能。通过本篇文章,可以了解如何使用JPA在SpringBoot项目中实现数据持久化。

    spring2021-team4

    从描述中的“README的实践小结”我们可以推测,这个项目可能包含了团队在学习或应用Spring框架过程中的一些总结和实践经验。尽管没有具体的标签提供更多信息,但根据Spring框架的一般用途和特性,我们可以深入探讨...

    SSM集成应用

    ### SSM集成应用知识点详述 #### Spring入门 **1.1 Spring是什么** Spring是一个开源框架,最初由Rod Johnson创建...**13.3 SpringDataJPA/springboot/springCloud** Spring生态系统中的其他重要组成部分和技术栈。

    Spring Boot Maven 打包可执行Jar文件的实现方法

    &lt;artifactId&gt;spring-boot-starter-data-jpa &lt;!-- mysql 数据库 --&gt; &lt;groupId&gt;mysql &lt;artifactId&gt;mysql-connector-java &lt;!-- commons-lang --&gt; &lt;groupId&gt;commons-lang &lt;artifactId&gt;commons-lang ...

    java连接数据库大全

    ### Java连接数据库大全知识点解析 #### 一、Java连接数据库概述 在现代软件开发中,数据库作为...此外,随着技术的发展,一些新的框架如Spring Data JPA等也提供了更为方便的数据库操作方式,值得开发者关注和学习。

Global site tag (gtag.js) - Google Analytics