Spring Data JPA 简单介绍

标签: spring data jpa | 发表时间:2011-08-25 15:18 | 作者:stone2083 tangfl
出处:http://www.blogjava.net/
背景
考虑到公司应用中数据库访问的多样性和复杂性,目前正在开发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
User.java
 1 /**
 2  * User Entity Sample
 3  * 
 4  * @author <a href="mailto:[email protected]">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
SimpleUserRepository.java
 1 /**
 2  * User Repository Interface.
 3  * 
 4  * @author <a href="mailto:[email protected]">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
Configuration.xml
 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" />即可。上面的仅仅是数据源,事务的配置而已。

至此,大功告成,即可运行
Sample.java
 1 /**
 2  * Intergration test showing the basic usage of {@link SimpleUserRepository}.
 3  * 
 4  * @author <a href="mailto:[email protected]">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功能,要深入了解的同学,建议直接传送到官方网站


stone2083 2011-08-25 15:18 发表评论

相关 [spring data jpa] 推荐:

Spring Data JPA 简单介绍

- tangfl - BlogJava-首页技术区
考虑到公司应用中数据库访问的多样性和复杂性,目前正在开发UDSL(统一数据访问层),开发到一半的时候,偶遇SpringData工程. 于是就花了点时间了解SpringData,可能UDSL II期会基于SpringData做扩展. 介绍:针对关系型数据库,KV数据库,Document数据库,Graph数据库,Map-Reduce等一些主流数据库,采用统一技术进行访问,并且尽可能简化访问手段.

spring data jpa简单实例

- - 编程语言 - ITeye博客
我们都知道Spring是一个非常优秀的JavaEE整合框架,它尽可能的减少我们开发的工作量和难度.   在持久层的业务逻辑方面,Spring开源组织又给我们带来了同样优秀的Spring Data JPA.   通常我们写持久层,都是先写一个接口,再写接口对应的实现类,在实现类中进行持久层的业务逻辑处理.

了解 Spring Data JPA - hungerW

- - 博客园_首页
自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为开发者提供了丰富的选择. 它一改之前 EJB 2.x 中实体 Bean 笨重且难以使用的形象,充分吸收了在开源社区已经相对成熟的 ORM 思想. 另外,它并不依赖于 EJB 容器,可以作为一个独立的持久层技术而存在.

使用 Spring Data JPA 简化 JPA 开发

- -
Spring Data JPA 让一切近乎完美. 通过前面的分析可以看出,Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建、事务处理等 JPA 相关的处理,这基本上也是作为一个开发框架而言所能做到的极限了. 然而,Spring 开发小组并没有止步,他们再接再厉,于最近推出了 Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,至此,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成.

Spring Data JPA,基础学习笔记.

- - ITeye博客
最好先学习 JPA 方面的知识....在这里使用的是 Hibernate. 也已经使用了一段时间,看什么都不如看官方文档,我这里也只是写个笔记记录一下,如果能帮助到其他人,很开心 .算是个 demoshow 吧.这里也只写了一些我觉得比较有用的地方.其他一些使用知识,请参见官方文档:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/.

使用Java 8 Streams和Spring Data JPA流式传输MySQL结果

- -
2015年10月19日|  KrešimirNesek. 从1.8版开始,Spring数据项目包含一个有趣的功能 - 通过一个简单的API调用,开发人员可以请求将数据库查询结果作为Java 8流返回. 在技​​术上可行并且由底层数据库技术支持的情况下,结果将逐个流式传输,并且可以使用流操作进行处理.

在Spring Data JPA中使用Update query更新实体

- -
使用诸如Hibernate之类的对象关系映射(ORM)工具,通常通过首先从数据库中获取实体,修改某些字段,然后再次持久化实体来修改实体. 在许多情况下,这是一种很好的方法,但在某些情况下,这可能并不理想. 例如,如果要更新实体集合(即数据库中的行),或者需要大量数据来构造实体对象. 在后一种情况下,例如,可能需要太多资源来组装实体对象以仅改变单个字段的值.

【原创】纯干货,Spring-data-jpa详解,全方位介绍。 - 神一样的存在 - 博客园

- -
本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求. 这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整合的环境中实现. 如果需要了解该框架的入门,百度一下,很多入门的介绍. 在这篇文章的接下来一篇,会有一个系列来讲解mybatis,这个系列从mybatis的入门开始,到基本使用,和spring整合,和第三方插件整合,缓存,插件,最后会持续到mybatis的架构,源码解释,重点会介绍几个重要的设计模式,这样一个体系.

SpringSource发布Spring Data Redis 1.0.0

- - InfoQ cn
近日, SpringSource 发布了用于将Redis轻松集成到Java应用中的开源 库的首个稳定版. Redis是个由VMWare/SpringSource资助的键值存储,为一些高性能网站如GitHub与StackOverflow等所用. Redis是新近涌现的NoSQL数据存储之一,它关注于简单性与性能(整个数据集放在内存中).

文章: Spring Data —— 完全统一的API?

- - InfoQ cn
Spring Data 作为SpringSource的其中一个父项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储. 白皮书下载:JBoss Enterprise Application Platform 6迁移指南. 白皮书下载:从虚拟化到云:在云中优化和自动化IT.