springboot2.2.4绑定JDBC&JDBC自动配置原理

  Spring Boot对于数据访问层,底层都是采用Spring Data的方式统一处理。

一、创建集成JDBC的Spring Boot项目

   File——>New——>Project,然后选中Spring Initializr,点击Next,来到如下页面,设置组别(Group)和项目名(Artifact)。
在这里插入图片描述
   点击Next后,来到如下页面,勾选WebMySQLJDBC
在这里插入图片描述
pom.xml文件中会引入JDBC的依赖:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
  </dependencies>

二、编写配置文件

在application.yml文件中配置连接JDBC的数据源信息:

spring:
   datasource:
       username: root
       password: root
       url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8
       driver-class-name: com.mysql.jdbc.Driver

留心脚下:

  在Spring Boot2.x.x版本中,如果在spriing.datasource.url中不指定时区就会报错
在这里插入图片描述
在url上添加serverTimezone=UTC即可:

url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC

配置好了之后就可以直接使用了。

三、Test类测试

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDataJdbcApplicationTests {
    @Autowired
    DataSource dataSource;
    @Test
    public void contextLoads() throws SQLException {
        Connection connection = dataSource.getConnection();
        //class com.zaxxer.hikari.HikariDataSource
        System.out.println(dataSource);
        System.out.println(connection+"====");
        connection.close();
    }
}

在这里插入图片描述
  从输出结果中可以看出,此时springboot默认的数据源是com.zaxxer.hikari.HikariDataSource。数据源的相关配置都在DataSourceProperties里。

【问】Spring Boot1.5.x默认使用的数据源是org.apache.tomcat.jdbc.pool.DataSource,而Spring Boot2.x.x默认使用的数据源是com.zaxxer.hikari.HikariDataSource。为什么要修改默认的数据源呢?

  因为HikariDataSource是当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更好。

四、JDBC自动配置原理

Spring boot的自动配置文件都在org.springframework.boot.autoconfigure.jdbc下:

【1】DataSourceProperties类:里面是可以配置的数据源信息

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
	/**
	 * Fully qualified name of the connection pool implementation to use. By default, it
	 * is auto-detected from the classpath.
	 */
	private Class<? extends DataSource> type;

	/**
	 * Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
	 */
	private String driverClassName;

	/**
	 * JDBC URL of the database.
	 */
	private String url;

	/**
	 * Login username of the database.
	 */
	private String username;

	/**
	 * Login password of the database.
	 */
	private String password;
	
	/**
	 * Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or
	 * data-${platform}.sql).
	 */
	private String platform = "all";

	/**
	 * Schema (DDL) script resource references.
	 */
	private List<String> schema;
	
	/**
	 * Password of the database to execute DDL scripts (if different).
	 */
	private String schemaPassword;
  }

【2】DataSourceAutoConfiguration类:数据源自动配置类

  在该类中,将数据源配置信息放入自动配置的容器中。
在这里插入图片描述
【3】DataSourceConfiguration类 :该类放了SpringBoot可以配置的数据源。默认使用HikariDataSource数据源。可以使用spring.datasource.type来指定自定义的数据源类型

Spring Boot支持的数据源:

org.apache.tomcat.jdbc.pool.DataSource
com.zaxxer.hikari.HikariDataSource
org.apache.commons.dbcp2.BasicDataSource
通过spring.datasource.type属性指定自定义数据源类型,比如druid、 c3p0等

【4】自定义数据源底层源码:通过spring.datasource.type属性指定自定义的数据源,值是要指定的数据源的全类名,从类路径自动检测

/**
  * Generic DataSource configuration
 **/
	@Configuration(proxyBeanMethods = false)
	@ConditionalOnMissingBean(DataSource.class)
	@ConditionalOnProperty(name = "spring.datasource.type")
	static class Generic {

		@Bean
		DataSource dataSource(DataSourceProperties properties) {
		
		//使用DataSourceBuilder创建数据源的过程:利用反射创建指定type的数据源,并绑定相关属性
			return properties.initializeDataSourceBuilder().build();
		}
	}

//========================================================
//利用反射创建指定类型的数据源,并绑定相关属性
 public T build() {
        Class<? extends DataSource> type = this.getType();
        DataSource result = (DataSource)BeanUtils.instantiateClass(type);
        this.maybeGetDriverClassName();
        this.bind(result);
        return result;
    }

五、JDBCTemplate自动配置原理

  经过上面的一番配置,有了数据源HikariDataSource,这时就可以拿到数据库连接java.sql.Connection,有了连接就相当于可以使用连接和原生的 JDBC 语句来操作数据库进行crud。org.springframework.jdbc.core.JdbcTemplate是Spring对JDBC轻量级的封装,应该也可以实现crud。

  既然是自动配置,那么JdbcTemplate的自动配置原理是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 。
在这里插入图片描述
不出意外,在该包下果然找到了JdbcTemplateAutoConfiguration
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值