`
徜徉の小溪
  • 浏览: 448011 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring-data-jpa 数据库访问模板框架

阅读更多

如果你在开发的时候还为如何,写繁琐的数据库访问的语句或复杂条件的多表查询而头痛时。

你可以不妨试一下spring-data-jpa 为你提供的一整套全面的数据访问模板, 也为你的开发提高效率。其扩展性也会让你大开眼见.废话不多说了下面就来试试看吧......

 

引入: 

Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。对于拥有海量数据的项目,可以用Spring Data来简化项目的开发。 

然而针对不同的数据储存访问使用相对的类库来操作访问。Spring Data中已经为我们提供了很多业务中常用的一些接口和实现类来帮我们快速构建项目,比如分页、排序、DAO一些常用的操作。 

今天主要是对Spring Data下的JPA模块进行讲解。 

为什么说Spring Data能帮助我们快速构建项目呢,因为Spring Data已经在数据库访问层上帮我们实现了公用功能了,而我们只需写一个接口去继承Spring Data提供给我们接口,便可实现对数据库的访问及操作,类似于spring-orm的TemplateDAO。 

----------------------------------------------邪恶的分割线------------------------------------------------------------------------------ 
核心接口: 

下面来看一下Repository的最顶层接口: 

Java代码  收藏代码
  1. public interface Repository<T, ID extends Serializable> {  
  2.   
  3. }  


这个接口只是一个空的接口,目的是为了统一所有Repository的类型,其接口类型使用了泛型,泛型参数中T代表实体类型,ID则是实体中id的类型。 

再来看一下Repository的直接子接口CrudRepository中的方法: 

Java代码  收藏代码
  1. public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {  
  2.   
  3.     <S extends T> S save(S entity);  
  4.   
  5.     <S extends T> Iterable<S> save(Iterable<S> entities);  
  6.   
  7.     T findOne(ID id);  
  8.   
  9.     boolean exists(ID id);  
  10.   
  11.     Iterable<T> findAll();  
  12.   
  13.     Iterable<T> findAll(Iterable<ID> ids);  
  14.   
  15.     long count();  
  16.   
  17.     void delete(ID id);  
  18.   
  19.     void delete(T entity);  
  20.   
  21.     void delete(Iterable<? extends T> entities);  
  22.   
  23.     void deleteAll();  
  24. }  


此接口中的方法大多是我们在访问数据库中常用的一些方法,如果我们要写自己的DAO类的时候,只需定义个接口来集成它便可使用了。 

再来看看Spring Data未我们提供分页和排序的Repository的接口PagingAndSortingRepository: 

Java代码  收藏代码
  1. public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {  
  2.   
  3.     Iterable<T> findAll(Sort sort);  
  4.   
  5.     Page<T> findAll(Pageable pageable);  
  6. }  


这些Repository都是spring-data-commons提供给我们的核心接口,spring-data-commons是Spring Data的核心包。这个接口中为我们提供了数据的分页方法,以及排序方法。看吧,spring-data让我们省了很多心了,一切都按照这个规范进行构造,就连业务系统中常用到的一些操作都为我们考虑到了,而我们只需更用心的去关注业务逻辑层。spring-data将repository的颗粒度划得很细,其实我觉得spring的框架中将每个类的颗粒度都划得很细,这主要也是为了责任分离。 


----------------------------------------------邪恶的分割线------------------------------------------------------------------------------ 
JPA实现: 
针对spring-data-jpa又提供了一系列repository接口,其中有JpaRepository和JpaSpecificationExecutor,这2个接口又有什么区别呢,我们分别来看看这2个接口的源码。 

JpaRepository.class 

Java代码  收藏代码
  1. public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {  
  2.   
  3.     List<T> findAll();  
  4.   
  5.     List<T> findAll(Sort sort);  
  6.   
  7.     <S extends T> List<S> save(Iterable<S> entities);  
  8.     void flush();  
  9.   
  10.     T saveAndFlush(T entity);  
  11.   
  12.     void deleteInBatch(Iterable<T> entities);  
  13.   
  14.     void deleteAllInBatch();  


这个类继承自PagingAndSortingRepository,看其中的方法,可以看出里面的方法都是一些简单的操作,并未涉及到复杂的逻辑。当你在处理一些简单的数据逻辑时,便可继承此接口,看一个小例子吧。本文JPA供应者选择的是Hibernate EntityManager,当然读者们也可以选择其他的JPA供应者,比如EclipseLink、OpenJPA,反正JPA是个标准,在无须修改的情况下便可移植。 

先定义一用户实体类User.class: 

Java代码  收藏代码
  1. @Entity  
  2. @Table( name = "spring_data_user" )  
  3. @PrimaryKeyJoinColumn( name = "id" )  
  4. public class User extends IdGenerator{  
  5.   
  6.     private static final long serialVersionUID = 1L;  
  7.       
  8.     private String name;  
  9.     private String username;  
  10.     private String password;  
  11.     private String sex;  
  12.     private Date birth;  
  13.     private String address;  
  14.     private String zip;  
  15.           
  16.         //省略getter和setter  
  17. }  


Id生成策略是采用的表生成策略,这里就不贴代码了,spring的配置文件我也就不贴出来了,反正就那些东西,网上一查,遍地都是。后续我会在将demo附上来。 

实体类是有了,现在得写一个持久层,这样才能操作数据库啊,现在我们来看一下持久层。IUserDao.class: 

Java代码  收藏代码
  1. @Repository("userDao")  
  2. public interface IUserDao extends JpaRepository<User, Long>{}  


再在spring的配置文件中加上以下代码。 

Xml代码  收藏代码
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  3.     xmlns:jpa="http://www.springframework.org/schema/data/jpa"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.     http://www.springframework.org/schema/data/jpa  
  6.     http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">  
  7.   
  8.     <jpa:repositories base-package="org.tea.springdata.**.dao" />  
  9. </beans>  


加上这段后Spring就会将指定包中@Repository的类注册为bean,将bean托管给Spring。这样定义完了就OK了!哦,就这样就可以操作数据库了? 
是的,前面我就已经说了,Spring data已经帮我们写好一个实现类了,而简单的操作我们只须这样继承JpaRepository就可以做CRUD操作了。再写个业务类来测试一把吧。由于我用的Cglib来动态代理,所以就不定义接口了,直接定义类UserService.class: 

Java代码  收藏代码
  1. @Service("userService")  
  2. public class UserService {  
  3.       
  4.     @Autowired  
  5.     private IUserDao dao;  
  6.       
  7.     public void save(User user) {  
  8.         dao.save(user);  
  9.     }  
  10.   
  11.     public void delete(Long id) {  
  12.         dao.delete(id);  
  13.     }  
  14.   
  15.     public void update(User user) {  
  16.         dao.saveAndFlush(user);  
  17.     }  
  18.   
  19.     public List<User> findAll() {  
  20.         return dao.findAll();  
  21.     }  
  22. }  


来写一单元测试。 

Java代码  收藏代码
  1. public class UserServiceTest {  
  2.       
  3.     private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
  4.       
  5.     private static UserService userService = (UserService) context.getBean("userService");  
  6.       
  7.     public void saveUser() {  
  8.         StopWatch sw = new StopWatch(getClass().getSimpleName());  
  9.         sw.start("Add a user information.");  
  10.         User u = new User();  
  11.         u.setName("John");  
  12.         u.setSex("Man");  
  13.         u.setUsername("JohnZhang");  
  14.         u.setPassword("123456");  
  15.         u.setBirth(new Date());  
  16.         userService.save(u);  
  17.         sw.stop();  
  18.         System.err.println(sw.prettyPrint());  
  19.     }  
  20.   
  21.      public static void main(String[] args) {  
  22.         UserServiceTest test = new UserServiceTest();  
  23.         test.saveUser();  
  24.     }  
  25. }  


绿了,高兴了,测试通过! 
额,都没用Junit怎么会绿呢,开个玩笑。 
其余继承下来的操作方法,大家都可以自己测试一下,如没意外,应该都会测试通过。 

好吧,今天就暂时分享到这了,你千万别以为Spring-data就这么点功能,这只是spring-data中最入门级的知识,后续还有很多东西值得学习,在下一篇文章中我会列出spring-data-jpa中精华的部分,对其进行讲解,并附上Demo供下载。 

写一篇博客真不容易,好歹也要花上几小时,文笔不行,如有不正之处,欢迎拍砖。如觉得还不错,请顶一票。谢谢!

分享到:
评论

相关推荐

    使用SpringBoot 集成Spring-data-jpa,Druid连接池,thymeleaf模板实现的一个简单网上商城项目.rar

    该项目是一个基于SpringBoot框架构建的简单网上商城应用,利用了Spring-data-jpa进行数据库操作,Druid作为数据连接池,并采用Thymeleaf模板引擎来处理前端展示。下面将详细介绍这三个核心组件及其在项目中的作用。 ...

    spring-data-jpa 简单实例

    通过 Spring Data JPA,我们可以快速地创建数据访问层,包括基本的 CRUD(创建、读取、更新、删除)操作,而无需编写大量的模板代码。在这个实例中,我们将探讨如何设置和使用 Spring Data JPA 实现简单的数据库操作...

    spring-data-jpa-example

    Spring Data JPA 是 Spring 框架的一部分,它为开发者提供了一种简单、高效的方式来访问和操作数据库,而无需编写大量的 CRUD(创建、读取、更新、删除)操作代码。这个名为 "spring-data-jpa-example" 的项目是一个...

    spring-boot-sample-data-jpa

    在Spring Boot中,Spring Data JPA提供了高级的Repository抽象,允许开发者以声明式的方式进行数据访问,而无需编写大量的模板代码。这个示例项目很可能是为了展示如何配置和使用Spring Data JPA,以及如何与不同的...

    SpringBoot中使用Spring-data-jpa分页查询

    Spring Data JPA是Spring框架的一部分,它提供了对Java Persistence API (JPA) 的简化封装,允许开发者通过面向接口的方式进行数据库操作,包括进行复杂的查询和分页。 首先,要启用Spring Data JPA功能,我们需要...

    SpringBoot使用Spring-data-jpa简化数据访问层

    对数据库的操作无非就“增删改查”。就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写...Spring-data-jpa的出现正可以让这样一个已经很“薄”的数据访问层变成只是一层接口的编写方式。

    Spring-data-jpa 学习笔记.docx

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

    spring-boot-starter-data-jpa 的二级缓存

    在实践中,Spring Data JPA确实简化了基于JPA的数据访问层的实现。它提供了一套便捷的方式来定义存储库接口,开发者仅需声明接口方法,Spring Data JPA就会自动提供方法的实现。这种声明式的数据访问方式可以大幅...

    spring-data-jpa-1.1.0.RELEASE

    Spring Data JPA是Spring框架的一个重要模块,它为Java Persistence API (JPA)提供了一种声明式、模板驱动的方式来访问数据库。Spring Data JPA 1.1.0.RELEASE版本是这个库的一个早期版本,但仍然包含了丰富的功能和...

    基于Idea+spring-boot+spring-data-jpa+spring-security的Demo

    Spring Data JPA是Spring框架的一个模块,它提供了与JPA(Java Persistence API)的集成,简化了数据库操作。通过Spring Data JPA,你可以利用注解来定义实体,使用Repository接口来执行CRUD操作,而无需编写大量的...

    SprinMVC+Spring+Spring-Data-JPA

    Spring MVC、Spring 和 Spring Data JPA 是 Java 企业级开发中的三大核心框架,它们共同构建了一个强大、灵活且高效的后端应用架构。本教程将深入探讨这三个组件的整合及其核心功能,帮助你理解和掌握现代Java Web...

    spring-data-jpa-1.7.0.RELEASE

    Spring Data JPA,作为Spring框架的重要组成部分,是Java开发者在处理持久化层时的得力工具。1.7.0.RELEASE版本是这个库的一个稳定版本,提供了对JPA(Java Persistence API)的全面支持,使得开发人员能够更高效、...

    Spring3+Spring-data-mongodb1.5.6示例

    在本示例中,我们将深入探讨如何在Spring 3框架中集成Spring Data MongoDB 1.5.6,以便高效地处理MongoDB数据库。Spring Data MongoDB是Spring Data项目的一部分,它提供了一个面向对象的API,使得与NoSQL数据库...

    springData-jpa-demo

    通过这个框架,开发者可以避免编写大量的JPA模板代码,只需定义Repository接口,框架就会自动实现数据访问功能。 在这个demo项目中,我们可以期待看到以下几个关键知识点: 1. **配置**:项目通常会包含一个`pom....

    spring4.x+springdatajpa+springmvc+maven搭建

    通过整合Spring 4.x、Spring Data JPA、Spring MVC和Maven,我们可以快速构建出一个高效、可维护的Web应用,其中数据访问层借助Spring Data JPA实现了简洁的数据库操作,业务逻辑由Spring MVC处理,而项目的构建和...

    spring-boot-parent.rar

    2. **依赖管理**:在Spring Boot的父项目中,会包含Spring Boot的核心依赖及其推荐版本,如Spring框架、Spring Boot Starter、Web、Data JPA等。这样,子模块可以直接引用这些依赖,而无需指定具体版本,简化了版本...

    spring-boot-samples-master

    3. **数据访问**:"spring-boot-sample-data-jpa"和"spring-boot-sample-data-mongodb"分别演示了如何与关系型数据库(如MySQL、PostgreSQL)和非关系型数据库(如MongoDB)集成,使用JPA和Spring Data进行数据操作...

    Spring Data JPA 2.0 标准模板

    Spring Data JPA 是 Spring 框架的一个子项目,它简化了数据访问层的开发,提供了对 Java Persistence API(JPA)的高度抽象和自动化。在 Spring Data JPA 2.0 版本中,它引入了更多优化和改进,使得开发者能更高效...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    总结来说,本项目是一个基础的Web开发框架,结合了SpringMVC的MVC设计模式、Spring Data JPA的数据访问层、Hibernate的ORM能力以及FreeMarker的模板引擎,同时还实现了环境配置的灵活切换,为开发高效、可维护的Web...

    Spring Data JDBC与JDBC的区别

    Spring Data JDBC与JDBC是两种不同的数据库访问方式,它们在Java开发中有着广泛的应用。JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种数据库进行交互。它提供了低级别的数据库操作,如建立...

Global site tag (gtag.js) - Google Analytics