**
前言
**
数据访问领域在过去的7年间发生了重要的变化。过去30年间一直占据企业级数据存储和处理核心位置的关系型数据库已经不能再独领风骚了。在过去的7年间诞生了很多可选的数据存储形式,当然也有的面临着消亡,它们被使用到了带有关键任务的企业级应用程序之中。这些新的数据存储形式是为了解决特定的数据访问问题而设计的,使用关系型数据库通常无法高效地解决这些问题。
将关系型数据库推到拐点的一个问题就是扩展性(scale)。试问,我们如何将几百甚至几千TB(terabyte)的数据存储到关系型数据库中?这个问题让我想到了一个笑话,病人说:“大夫,我一这样动就疼”而医生则说:“那就别这样动呗!”暂且把笑话放在一边,存储如此巨量数据的推动力是什么呢?在2001年,IDC报告说“人们创造和复制的数据将会超过1.8ZB(zettabytes),而且每隔两年就会翻番[1]”。新的数据涵盖各种类型,如媒体文件、日志文件、传感器数据(RFID、GPD、遥测设备……)、Twitter上的消息以及Facebook上的帖子。尽管对于企业来讲存储于关系型数据库中的数据依然非常重要,但是这些新型的数据并没有存储在关系型数据库之中。
很多的公司和科研实验室在大数据这个词流行起来之前就开始这样做了。当前的过程与以往的不同在于,智能的数据分析所带来的价值要高于硬件的成本。现在执行这种类型的分析不再需要购买4万美元一颗的CPU了;商用的硬件集群中每颗CPU的价格是1000美元。对于大型的数据集,存储区域网络(Storage Area Network,SAN)以及网络附属存储(Network Attached Storage,NAS)的价格较为昂贵:每GB(gigabyte)是1~10美元,如果复本构建到数据库中而不是硬件之中,那本地磁盘的成本每GB只有0.05美元。对于商用的硬件集群,使用本地磁盘的数据传输率也要比基于SAN或NAS的系统更高──对于相同价格的系统,前者能快500倍。在软件方面,新的数据访问技术大多数都是开源的。尽管开源并不意味着零成本,但是这显然会降低使用门槛,相对于传统的商业软件,它们能够降低采购的整体成本。
要摆脱ACID特性的主要驱动力在于,很多的应用程序提高了可扩展写(scaling write)的优先级,并且希望即便系统的某一部分失效,其他部分依然可以继续运作。尽管在关系型数据库中,可以通过在数据库之前使用内存缓存来实现可扩展读,但是进行可扩展写要困难得多。为了标识这类应用程序,通常将其命名为“BASE”系统,在这里缩写代表着基本可用(basically available)、可扩展性(scalable)、最终一致性(eventually consistent)。具有键/值数据模型的分布式数据网格并没有归类到这种新的NoSQL数据库之中。然而,它们提供了与NoSQL数据库类似的特性,如数据的可扩展性以及组合计算能力和数据的分布式计算功能。
从上面简短的介绍中,你能够了解到数据访问的现状,目前正在发生的是一场革命,关注数据的人会非常兴奋。关系型数据库并没有消亡,在很多企业的运作中它依然是核心,并且会持续很长的时间。但是,趋势很明显:新的数据访问技术解决了关系型数据库所无法解决的问题,因此作为开发人员,我们必须要扩充自己的技能,要能够处理这两种技术。
Spring框架长期以来都致力于简化Java应用程序的开发,尤其是使用Java数据库连接(Java Database Connectivity,JDBC)或对象关系映射器编写基于RDBMS的数据访问层方面。在本书中,我们力图帮助开发人员使用这些新技术高效地编写Java应用程序。Spring Data项目直接处理这些新的技术,因此你能够将已有的Spring知识延伸到它们之中,或者通过使用Spring Data,也能够更深入地学习Spring。不过,我们也没有抛弃关系型数据库。Spring Data为了Spring能支持RDBMS扩展了新功能。
本书希望为你提供实用的Spring Data项目的介绍,该项目的目的在于帮助Java开发人员使用最新的数据处理和管理工具,同时能够以最新的方式使用传统的数据库。我们首先会为你介绍这个项目,阐述SpringSource以及该团队背后的驱动力,并描述了示例工程的领域模型,这个例子将会在后面的章节中使用,此外还介绍了如何获取和搭建示例代码(第1章)。
接着将会讨论Spring Data Repository的基本理念,因为它们是后续各种数据存储中都会涉及的通用主题(第2章)。对于Querydsl也是如此,我们将会在第3章中讨论这个话题。这两章为探讨特定存储与Repository的集成以及高级查询功能奠定了坚实的基础。
为了从Java开发人员熟悉的领域开始,我们会用一些时间来介绍传统的持久化技术,如JPA(第4章)和JDBC(第5章)。这两章阐述了在Spring已有的对JPA和JDBC的支持之上,Spring Data的模块提供了什么新特性。
在完成这些之后,将会引入Spring Data项目所支持的NoSQL存储:以MongoDB为例介绍文档数据库(第6章),以Neo4j为例讲解图数据库(第7章),以Redis为例讲解键/值存储(第8章)。列族数据库HBase将会在稍后的章节中介绍(第12章)。这些章节中涵盖的内容包括了将领域类映射到特定存储的数据结构、通过所提供的应用程序编程接口(Application Programming Interface,API)与存储进行便捷地交互以及对Repository抽象的使用。
目录
**[第一部分 背景知识
第1章 Spring Data项目1.1 为Spring开发人员提供的NoSQL数据访问功能](https://yq.aliyun.com/articles/91697)**1.2 主题概述1.3 领域1.4 示例代码1.4.1 将源码导入到IDE**[第2章 Repository:便利的数据访问层2.1 快速入门](https://yq.aliyun.com/articles/91744)**2.2 定义查询方法2.2.1 查找查询的策略2.2.2 衍生查询2.2.3 分页和排序2.3 定义Repository2.3.1 调整Repository接口2.3.2 手动实现Repository方法2.4 IDE集成
2.4.1 Intelli IDEA