`
z276356445t
  • 浏览: 152099 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

一步步学习 Spring Data 系列之JPA(一)

阅读更多
大概有半年多没有写博客了,主要是最近忙于工作,也没来得及与大家分享技术。当然现在的技术大多都有人写其博客分享了,也找不到合适写的,所以也就懒得写了。最近在SpringSource上看到了一好玩的东东,于是就照着官方的文档玩了一把,再根据自己的理解写给博友们品鉴,如有不对的地方,欢迎博友们提出,笔者会一一记录下来,以便后续改进。

引入:

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

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

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

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

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

下面来看一下Repository的最顶层接口:
public interface Repository<T, ID extends Serializable> {

}

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

再来看一下Repository的直接子接口CrudRepository中的方法:
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {

	<S extends T> S save(S entity);

	<S extends T> Iterable<S> save(Iterable<S> entities);

	T findOne(ID id);

	boolean exists(ID id);

	Iterable<T> findAll();

	Iterable<T> findAll(Iterable<ID> ids);

	long count();

	void delete(ID id);

	void delete(T entity);

	void delete(Iterable<? extends T> entities);

	void deleteAll();
}

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

再来看看Spring Data未我们提供分页和排序的Repository的接口PagingAndSortingRepository:
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {

	Iterable<T> findAll(Sort sort);

	Page<T> findAll(Pageable pageable);
}

这些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
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {

	List<T> findAll();

	List<T> findAll(Sort sort);

	<S extends T> List<S> save(Iterable<S> entities);
	void flush();

	T saveAndFlush(T entity);

	void deleteInBatch(Iterable<T> entities);

	void deleteAllInBatch();

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

先定义一用户实体类User.class:
@Entity
@Table( name = "spring_data_user" )
@PrimaryKeyJoinColumn( name = "id" )
public class User extends IdGenerator{

	private static final long serialVersionUID = 1L;
	
	private String name;
	private String username;
	private String password;
	private String sex;
	private Date birth;
	private String address;
	private String zip;
        
        //省略getter和setter
}

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

实体类是有了,现在得写一个持久层,这样才能操作数据库啊,现在我们来看一下持久层。IUserDao.class:
@Repository("userDao")
public interface IUserDao extends JpaRepository<User, Long>{}

再在spring的配置文件中加上以下代码。
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/data/jpa
	http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

	<jpa:repositories base-package="org.tea.springdata.**.dao" />
</beans>

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

	public void delete(Long id) {
		dao.delete(id);
	}

	public void update(User user) {
		dao.saveAndFlush(user);
	}

	public List<User> findAll() {
		return dao.findAll();
	}
}

来写一单元测试。
public class UserServiceTest {
	
	private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	
	private static UserService userService = (UserService) context.getBean("userService");
	
	public void saveUser() {
		StopWatch sw = new StopWatch(getClass().getSimpleName());
		sw.start("Add a user information.");
		User u = new User();
		u.setName("John");
		u.setSex("Man");
		u.setUsername("JohnZhang");
		u.setPassword("123456");
		u.setBirth(new Date());
		userService.save(u);
		sw.stop();
		System.err.println(sw.prettyPrint());
	}

     public static void main(String[] args) {
		UserServiceTest test = new UserServiceTest();
		test.saveUser();
	}
}

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

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

写一篇博客真不容易,好歹也要花上几小时,文笔不行,如有不正之处,欢迎拍砖。如觉得还不错,请顶一票。谢谢!
21
8
分享到:
评论
6 楼 demaxiya122221 2016-09-21  
不错的文章 ,起码思路清晰
5 楼 Hibernate1 2016-08-03  
3 楼 cuippan 2014-11-23  
demo 能分享下看看吗,亲
2 楼 z276356445t 2012-07-17  
7454103 写道
很不错的一片文字,
在网上很少有几篇像样的文字 介绍 Spring data
我也用过这个!感觉还可以!
不过1.0 版本还有些小问题,还是比较看好它
期待下一篇 更精彩!

恩,其实欣赏它最主要的原因是它不只提供了RDBMS的快速访问,还提供了很多NoSql和大数据stores的快速操作,大大简化了开源人员的工作量,也形成了一套开发的规范。
1 楼 7454103 2012-07-17  
很不错的一片文字,
在网上很少有几篇像样的文字 介绍 Spring data
我也用过这个!感觉还可以!
不过1.0 版本还有些小问题,还是比较看好它
期待下一篇 更精彩!

相关推荐

    一步步深入理解Spring内部原理-带源码

    10. **Spring Data**:Spring Data是一个项目集合,旨在简化数据访问层的开发,支持多种数据库,如JPA、MongoDB等。它提供了统一的API,使得数据操作更加便捷。 通过学习以上知识点,并结合实际项目,你可以逐步...

    spring-boot-tutorial:Spring Boot教程带您一步步学习Spring Boot,其中包含大量示例。SpringBoot教程是一本关于Spring Boot学习的开源书。用大量实例带你一步一步走进Spring Boot的世界

    每个章节都可能涵盖了一个或多个具体的功能点,比如如何创建第一个 Spring Boot 应用,如何配置数据库,如何使用 Spring Data JPA 进行数据操作,以及如何实现 RESTful API 等。通过这个教程,你可以逐步深入理解 ...

    spring揭秘 完整带标签

    《Spring揭秘》这本书将通过实例和详细的解释,引导读者一步步掌握这些核心概念和技术,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过阅读本书,你可以深入理解Spring框架的工作原理,并能熟练地将其...

    JAVA学习之一步步搭建spring框架

    【标题】:深入理解Spring框架搭建过程 【摘要】:本文详细阐述了如何逐步搭建Java中的Spring框架,从...随着对Spring的理解不断深入,你还可以探索Spring Boot、Spring Data JPA等更高级的特性,进一步提升开发效率。

    spring快速入门教程

    本教程将带你一步步了解Spring的核心概念,包括IoC(控制反转)、AOP(面向切面编程)以及Spring Boot的快速启动特性。 一、Spring核心:依赖注入(DI/IoC) 依赖注入是Spring框架的核心机制,它允许对象之间的...

    spring源码从入门到放弃

    《Spring源码从入门到...从基础概念到高级用法,再到内部实现机制,一步步深入Spring的世界,虽然可能会遇到挑战,但收获的将是深度理解和实战技能的提升。对于想要提升自身技术水平的开发者来说,这是一条必经之路。

    Spring中文版基础教程,从0开始教你Spring

    本教程将带你一步步地探索Spring的世界。 1. **Spring框架概述** - Spring的核心理念是依赖注入(Dependency Injection,DI),它通过控制反转(Inversion of Control,IoC)来管理对象的生命周期和相互依赖关系。...

    基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离学习型.zip

    在当前的IT行业中,前后端分离的开发模式已经成为主流,特别是在Web应用开发...这个学习型项目将引导你通过实际操作,一步步掌握这些技术和最佳实践。通过实践,你将能够独立地开发出高效、易于维护的前后端分离应用。

    spring mvc step by step,例子

    这篇博文通过一步步的教程,将引导我们深入了解如何使用Spring MVC构建一个简单的Web应用。 首先,我们需要了解Spring MVC的基本组件和它们的作用: 1. **DispatcherServlet**:这是Spring MVC的前端控制器,负责...

    build-spring-framework

    《构建Spring框架:深入理解与实践》 Spring框架作为Java企业级应用开发的基石,以其模块化、松...动手实践是巩固理论知识的最佳途径,因此,强烈建议你按照教程一步步操作,亲自构建Spring,以加深理解和应用能力。

    Idea Spring boot 入门dome

    本教程将带你一步步走进Spring Boot的世界。 ### 1. 创建Spring Boot项目 在IntelliJ IDEA(Idea)中创建Spring Boot项目,首先选择"New Project",然后在项目模板中找到"Spring Initializr"。这里你可以选择所需...

    spring 小记

    这篇小记将深入探讨Spring的主要组件和关键特性,带你一步步走进Spring的世界。 首先,我们要理解Spring的核心——依赖注入。在传统的Java程序中,对象之间的依赖关系通常是硬编码的,这使得代码难以测试和维护。...

    Spring-boot 入门案例

    本案例将带你一步步走进 Spring Boot 的世界,体验其强大的功能和简洁的开发方式。 ### 1. Spring Boot基础知识 Spring Boot 基于 Spring Framework,但并非其一部分。它提供了快速构建、配置和部署应用程序的能力...

    SpringBoot入门级Demo带静态后台模版

    这个入门级Demo将带你一步步了解SpringBoot的项目结构、配置、数据访问以及前端展示,是学习SpringBoot和相关技术的良好起点。在实践中,你可以根据需求扩展功能,如添加更多控制器、完善用户认证等,逐步提升对...

    springboot(一)-(三)的代码资源

    总的来说,这个压缩包资源是一个学习Spring Boot基础和实践操作的好材料,通过一步步的实践,读者可以掌握Spring Boot的核心概念,理解自动配置的工作原理,熟悉开发流程,并且能够运用到实际的企业级项目开发中。

    Spring首选资料(从入门到深入)

    通过这份"Spring首选资料(从入门到深入)",你将一步步了解Spring的各个方面,从基本概念到高级特性,从简单的配置到复杂的架构设计,逐步成长为Spring框架的专家。无论是初学者还是经验丰富的开发者,都能从中受益...

    Java Spring 框架搭建步骤

    本指南将详细介绍如何一步步搭建一个基于Spring的项目环境。 1. **安装Java开发工具(JDK)** - 首先,确保你的计算机上已经安装了JDK,并且版本至少为1.8,因为Spring框架支持这个版本及以上。 - 下载并安装JDK,...

    spring-boot-example_springbootexample_springboot_DEMO_

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它的核心特性是可以内嵌...记得跟着文档一步步操作,理解每个部分的功能,将有助于深入掌握Spring Boot的精髓。

    Spring基础教程

    总的来说,Spring基础教程将带你了解如何配置和使用Spring框架,从Bean的声明和装配,到AOP和数据访问,再到Web应用的开发,一步步建立起对Spring全面的理解。通过学习,你将能够利用Spring的强大功能,提升开发效率...

    springboot项目

    本文将详细讲解如何创建一个基础的Spring Boot项目,带你一步步走进Spring Boot的世界。 首先,理解Spring Boot的核心概念至关重要。Spring Boot是由Pivotal团队提供的全新框架,其设计目标是简化新Spring应用的...

Global site tag (gtag.js) - Google Analytics