转自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 提供了一种声明式的方式,通过Repository 接口来操作数据库,无需编写大量的DAO层代码。它支持自动查询生成,简化了CRUD(创建、读取、更新、删除)操作,并且可以轻松地处理复杂的查询。 2. **...
通过Spring Data JPA,开发者可以避免编写大量繁琐的DAO层代码,只需定义Repository接口,就能自动生成CRUD操作。此外,它还支持高级查询功能,如 Specifications 和 Querydsl,这使得编写复杂的数据库查询变得简单...
持久层工具合并 使用该组件后,全局仅需要注入唯一的Dao工具,无需再声明其他Dao/Repository,一个工具搞定所有Dao,极大简化持久层代码量。原生动态sql解析支持 依靠agile-sql(动态sql解析器)实现jpa中对sql语法...
Struts2.0、Spring2.5和JPA(Java Persistence API)是Java...然而,随着技术的发展,现在更推荐使用Spring Boot或Spring MVC + Spring Data JPA的组合,它们简化了配置,提供了更强大的自动化配置和开箱即用的功能。
Struts2与Spring的整合使得业务逻辑层可以方便地利用Spring的DI特性,增强了系统的可扩展性。 **JPA框架** JPA是Java EE 5引入的ORM规范,它允许开发者使用面向对象的方式来操作数据库,降低了数据库操作的复杂性...
Spring Boot简化了Spring应用的初始配置,Spring Data JPA则提供了对ORM(对象关系映射)的高级支持,而Spring Security则提供了安全控制功能。 总结,这个"spring练习小项目"是一个绝佳的学习平台,涵盖了Spring...
数据访问Spring Data JPA 数据库MySQL 安全认证JWT 前端框架暂未提及(可根据实际项目情况补充) 项目结构 com.fzh.com项目主包 config配置类,包括全局CORS配置、登录拦截器配置等。 controller控制器类...
Spring框架提供了一种基于JPA(Java Persistence API)的分页解决方案,例如使用Spring Data JPA或Hibernate的Criteria API。Spring Data JPA提供了Pageable接口,允许我们轻松地在Repository方法中实现分页查询。...
6. **Spring Data JPA**:Spring Data JPA是Spring提供的一个模块,它简化了JPA(Java Persistence API)的使用。通过提供Repository接口,可以自动实现基本的CRUD操作,同时支持复杂查询。 7. **MyBatis**:...
Spring Data JPA是Spring的一个模块,它简化了持久层的开发,通过提供一套高级的Repository接口,使得开发者无需编写大量的DAO层代码就能完成数据库操作。在本系统中,Spring Data JPA可能用于与数据库(如MySQL、...
- **Repository扩展**:通过定义自定义的Repository接口并继承Spring Data JPA提供的基本接口,可以方便地实现CRUD操作。 - **查询方法命名**:Spring Data JPA支持通过方法名自动生成对应的SQL查询,例如`findAll...
在这个系统中,Spring Data JPA帮助开发者以声明式的方式操作数据库,减少了编写SQL和DAO层的代码量。 3. **Hibernate**: Hibernate是JPA的一种实现,它是一个对象关系映射(ORM)框架。通过Hibernate,开发者可以...
在Spring Boot项目中,数据库连接通常通过配置文件(如application.properties或application.yml)进行设置,并使用Spring Data JPA或MyBatis的注解来定义实体和DAO层。 6. 模型-视图-控制器(MVC)架构:尽管...
- 引入 Spring Data JPA 或 MyBatis 进行数据访问。 - 使用 Spring Security 进行权限控制。 - 集成其他中间件,如 Redis 缓存、Quartz 定时任务等。 总结,Spring MVC 为开发者提供了灵活且强大的 Web 开发框架,...
- **Repository接口**:Spring Data JPA允许开发者通过定义Repository接口来操作数据库,无需编写具体的DAO层代码。例如,实现ActivityRepository接口,可以轻松实现对活动的增删改查操作。 3. **Thymeleaf模板...
在本项目中,可能使用了Spring Data JPA来实现数据库的CRUD操作,通过Repository接口,可以方便地执行SQL查询,而无需编写大量的DAO层代码。 4. **Vue.js** Vue.js是一个轻量级的前端JavaScript框架,以其易学易用...
- **介绍**:Spring Data项目中的一个子模块,用于简化Java持久层的开发,提供了一种声明式的JPA实现。 - **作用**:大大减少了编写DAO层代码的工作量,提高了开发效率。 #### 6. **Spring Boot** - **介绍**:...
使用JDBC(Java Database Connectivity)驱动,Spring Boot可以通过Spring Data JPA或者MyBatis与MySQL进行交互。 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有...
- 与Spring Data JPA或MyBatis等持久层框架结合,简化数据访问操作。 9. **配置方式**: - XML配置:传统的配置方式,所有的组件都在Spring配置文件中声明。 - Java配置:通过@Configuration和@Bean注解,更易读...