`

Spring Data JPA 简单介绍

 
阅读更多

背景
考虑到公司应用中数据库访问的多样性和复杂性,目前正在开发UDSL(统一数据访问层),开发到一半的时候,偶遇SpringData 工程。发现两者的思路惊人的一致。
于是就花了点时间了解SpringData,可能UDSL II期会基于SpringData做扩展

SpringData相关资料
介绍:针对关系型数据库,KV数据库,Document数据库,Graph数据库,Map-Reduce等一些主流数据库,采用统一技术进行访问,并且尽可能简化访问手段。
目前已支持的数据库有(主要):MongoDB,Neo4j,Redis,Hadoop,JPA等

SpringData官方资料(强烈推荐,文档非常详细)
SpringData主页:http://www.springsource.org/spring-data
SpringDataJPA 指南文档:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/  (非常详细)
SpringDataJPA Examples: https://github.com/SpringSource/spring-data-jpa-examples (非常详细的例子)

Spring-Data-Jpa简介
Spring Data Jpa 极大简化了数据库访问层代码,只要3步,就能搞定一切
1. 编写Entity类,依照JPA规范,定义实体
2. 编写Repository接口,依靠SpringData规范,定义数据访问接口(注意,只要接口,不需要任何实现)
3. 写一小陀配置文件 (Spring Scheme配置方式极大地简化了配置方式)

下面,我依赖Example中的例子,简单地介绍下以上几个步骤
User.java


 1  /**
 2   * User Entity Sample
 3   * 
 4   *  @author  <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> Aug 25, 2011
 5    */
 6  @Entity
 7  public   class  User  extends  AbstractPersistable < Long >  {
 8  
 9       private   static   final   long  serialVersionUID  =   - 2952735933715107252L ;
10  
11      @Column(unique  =   true )
12       private  String            username;
13       private  String            firstname;
14       private  String            lastname;
15  
16       public  String getUsername() {
17           return  username;
18      }
19  
20       public   void  setUsername(String username) {
21           this .username  =  username;
22      }
23  
24       public  String getFirstname() {
25           return  firstname;
26      }
27  
28       public   void  setFirstname(String firstname) {
29           this .firstname  =  firstname;
30      }
31  
32       public  String getLastname() {
33           return  lastname;
34      }
35  
36       public   void  setLastname(String lastname) {
37           this .lastname  =  lastname;
38      }
39  

没什么技术,JPA规范要求怎么写,它就怎么写

Repository.java


 1  /**
 2   * User Repository Interface.
 3   * 
 4   *  @author  <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> Aug 25, 2011
 5    */
 6  public   interface  SimpleUserRepository  extends  CrudRepository < User, Long > , JpaSpecificationExecutor < User >  {
 7  
 8       public  User findByTheUsersName(String username);
 9  
10       public  List < User >  findByLastname(String lastname);
11  
12      @Query( " select u from User u where u.firstname = ? " )
13       public  List < User >  findByFirstname(String firstname);
14  
15      @Query( " select u from User u where u.firstname = :name or u.lastname = :name " )
16       public  List < User >  findByFirstnameOrLastname(@Param( " name " ) String name);
17      
18  

需要关注它继承的接口,我简单介绍几个核心接口

Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别
CrudRepository: 继承Repository,实现了一组CRUD相关的方法
PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法
JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法
JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法

不需要写任何实现类,Spring Data Jpa框架帮你搞定这一切。

Spring Configuration

 1  < beans >
 2       < bean id = " entityManagerFactory "   class = " org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean " >
 3           < property name = " dataSource "  ref = " dataSource "   />
 4           < property name = " jpaVendorAdapter " >
 5               < bean  class = " org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter " >
 6                   < property name = " generateDdl "  value = " true "   />
 7                   < property name = " database "  value = " HSQL "   />
 8               </ bean >
 9           </ property >
10           < property name = " persistenceUnitName "  value = " jpa.sample "   />
11       </ bean >
12  
13       < bean id = " transactionManager "   class = " org.springframework.orm.jpa.JpaTransactionManager " >
14           < property name = " entityManagerFactory "  ref = " entityManagerFactory "   />
15       </ bean >
16  
17       < jdbc:embedded - database id = " dataSource "  type = " HSQL "   />
18  
19  
20       < jpa:repositories base - package = " org.springframework.data.jpa.example.repository.simple "   />
21  </ beans>

核心代码只要配置一行:<jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" />即可。上面的仅仅是数据源,事务的配置而已。

至此,大功告成,即可运行

 1  /**
 2   * Intergration test showing the basic usage of { @link  SimpleUserRepository}.
 3   * 
 4   *  @author  <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> Aug 25, 2011
 5    */
 6  @RunWith(SpringJUnit4ClassRunner. class )
 7  @ContextConfiguration(locations  =   " classpath:simple-repository-context.xml " )
 8  @Transactional
 9  public   class  SimpleUserRepositorySample {
10  
11      @Autowired
12      SimpleUserRepository repository;
13      User                 user;
14  
15      @Before
16       public   void  setUp() {
17          user  =   new  User();
18          user.setUsername( " foobar " );
19          user.setFirstname( " firstname " );
20          user.setLastname( " lastname " );
21      }
22  
23       //  crud方法测试
24      @Test
25       public   void  testCrud() {
26          user  =  repository.save(user);
27          assertEquals(user, repository.findOne(user.getId()));
28      }
29  
30       //  method query测试
31      @Test
32       public   void  testMethodQuery()  throws  Exception {
33          user  =  repository.save(user);
34          List < User >  users  =  repository.findByLastname( " lastname " );
35          assertNotNull(users);
36          assertTrue(users.contains(user));
37      }
38  
39       //  named query测试
40      @Test
41       public   void  testNamedQuery()  throws  Exception {
42          user  =  repository.save(user);
43          List < User >  users  =  repository.findByFirstnameOrLastname( " lastname " );
44          assertTrue(users.contains(user));
45      }
46  
47       //  criteria query测试
48      @Test
49       public   void  testCriteriaQuery()  throws  Exception {
50          user  =  repository.save(user);
51          List < User >  users  =  repository.findAll( new  Specification < User > () {
52  
53              @Override
54               public  Predicate toPredicate(Root < User >  root, CriteriaQuery <?>  query, CriteriaBuilder cb) {
55                   return  cb.equal(root.get( " lastname " ),  " lastname " );
56              }
57          });
58          assertTrue(users.contains(user));
59      }
60  

其中,写操作相对比较简单,我不做详细介绍,针对读操作,我稍微描述下:
Method Query: 方法级别的查询,针对 findByfindreadByreadgetBy等前缀的方法,解析方法字符串,生成查询语句,其中支持的关键词有:


Named Query: 针对一些复杂的SQL,支持原生SQL方式,进行查询,保证性能
Criteria Query: 支持JPA标准中的Criteria Query

备注:
本文只是简单介绍SpringDataJpa功能,要深入了解的同学,建议直接传送到官方网站
分享到:
评论
9 楼 yuanliangding 2016-02-22  
Spring太强大了。
7 楼 linkahu 2013-04-23  
1.spring data 不过是对这些存储层做了Spring支持,简化了开发,用spring data 做所谓统一访问层是不合适的。
2. Mapreduce 不是数据库,分布式计算框架而已。
6 楼 dwangel 2013-01-20  
nhy520 写道
Repository 其实就是实体的DAO实现,封装了增删改查等一般操作。
你只要在自己的service 层注入它,并直接调用就可以了。


Repository这个名词,我觉得来源于 《面向Domain编程》
即DomainModel的聚合。

Repository基础接口是没有CRUD的方法的。

org.springframework.data.repository.CrudRepository才有 
5 楼 dwangel 2013-01-20  
istone 写道
请教个问题:spring data怎么处理数据的关联关系?就针对关系型数据库来说,spring data与hibernate相比,它的优点在哪里?


spring data是在JPA之上的封装。
利用动态生成代码,实现Repository(DAO)能力。
(其实就是只要声明Repository,不用写里面的代码,就通过spring注入来用了。)

具体数据库访问是,数据关联关系是持久化底层处理的。

如果JPA实现用的是hibernate,那么底层就是hibernate处理数据关联关系。

Spring DATA 的作者好像是Hade的作者,概念类似。
4 楼 istone 2012-05-25  
请教个问题:spring data怎么处理数据的关联关系?就针对关系型数据库来说,spring data与hibernate相比,它的优点在哪里?
3 楼 nhy520 2011-11-02  
Repository 其实就是实体的DAO实现,封装了增删改查等一般操作。
你只要在自己的service 层注入它,并直接调用就可以了。
2 楼 xenogear 2011-11-02  
父接口有方法……
本人初学
抱歉问了个无聊的问题。
1 楼 xenogear 2011-11-02  
请问如果在Repository.java里面同时实现增删改的话,应该怎么处理?

相关推荐

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    **Spring Data JPA** 是一个基于 **Java** 的开源框架,它是 **Spring Framework** 的一个模块,主要用于简化 **Java Persistence API (JPA)** 的使用。JPA 是 Java 平台上的一个标准,用于管理和持久化应用程序的...

    Spring Data JPA API(Spring Data JPA 开发文档).CHM

    Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。

    Spring Data JPA 笔记

    至于压缩包中的“helloworld”文件,可能是一个简单的示例项目,通常会包含一个基础的Spring Data JPA配置,一个实体类,以及对应的Repository接口,用于展示Spring Data JPA的基本用法。通过查看这个例子,你可以更...

    spring注解+spring data jpa文档+JPA文档.rar

    Spring框架的核心特性包括依赖注入(DI)和面向切面编程(AOP),并且它还提供了对数据库操作的支持,这主要通过Spring Data JPA和Java Persistence API(JPA)实现。 Spring注解是Spring框架中的一大特色,它极大...

    spring data jpa简单案例

    **Spring Data JPA 简单案例** Spring Data JPA 是 Spring 框架的一个模块,它为使用 JPA(Java Persistence API)提供了强大的支持,简化了数据访问层的开发。通过使用 Spring Data JPA,我们可以避免编写大量重复...

    Spring Data JPA从入门到精通

    'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...

    Spring Data JPA的优点和难点.pdf

    Spring Data JPA是Spring生态中的一个强大ORM框架,它极大地提高了Java开发者在处理数据库操作时的效率。Spring Data JPA的主要优点在于其高度的开发效率、成熟的语法结构以及与Spring框架的紧密集成。 1. **开发...

    spring data jpa 教程

    本教程将详细介绍 Spring Data JPA 的核心概念与使用方法,帮助开发者从基础入门到实现复杂查询的完整过程。 第一章:Spring Data JPA 入门 Spring Data JPA 简化了 JPA(Java Persistence API)的开发,通过约定...

    Spring Data JPA.zip

    - **强大的查询支持**:除了简单的 CRUD 方法,Spring Data JPA 还支持基于方法名的复杂查询,甚至可以使用 JPA Querydsl 或 Specification 进行更复杂的查询。 - **事务管理**:Spring Data JPA 结合 Spring 的事务...

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

    在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...

    Spring Data JPA Demo

    Spring Data JPA 是一个强大的框架,它简化了与Java Persistence API (JPA) 的交互,JPA 是Java 开发者用来管理和持久化应用程序数据的一种标准。在这个“Spring Data JPA Demo”项目中,我们将深入探讨如何利用...

    Spring Data JPA中文文档[1.4.3].zip

    Spring Data JPA是Java开发中的一个关键框架,它简化了与关系型数据库的交互,特别是基于Java Persistence API (JPA)。这个框架是Spring生态系统的组成部分,为开发者提供了声明式数据访问的方式,允许通过简单的...

    springdatajpa.pdf

    通过上面的介绍,我们了解到SpringDataJPA不但提高了代码的复用性,还降低了ORM框架切换的成本。如果项目需要更换底层的数据持久化框架,只需要更换相应的JPA实现即可,而应用程序代码则几乎不需要改动。这样的特性...

    其实spring data jpa比mybatis更好用.zip_JPA mybatis

    在Spring Boot框架中,Spring Data JPA的集成变得更加简单。Spring Boot通过自动配置,可以快速启动一个JPA应用,只需少量甚至无需配置。同时,Spring Boot还支持数据源的自动配置,使得开发者可以快速连接到数据库...

    spring data jpa + spring + json demo

    【描述】中的"简单的springMVC入门程序配置Spring data jpa亲测可完美运行"说明这是一个基于Spring MVC的项目,Spring MVC是Spring框架的一部分,用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构模式的...

    springBoot整合springData JPA

    **SpringBoot整合SpringData JPA** 是一个现代Java开发中的常见技术栈,它结合了Spring Boot的便捷性和Spring Data JPA的数据访问效率。Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring ...

    spring学习:spring data jpa

    Spring Data JPA是Spring框架的一个模块,主要目的是简化Java企业级应用中数据访问层的开发。这个框架构建在JPA(Java Persistence API)之上,提供了一种声明式的方式来操作数据库,使得开发者无需编写大量的SQL...

    Spring Boot整合SpringDataJPA

    Spring Data JPA是Spring生态系统中的一个重要组件,它为开发者提供了与JPA(Java Persistence API)交互的简化接口,极大地提高了数据访问的效率。本教程将深入探讨如何在Spring Boot项目中整合Spring Data JPA,...

Global site tag (gtag.js) - Google Analytics