http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/
1.Spring Data所解决的问题
Spring Data :提供了一整套数据访问层(DAO)的解决方案,致力于减少数据访问层(DAO)的开发量。它使用一个叫作Repository的接口类为基础,它被定义为访问底层数据模型的超级接口。而对于某种具体的数据访问操作,则在其子接口中定义。public interface Repository<T, ID extends Serializable> {}所有继承这个接口的interface都被spring所管理,此接口作为标识接口,功能就是用来控制domain模型的。Spring Data可以让我们只定义接口,只要遵循spring data的规范,就无需写实现类。2.什么是Repository?2.1 Repository(资源库):通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调。这个叫法就类似于我们通常所说的DAO,在这里,我们就按照这一习惯把数据访问层叫RepositorySpring Data给我们提供几个Repository,基础的Repository提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别CrudRepository: 继承Repository,实现了一组CRUD相关的方法PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法我们自己定义的XxxxRepository需要继承JpaRepository,这样我们的XxxxRepository接口就具备了通用的数据访问控制层的能力。2.2 JpaRepository 所提供的基本功能2.2.1 CrudRepository<T, ID extends Serializable>:这个接口提供了最基本的对实体类的添删改查操作T save(T entity);//保存单个实体 Iterable<T> save(Iterable<? extends T> entities);//保存集合 T findOne(ID id);//根据id查找实体 boolean exists(ID id);//根据id判断实体是否存在 Iterable<T> findAll();//查询所有实体,不用或慎用! long count();//查询实体数量 void delete(ID id);//根据Id删除实体 void delete(T entity);//删除一个实体void delete(Iterable<? extends T> entities);//删除一个实体的集合 void deleteAll();//删除所有实体,不用或慎用!2.2.2 PagingAndSortingRepository<T, ID extends Serializable>这个接口提供了分页与排序功能Iterable<T> findAll(Sort sort);//排序 Page<T> findAll(Pageable pageable);//分页查询(含排序功能)2.2.3 JpaRepository<T, ID extends Serializable>这个接口提供了JPA的相关功能List<T> findAll();//查找所有实体 List<T> findAll(Sort sort);//排序 查找所有实体 List<T> save(Iterable<? extends T> entities);//保存集合 void flush();//执行缓存与数据库同步 T saveAndFlush(T entity);//强制执行持久化void deleteInBatch(Iterable<T> entities);//删除一个实体集合3.Spring data 查询3.1 简单条件查询:查询某一个实体类或者集合按照Spring data 定义的规则,查询方法以find|read|get开头涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写其余字母小写为规定。例如:定义一个Entity实体类class User{private String firstname;private String lastname;}使用And条件连接时,应这样写:findByLastnameAndFirstname(String lastname,String firstname);条件的属性名称与个数要与参数的位置与个数一一对应3.2 使用JPA NamedQueries (标准规范实现)这种查询是标准的JPA规范所定义的,直接声明在Entity实体类上,调用时采用在接口中定义与命名查询对应的method,由Spring Data根据方法名自动完成命名查询的寻找。(1)在Entity实体类上使用@NamedQuery注解直接声明命名查询。@Entity@NamedQuery(name = "User.findByEmailAddress", query = "select u from User u where u.emailAddress = ?1")public class User {}注:定义多个时使用下面的注解@NamedQueries(value = { @NamedQuery(name = User.QUERY_FIND_BY_LOGIN, query = "select u from User u where u." + User.PROP_LOGIN + " = :username"), @NamedQuery(name = "getUsernamePasswordToken", query = "select new com.aceona.weibo.vo.TokenBO(u.username,u.password) from User u where u." + User.PROP_LOGIN + " = :username")})(2)在interface中定义与(1)对应的方法public interface UserRepository extends JpaRepository<User, Long> { List<User> findByLastname(String lastname); User findByEmailAddress(String emailAddress);}3.3 使用@Query自定义查询(Spring Data提供的)这种查询可以声明在Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring data的特有实现。例如:public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress);}3.4 @Query与 @Modifying 执行更新操作这两个annotation一起声明,可定义个性化更新操作,例如只涉及某些字段更新时最为常用,示例如下:@Modifying@Query("update User u set u.firstname = ?1 where u.lastname = ?2")int setFixedFirstnameFor(String firstname, String lastname);3.5 索引参数与命名参数(1)索引参数如下所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致@Modifying@Query("update User u set u.firstname = ?1 where u.lastname = ?2")int setFixedFirstnameFor(String firstname, String lastname);(2)命名参数(推荐使用这种方式)可以定义好参数名,赋值时采用@Param("参数名"),而不用管顺序。如下所示:public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname") User findByLastnameOrFirstname(@Param("lastname") String lastname, @Param("firstname") String firstname);}4. Transactionality(事务)4.1 操作单个对象的事务Spring Data提供了默认的事务处理方式,即所有的查询均声明为只读事务,对于持久化,更新与删除对象声明为有事务。参见org.springframework.data.jpa.repository.support.SimpleJpaRepository<T, ID>@org.springframework.stereotype.Repository@Transactional(readOnly = true)public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {……@Transactional public void delete(ID id) { delete(findOne(id)); }……}对于自定义的方法,如需改变spring data提供的事务默认方式,可以在方法上注解@Transactional声明4.2 涉及多个Repository的事务处理进行多个Repository操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service层实现对多个Repository的调用,并在相应的方法上声明事务。例如:@Service(“userManagement”)class UserManagementImpl implements UserManagement { private final UserRepository userRepository; private final RoleRepository roleRepository; @Autowired public UserManagementImpl(UserRepository userRepository, RoleRepository roleRepository) { this.userRepository = userRepository; this.roleRepository = roleRepository; } @Transactional public void addRoleToAllUsers(String roleName) { Role role = roleRepository.findByName(roleName); for (User user : userRepository.readAll()) { user.addRole(role); userRepository.save(user); }}5.关于DAO层的规范5.1对于不需要写实现类的情况:定义XxxxRepository 接口并继承JpaRepository接口,如果Spring data所提供的默认接口方法不够用,可以使用@Query在其中定义个性化的接口方法。5.2对于需要写实现类的情况:定义XxxxDao 接口并继承com.aceona.appleframework.persistent.data.GenericDao
书写XxxxDaoImpl实现类并继承com.aceona.appleframework.persistent.data.GenericJpaDao,同时实现XxxxDao接口中的方法
在Service层调用XxxxRepository接口与XxxxDao接口完成相应的业务逻辑
分享到:
相关推荐
**Spring Data JPA** 是一个基于 **Java** 的开源框架,它是 **Spring Framework** 的一个模块,主要用于简化 **Java Persistence API (JPA)** 的使用。JPA 是 Java 平台上的一个标准,用于管理和持久化应用程序的...
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
Spring Data JPA 是一个强大的框架,它简化了Java应用程序与数据库之间的交互,是Spring生态中的重要组成部分。通过使用Spring Data JPA,开发者可以避免编写大量的JPA(Java Persistence API)和SQL代码,专注于...
Spring框架的核心特性包括依赖注入(DI)和面向切面编程(AOP),并且它还提供了对数据库操作的支持,这主要通过Spring Data JPA和Java Persistence API(JPA)实现。 Spring注解是Spring框架中的一大特色,它极大...
Spring Data JPA是Spring生态中的一个强大ORM框架,它极大地提高了Java开发者在处理数据库操作时的效率。Spring Data JPA的主要优点在于其高度的开发效率、成熟的语法结构以及与Spring框架的紧密集成。 1. **开发...
《Spring Data JPA从入门到精通》是一本深入解析Spring Data JPA的书籍,它以Spring Boot框架为核心,旨在帮助读者全面理解并熟练运用Spring Data JPA进行数据库操作。Spring Data JPA是Spring Framework的一个模块...
在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...
**Spring Data JPA 深度解析** Spring Data JPA 是 Spring Framework 的一个重要模块,它为 Java Persistence API (JPA) 提供了便捷的数据访问层。这个框架简化了数据库操作,使得开发人员能够以声明式的方式处理...
Spring Data JPA是Java开发中的一个关键框架,它简化了与关系型数据库的交互,特别是基于Java Persistence API (JPA)。这个框架是Spring生态系统的组成部分,为开发者提供了声明式数据访问的方式,允许通过简单的...
Spring Data JPA 是一个基于 Java 的开源框架,它属于 Spring Data 家族的一部分,旨在简化 Java 应用中的数据访问层代码,特别针对基于 JPA(Java Persistence API)的数据持久化操作。本教程将详细介绍 Spring ...
Spring Data JPA 是一个强大的框架,它简化了与Java Persistence API (JPA) 的交互,JPA 是Java 开发者用来管理和持久化应用程序数据的一种标准。在这个“Spring Data JPA Demo”项目中,我们将深入探讨如何利用...
SpringDataJPA是Spring框架中用于简化数据持久层操作的一个模块,它基于Java持久层API(Java Persistence API,JPA)标准。在实际的项目开发中,SpringDataJPA能够极大程度上减少我们对于数据访问层代码的编写工作。...
使用 SpringBoot + SpringDataJPa 设计通用的权限管理系统,适合管理系统快速开发迭代,可用于开发模板,项目经过测试,可完美运行! 使用 SpringBoot + SpringDataJPa 设计通用的权限管理系统,适合管理系统快速...
【标题】"spring data jpa + spring + json demo"揭示了这个项目是关于使用Spring Data JPA、Spring框架以及JSON处理的一个示例应用。Spring Data JPA是Spring框架的一个模块,它简化了JPA(Java Persistence API)...
标题"其实spring data jpa比mybatis更好用.zip_JPA mybatis"指出本主题将探讨Spring Data JPA与MyBatis之间的比较,并暗示在某些方面,Spring Data JPA可能更为优越。描述中提到"全方位介绍jpa",表明内容将深入讲解...
在本项目"Spring Data JPA入门项目02"中,我们将深入探讨如何使用Spring Data JPA进行查询操作,包括排序和分页。Spring Data JPA是Spring Framework的一个模块,它为Java Persistence API (JPA) 提供了一种更加便捷...
Spring Data JPA是Spring生态系统中的一个重要组件,它为开发者提供了与JPA(Java Persistence API)交互的简化接口,极大地提高了数据访问的效率。本教程将深入探讨如何在Spring Boot项目中整合Spring Data JPA,...
**Spring Data JPA 简单案例** Spring Data JPA 是 Spring 框架的一个模块,它为使用 JPA(Java Persistence API)提供了强大的支持,简化了数据访问层的开发。通过使用 Spring Data JPA,我们可以避免编写大量重复...