六、整合JDBC

一、整合数据连接池

  • SpringBoot内部默认支持多种数据源:
  • 每个版本默认的数据源不同;
  • Springboot的2.2.2 Release版本默认是HikariDataSource;
<!--默认支持的数据源-->
org.apache.tomcat.jdbc.pool.DataSource; 
com.zaxxer.hikari.HikariDataSource;
org.apache.commons.dbcp2.BasicDataSource

1. 默认数据源配置

pom文件

       <!--数据库的驱动,版本在parent工程中管理-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-jdbc</artifactId>
       </dependency>

       <!--告诉SpringBoot:用什么数据库,版本在parent工程中传递-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>

application.yaml文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://60.205.229.31:3307/activemq

至此,数据库信息已经配置完成,已经可以正常结合mybatis使用数据源

测试类

  • 完成以上配置后,Springboot会读取配置文件中关于datasource的属性字段,赋值给DataSource对象,并将该dataSource注入到容器中;
@RestController
public class MyDataSourceController {

    @Autowired
    private DataSource dataSource;

    @GetMapping("/datasource/getinfo")
    public String getDataSource() throws SQLException {
        Connection connection = dataSource.getConnection();
        // 默认是HikariDataSource
        System.out.println(dataSource);
        return "SUCCESS";
    }
}

2. 切换到当前版本默认的其他数据源

application.yaml

# 只需要加上type属性就可以了
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://60.205.229.31:3307/activemq
    type: com.mysql.cj.jdbc.MysqlDataSource

3. 切换当前版本没有默认支持的数据源

步骤一:
  • 以DruidDataSource为例;
  • 先添加对应数据源的依赖;
  • 再修改对应的application.yaml中的type属性

pom.xml

 <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.9</version>
  </dependency>

application.yaml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://60.205.229.31:3307/activemq
    type: com.alibaba.druid.pool.DruidDataSource

当前配置,已经保证了DruidDataSource可以正常使用;

步骤二:
  • 但是datasource的复杂配置,并不能自动注入到Springboot默认的DataSource中;
  • 如果想使这些配置生效,需要手动注入DataSource,从而掩盖Springboot默认的DataSource;

application.yaml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://60.205.229.31:3307/activemq
    type: com.alibaba.druid.pool.DruidDataSource

    # 如果要使下面这种配置生效,则需要自己手动配置数据源的信息
    minIdle: 5
    maxIdle: 5
    maxActive: 20

手动注入datasouce

@Configuration
public class SzDruidConfig {

    /**1. 读取配置文件中的相关参数,对应到该Bean中;
     * 2. 现在容器中数据源是手动创建的,覆盖了系统默认配置的*/
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource getDataSource(){
        return new DruidDataSource();
    }
}

二、自动配置原理

  • 相关配置都在: org.springframework.boot.autoconfigure.jdbc的包下

1. DataSourceProperties类

/**1. 读取配置文件中中spring.datasouce中对应的字段;
   2. 将字段对应到该类中的属性中*/

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {

/** 1. 自动装配类的部分字段,type字段是在该类所继承的其他类中*/
	private Class<? extends DataSource> type;

	private String driverClassName;

	private String url;

	private String username;

	private String password;

	private String jndiName;

}

2. DataSourceConfiguration

  • 根据配置的具体属性,来创建数据源;
  • 默认了三种数据源,也可以自定义数据源;
/**
	 * Hikari DataSource configuration: 默认的众多数据源之一
	 */
	@Configuration(proxyBeanMethods = false)
	@ConditionalOnClass(HikariDataSource.class)
	@ConditionalOnMissingBean(DataSource.class)
	@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
			matchIfMissing = true)
	static class Hikari {

		@Bean
		@ConfigurationProperties(prefix = "spring.datasource.hikari")
		HikariDataSource dataSource(DataSourceProperties properties) {
			HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
			if (StringUtils.hasText(properties.getName())) {
				dataSource.setPoolName(properties.getName());
			}
			return dataSource;
		}

	}
	
/**
	 * Generic DataSource configuration:自定义的外在的数据源
	 */
	@Configuration(proxyBeanMethods = false)
	@ConditionalOnMissingBean(DataSource.class)
	@ConditionalOnProperty(name = "spring.datasource.type")
	static class Generic {

		@Bean
		DataSource dataSource(DataSourceProperties properties) {
			return properties.initializeDataSourceBuilder().build();
		}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值