前几天看了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知识点详解" ...小结 Spring Data JPA是一种基于JPA的数据访问技术,它提供了一种简洁的方式来访问关系数据库。使用Spring Data JPA可以简化数据库操作,提高开发效率和可读性。
小结 在使用 Spring Data JPA 连接 MySQL 8.x 时,需要注意环境变量的配置、数据库连接信息的配置、时区的配置、useSSL 的配置、JDBC 版本的配置等。同时,需要正确地配置方言设置,以避免出现问题。
#### 三、SpringData方法定义规范 Spring Data JPA 通过定义方法名的约定来推断方法的行为。以下是一些常用的方法名前缀和示例: - **查询所有数据**:`findAll()` 或 `findUsers()`(假设实体类名为 User)。 - *...
小结 本文总结了 Spring Boot + Jpa(Hibernate) 架构基本配置的知识点,包括 Spring Boot 和 Jpa(Hibernate) 的简介、配置和 Maven 依赖项的添加。通过本文,读者可以了解如何使用 Spring Boot 和 Jpa(Hibernate) ...
Spring Boot Actuator监控端点小结 在传统Spring应用中使用spring-boot-actuator模块提供监控端点 Spring Boot应用的后台运行配置 Spring Boot自定义Banner Dubbo进行服务治理 chapter9-2-1:Spring Boot中使用Dubbo...
- [Spring Boot Actuator监控端点小结](http://blog.didispace.com/spring-boot-actuator-1/) - [在传统Spring应用中使用spring-boot-actuator模块提供监控端点]...
- **Data JPA Starter** (`spring-boot-starter-data-jpa`):提供了JPA支持,包括实体管理、数据库连接等。 - **Security Starter** (`spring-boot-starter-security`):提供了Spring Security的安全认证与授权功能...
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的...
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的实例代码,使用Hibernate作为JPA Provider,实现了数据持久化和查询等功能。通过本篇文章,可以了解如何使用JPA在SpringBoot项目中实现数据持久化。
从描述中的“README的实践小结”我们可以推测,这个项目可能包含了团队在学习或应用Spring框架过程中的一些总结和实践经验。尽管没有具体的标签提供更多信息,但根据Spring框架的一般用途和特性,我们可以深入探讨...
### SSM集成应用知识点详述 #### Spring入门 **1.1 Spring是什么** Spring是一个开源框架,最初由Rod Johnson创建...**13.3 SpringDataJPA/springboot/springCloud** Spring生态系统中的其他重要组成部分和技术栈。
<artifactId>spring-boot-starter-data-jpa <!-- mysql 数据库 --> <groupId>mysql <artifactId>mysql-connector-java <!-- commons-lang --> <groupId>commons-lang <artifactId>commons-lang ...
### Java连接数据库大全知识点解析 #### 一、Java连接数据库概述 在现代软件开发中,数据库作为...此外,随着技术的发展,一些新的框架如Spring Data JPA等也提供了更为方便的数据库操作方式,值得开发者关注和学习。