- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
11.1 连接数据源的源代码分析
要使用数据库,首先必须与数据库服务器建立连接。对于关系型数据库,Spring Boot 连接数据源一般都采用 JDBC(Java Data Base Connectivity)的方式来实现。其他类型的数据库却使用各自独立的方式来建立连接。代码清单 11-1 是 JDBC 的一些连接参数的定义,使用关系型数据库时,Spring Boot 的自动配置将尝试从应用的配置文件中读取这些配置项。
代码清单 11-1 数据源配置参数定义源代码
package org.springframework.boot.autoconfigure.jdbc;…… @ConfigurationProperties( prefix = "spring.datasource" ) public class DataSourceProperties implements BeanClassLoaderAware, EnvironmentAware, InitializingBean { public static final String PREFIX = "spring.datasource"; private ClassLoader classLoader; private Environment environment; private String name = "testdb"; private Class<? extends DataSource> type; private String driverClassName; private String url; private String username; private String password; private String jndiName; private boolean initialize = true; private String platform = "all"; private String schema; private String data; private boolean continueOnError = false; private String separator = ";"; private Charset sqlScriptEncoding; private EmbeddedDatabaseConnection embeddedDatabaseConnection; private DataSourceProperties.Xa xa; …… }
11.1.1 数据源类型和驱动
JDBC 连接数据源必须指定数据源类型和数据库驱动程序,在程序中用 driver-ClassName 来指定数据库驱动程序的名称,例如使用 MySQL 的驱动程序是 com.mysql.jdbc.Driver,而数据源的类型默认使用 org.apache.tomcat.jdbc.pool.DataSource,如代码清单 11-2 所示。
代码清单 11-2 JDBC 的 DataSourceBuilder 源代码片段
package org.springframework.boot.autoconfigure.jdbc; …… public class DataSourceBuilder { private static final String[] DATA_SOURCE_TYPE_NAMES = new String[]{"org.apache. tomcat.jdbc.pool.DataSource", "com.zaxxer.hikari.HikariDataSource", "org.apache.commons.dbcp.BasicDataSource", "org.apache.commons.dbcp2.BasicDataSource"}; private Class<? extends DataSource> type; private ClassLoader classLoader; private Map<String, String> properties = new HashMap(); ...... public Class<? extends DataSource> findType() { if(this.type != null) { return this.type; } else { String[] var1 = DATA_SOURCE_TYPE_NAMES; int var2 = var1.length; int var3 = 0; while(var3 < var2) { String name = var1[var3]; try { return ClassUtils.forName(name, this.classLoader); } catch (Exception var6) { ++var3; } } return null; } } }
数据源的类型可以通过配置更改,这一功能给我们使用其他数据源提供了很大的便利。例如在第 4 章中使用 Druid 数据源时,就是使用如下的配置来指定数据源类型,即代码中的 type 设定为 com.alibaba.druid.pool.DruidDataSource。
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver ……
11.1.2 支持的数据库种类
Spring Boot 默认几乎可以支持现有的所有数据库,代码清单 11-3 是 DatabaseDriver 定义一个枚举类的源代码,从这个数据库驱动的定义列表中可以看出,它默认支持的数据库种类。但这并不是说,这个列表中没有列出的数据库就不支持了,只是可以采用其他方式来建立连接而已。例如,Redis、MongoDB、Neo4j 等数据库都使用了各自独特的方式来建立连接。
代码清单 11-3 枚举类 DatabaseDriver 源代码片段
package org.springframework.boot.autoconfigure.jdbc;…… enum DatabaseDriver { UNKNOWN((String)null), DERBY("org.apache.derby.jdbc.EmbeddedDriver"), H2("org.h2.Driver", "org.h2.jdbcx.JdbcDataSource"), HSQLDB("org.hsqldb.jdbc.JDBCDriver", "org.hsqldb.jdbc.pool.JDBCXADataSource"), SQLITE("org.sqlite.JDBC"), MYSQL("com.mysql.jdbc.Driver", "com.mysql.jdbc.jdbc2.optional.MysqlXAData Source"), MARIADB("org.mariadb.jdbc.Driver", "org.mariadb.jdbc.MySQLDataSource"), GOOGLE("com.google.appengine.api.rdbms.AppEngineDriver"), ORACLE("oracle.jdbc.OracleDriver", "oracle.jdbc.xa.client.OracleXADataSource"), POSTGRESQL("org.postgresql.Driver", "org.postgresql.xa.PGXADataSource"), JTDS("net.sourceforge.jtds.jdbc.Driver"), SQLSERVER("com.microsoft.sqlserver.jdbc.SQLServerDriver", "com.microsoft. sqlserver.jdbc.SQLServerXADataSource"), DB2("com.ibm.db2.jcc.DB2Driver", "com.ibm.db2.jcc.DB2XADataSource"), AS400("com.ibm.as400.access.AS400JDBCDriver", "com.ibm.as400.access.AS4 00JDBCXADataSource"); private final String driverClassName; private final String xaDataSourceClassName; ..... }
11.1.3 与数据库服务器建立连接
最终,不管使用哪一种数据库,与数据库服务器建立连接大体上都会用到三个参数,即数据库链接地址、用户名和密码。下面我们来看一看,Spring Boot 在使用一个新型的数据库 Neo4j 时是怎么建立连接的。Neo4j 是一个 NoSQL 数据库,它不能使用 JDBC 的方式来建立连接,所以由 spring-data-neo4j 提供连接数据库服务器的方法。使用 Neo4j 数据库,一般使用如代码清单 11-4 所示的方法来连接数据库服务器,即通过继承 Neo4jConfiguration,重载 neo4jServer 方法来实现。
代码清单 11-4 连接 Neo4j 的配置类定义
@Configuration ...... public class Neo4jConfig extends Neo4jConfiguration { @Override public Neo4jServer neo4jServer() { return new RemoteServer("http://192.168.1.221:7474","neo4j","12345678"); } ...... }
上面的代码最终将调用超类 Neo4jConfiguration 中的 constructSession 方法,使用提供的链接地址、用户名和密码,与数据库服务器建立连接,如代码清单 11-5 所示。
代码清单 11-5 Neo4j 连接服务器部分源代码
package org.springframework.data.neo4j.config;…… @Configuration public abstract class Neo4jConfiguration { private Session constructSession(Neo4jServer server) { return server.url() != null && server.username() != null && server. password() != null?this.getSessionFactory().openSession(server.url(), server. username(), server.password()):this.getSessionFactory().openSession(server.url()); } …… }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论