目录
SpringData 开篇介绍
Spring 全家桶当中另外一个成员 Spring Data 那它在 spring 全家桶当中也是非常重要的一个存在。我们可以看一下这一份 spring 全家桶的最新的市场份额统计报告, Spring Data 它稳居第一,甚至超过了我们熟悉的 Spring MVC 足以见得它的一个重要性。
这一份报告是针对全球范围的一个统计报告,当然跟我们国内这个环境相比,还是有那么一点点差距,但是 Spring Data 它排在第一也是非常合理的。
你想一下,我们创建一个应用不可能都是 Spring MVC 的 web 应用,对不对?有可能我创建的是一个 SpringWebflux 的这种响应式的 web 应用。有可能我都不是 web 应用,我创建的是一个 JAVA SE 的 桌面应用。好了我不管你是什么应用,你基本上都要进行存储对不对?那需要存储我们的 SpringData 它就派上用场了。所以说你基本上你每一个应用都要用到的东西,我的市场份额占有肯定更高一点。
第二名是Spring Security 它是用来实现授权和认证的。你像我们的登录、权限都是有由他管理。那 Spring 为什么没有在里面呢?你想一下,我们这些框架都是需要构建在 Spring 框架上面的,那如果 Spring 在里面,它的份额肯定是 100% 的。那 SpringBoot 为什么没有在里面呢?大家想一下,SpringBoot它是一个复合型的框架,它是帮助我们快速地去构建基于这些框架的一个脚手架,所以说他也没有办法统计在里面。
讲了这么多是为了什么? 说明Spring Data 它是非常重要的,也是非常值得我们去学习的。
Spring Data 它主要是用于做数据存储的,用在数据持久层。那一说到数据持久层,同一时间想到的框架肯定是 Mybatis 对不对?Mybatis 它主要是用来操作这种关系型的数据库,你像 MySQL,Oracle 都是属于关系型数据库。那我们的 Spring Data 它除了能够操作的这种关系型数据库以外,它还能操作这种非关系型的 nosql 的这种数据存储。你像我们的 Redis 缓存、mongodb、elaticsearch 这种搜索引擎的存储,还有这种 neo4j 可视化的存储。当然还有市面上的非常多的存储, Spring Data 它都是支持的,足以见得 Spring Data 它在数据持久层这一块的专业性,所以说这也就是为什么我们 Java 程序员喜欢用它的一个原因。因为它统一了数据持久层,降低了我们的学习成本,使我们的开发效率得以提升。所以说 Spring Data 它既然这么强大,我们还有什么理由不去学它呢?
那我们学任何一个技术,你首先就要搞清楚我们为什么要学它,学了它有什么用?
什么要用Spring Data(面试题)
首先Spring Data它主要是用来实现数据存储的。那我实现数据存储,我用 JDBC 用 Mybatis 它不香吗?我为什么要去用一个我不熟悉的一个技术呢?随着我们互联网的技术的发展,我们互联网的用户逐渐增长。那么现在的这种单一的存储方式已经无法满足我们现有的场景了。比如说我们要开发一个电商项目,我们要实现一个秒杀功能或者说抢购功能。大家都知道这种功能,它的并发量是非常大的。对不对?那这么大的并发量直接打到关系型数据库MySQL,你觉得这种类型的数据库它能扛下来吗?肯定是扛不下来的。
当然有人可能会说添加服务器不就完了吗,但是你要知道有些数据存储,它针对你不同的这个场景,要比你的这种关系型数据库性能要好,那你增加机器无疑就是浪费你的服务器的资源对不对?所以说在我们现有的这种庞大的用户群体的互联网环境当中,我们以前的这种单一的关系型数据库已经无法满足如我们的需求了,我们必须针对不同的场景使用不同的数据存储,比如说我们刚刚说的这功能秒杀。那我们可以利用这个 Redis 来将一些频繁需要访问的数据,我们称之为热点数据,把它缓存在 Redis 当中。那么这样用户去获取这些数据,它的速度肯定会得以提升,它的响应速度也得到了提升。那么我们的数据库也得到了保护。服务器它的吞吐量也能够增加。所以说既然不管是用户还是我们的服务器,这是一个双赢的局面。所以说在我们现在这种场景,必须使用不同的这个存储方案来实现不同的场景。比如说 mongoDB 我可以去实现一些大数据量的一些数据访问的性能提升。那比如说 elaticsearch 我可以实现一些数据量比较大并且比较复杂的搜索功能。那比如说我需要去实现一些比较复杂的关系数据,并且希望能够查出来,非常美观的直接直观的看到,那么neo4j 就是我们的首选。
所以说那这样的一种场景下面我们现在要去学这么多的存储技术。那对于我们开发人员来说,我们的学习成本无疑增加了。比如说我们的这个 elatic search、mongoDB、MySQL 等等,它都有自己的一个脚本语言。MySQL 它有 SQL,那 Redis 它也有自己的一个脚本语言,你像 get 、set等等这些你都得去学,还有我们程序员要去集成这些存储技术,你要去学他们之间的中间的适配的库,你要学他的这个这些 API,所以说对于我们开发人员来说,学习成本是太大了。那对于企业来说,开发成本无疑也增加了。
解决方法就是SpringData。比如说我们现在要实现 Spring Data 下的这个 elatic search 我们只需要引入 Spring Data 对应的这个依赖。然后你要实现 MongoDB 你也只需要引入 Spring Data 下的 MongoDB 对应的依赖,那么它就能够帮我们去节省你去操作数据库下面的大量的这些模板代码,它提供了这些模板对象,供我们非常方便,非常简单的就能实现不同数据存储的这种数据操作。
那比如说你要实现我们的数据库,你可以使用 Spring Data JPA 你只需要去实现接口,它提供了大量的内置接口帮助你提供了非常多的一些个性化的存储的方式。那你需要定制也非常简单,你只要按照它规定的这个方法名去命名,就可以来实现自己的一个数据库操作。所以说 Spring Data 它帮助我们统一了数据访问层,帮我们降低了学习成本,提升了我们的开发效率。
所以说我们再回到之前的这个面试题,为什么要用 Spring Data 呢?
因为 spring data 它帮助我们将不同的这个数据存储进行了统一 提升了我们的开发效率,降低了我们的学习成本。当然你也可以给面试官举例说它针对不同的存储方式,提供了不同的这些模板对象来进行数据存储的相关操作。那么 Spring Data 它的作用就是这样的。
Spring Data特性和模块介绍
Spring Data介绍
官方:
Spring Data’s mission is to provide a familiar and consistent, Spring-based programming model for data access while still retaining the special traits of the underlying data store.
It makes it easy to use data access technologies, relational and non-relational databases, map-reduce frameworks, and cloud-based data services. This is an umbrella project which contains many subprojects that are specific to a given database. The projects are developed by working together with many of the companies and developers that are behind these exciting technologies.
翻译:
Spring Data的任务是为数据访问提供一个熟悉的、一致的、基于Spring的编程模型,同时仍然保留底层数据存储的特殊特征。
它可以方便地使用数据访问技术、关系和非关系数据库、地图减少框架以及基于云的数据服务。这是一个伞形项目,包含许多特定于给定数据库的子项目。这些项目是通过与这些令人兴奋的技术背后的许多公司和开发人员合作开发的。
人话:
Spring Data致力为数据访问 (DAO) 提供熟悉且一致的基于Spring的编程模板:
对于每种持久性存储,您的 DAO 通常需要为不同存储库提供对不同 CRUD (创建-读取-更新-删除) 持久化操作。Spring Data 为这些持久性存储以及特定实现提供了通用接口 (CrudRepository、 PagingAndSortingRepository) 和 模板(jdbcTemplate,redisTemplate,RestTemplate,MongoTemplate…)。
其目的是统一和简化对不同类型持久性存储(关系数据库系统和 NoSQL 数据存储) 的访问。
因为Spring Data是一个伞形项目,所以说我们学 Spring Data 其实就是去学它不同模块。这些模块都是针对不同数据存储的一个实现。
Spring Data 主要模块
Spring Data支持的持久层技术非常多,只介绍几个常见的:
- Spring Data common - 用于支持每个Spring Data模块的核心公共模块。
- Spring Data JDBC - 对 JDBC 的 Spring Data 存储库支持。
- Spring Data JPA - 对 JPA 的 Spring Data 存储库支持。
- Spring Data MongoDB - 基于 Spring 的对彖文档支持和 MongoDB 存俈库。
- Spring Data Redis - 从 Spring 应用程序轻忪饲真和访问 Redis。
- Spring Data REST - 将 Spring Data 存㑬库导出为超娼体驱动的 RESTful 资源。
- 更多可以查看官网…
各模块使用率
Spring Data JPA 可以轻松实现JPA的存储库在子项目列表上名列前茅,是79%的开发者首选。Spring Data JDBC(Java 数据库连接),它定义了用于连接和查询几乎所有关系数据库的API,以 74% 排名第二,非关系型据库的几个模块也很受欢迎,包括 MongoDB (46%)、Redis (37%) 和 Elasticsearch (31%)。
Spring Data 主要特性
- 模板制作
- mongoTemplate、redisTemplate、jdbcTemplate…
模板提供存储特定操作,例如保存、更新和删除单个记录或用于执行查询或映射/减少作业。
Spring Data JPA不提供模板, 因为 JPA 实现本身已经是 JDBC API 之上的抽象层。JPA 的 EntityManager 是模板的对应物。异常转换由存储库实现处理。
- mongoTemplate、redisTemplate、jdbcTemplate…
- 对象/数据存储映射
可以通过xml或注解进行对象关系映射
我们可以看到其实都是通用的,理解起来都一样,像通过 MongoDB 它里面的是文档的一个概念,这种关系数据库它就是表的一个概念。所以说不同的这个数据存储它又有自己的一个特性在里面。 -
Repository(持久化) 支持
Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类- CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
- PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
- JpaRepository:继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
- … \quad \ldots …
自定义的 Repository 只需继承 XXXXRepository,这样自定义的Repository 接口就具备了通用的数据访问控制层的能力。