Spring Boot总结(二):Spring Boot中使用数据库
Spring Boot总结(三):Spring Boot界面设计
Spring Boot总结(六):Spring Boot SSO
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标准规范来进行设计,无论是哪种数据库,它都能使用相同并且简单的方法来访问。只是,这对于一些复杂的功能需求来讲,未免有些欠缺。所以,在认识它的实现原理之后,需要借助一些底层调用来加强和扩展访问数据库的功能;