Spring Boot总结(十一):数据访问实现原理

Spring Boot总结(一):入门

Spring Boot总结(二):Spring Boot中使用数据库

Spring Boot总结(三):Spring Boot界面设计

Spring Boot总结(四):提高数据库访问性能

Spring Boot总结(五):安全设计

Spring Boot总结(六):Spring Boot SSO

Spring Boot总结(七):使用分布式文件系统

Spring Boot总结(八):云应用开发

Spring Boot总结(九):构建高性能的服务平台

Spring Boot总结(十):自动配置实现原理

Spring Boot总结(十一):数据访问实现原理

Spring Boot总结(十二):微服务核心技术实现原理

11.1 连接数据源的源代码分析

要使用数据库,首先必须与数据库服务器建立连接,对于关系型数据库,Spring Boot连接数据源一般都采用JDBC的方式来实现。其他类型的数据库却使用各自独立的方式来建立连接。

1. 数据源类型和驱动

JDBC连接数据源对象必须指定编码集数据源类型的值和数据库驱动程序,在程序中使用driverClassName来指定数据库驱动程序的名称,例如mysql的驱动程序是com.mysql.jdbc.Driver

而数据源的类型默认使用org.apache.tomcat.jdbc.pool.DataSource

数据源的类型可以通过配置更改,可以采用阿里巴巴的:

com.alibaba.druid.pool.DruidDataSource

2. 支持的数据库种类

Spring Boot几乎可以支持现在所有的数据库,有些需要采用其独特的方式建立连接:例如Redis、MongoDB、Neo4j

3. 与数据库服务器建立连接

最终不管使用哪一种数据库,与数据库服务器建立连接大体上都会用到三个参数,即数据库链接地址、用户名和密码。

例如:使用Neo4j通过继承Neo4jConfiguration,重载neo4jServer方法来实现;

11.2 数据存取功能实现原理

与数据库建立连接之后,就可以对数据库执行一些存取操作,对数据库实现管理的功能。数据存取的操作大体都包含两个方面的内容,即实体建模和持久化。不管是关系型数据库还是NoSQL数据库,都遵循这个规范;

1. 实体建模源代码分析

实体建模的原理简单的说,即将Java的普通对象和关系映射为数据库表以及其相关的关系。

而这种映射在Spring Boot中,主要是通过注解的方式来实现的。几种数据库中主要的注解定义如下所示:

数据库

类型

主要注解

MySQL

关系型

@Entity

@Table

@Id

@GeneratedValue

@ManyToOne

@ManyToMany

@JoinTable

@JoinColumn

MongoDB

NoSQL

@Document

@Id

@Indexed

@Language

Neo4j

NoSQL

@NodeEntity

@GraphId

@Relationship

@Index

@Property

Neo4j是一个图形数据库,所以程序中的实体对象要存入数据库的时候,将被映射为数据库图形。它的实现原理是,将实体对象转换为数据库可以识别的查询语句,实现对象到数据的转换;

当从Neo4j数据库中读取数据的时候,Neo4j将数据库中的图形还原为实体对象。即将从数据库中查询的得到的数据集合转换为实体对象,实现从数据到对象的转换;

2. 持久化实现原理

关系型数据库都使用了JPA的一套执行标准,它结合使用Hibernate实现了实体的持久化,后续的数据库管理设计都遵循了JPA这一个标准规范,提供相同的访问数据库的API;

下图是JPA、MongoDB、Neo4j三种不同的资源库接口定义相同的继承关系;

图:数据库资源库接口的继承关系

这就是为什么在Spring Boot中使用数据库,对于不同种类的数据库,几乎都可以使用相同的方式来访问,上面不同数据库的资源库接口定义虽然有相同的继承关系,但是他们的实现方法是不同的;

11.3 扩展数据存取的功能

Spring Boot始终以使用简单为基准,提供了一套以JPA的标准规范来设计的数据存取方法,虽然功能相当强大,但是往往不能适合一些复杂的功能需求,这就需要对数据存取的功能做一些扩展。

1. 扩展JPA功能

2. 扩展Neo4j功能

为了实现分页查询,可以 编写一个全局的扩展类来实现,调用Neo4j的底层实现方法org.neo4j.ogm.session.Session来执行分页查询;

11.4 小结

在Spring Boot中访问数据库简单的原因就是,从对一些核心的代码分析中可知,它始终遵循一套在业界中广为流行的JPA标准规范来进行设计,无论是哪种数据库,它都能使用相同并且简单的方法来访问。只是,这对于一些复杂的功能需求来讲,未免有些欠缺。所以,在认识它的实现原理之后,需要借助一些底层调用来加强和扩展访问数据库的功能;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值