Springboot 2.x 整合 JDBC 以及替换 Druid 数据源

前言

Springboot对于数据访问层,不管是 SQL 还是 NOSQL,Spring Boot 底层都是采用 Spring Data 的方式统一处理. Spring Data 是 Spring 家族中与 Spring Boot、Spring Cloud 齐名且知名项目.想要更好的了解 Sping Data,可以参考 Sping Data 官网:https://spring.io/projects/spring-data

事实上,Springboot整合 jdbc 基本上企业都不会这么去使用,但是 jdbc 是连接数据库最基本的基础,只有掌握基础才能更好的理解 Springboot 与其它 DAO 层框架整合的意义.

一、创建 JDBC

选择 Spring Web、JDBC API、MySQL Driver(有 mysql 的驱动),注意我这里 Springboot 的版本是 2.2.11

等待 IDEA 为我们下载依赖,下载完成之后 pom .xml 如下:

<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>

如上搭建好项目之后,应该怎么写才可以实现数据库的访问呢?实际上 Springboot 已经帮我们自动配置好了,我们只需要简单的编写几个配置就可以实现数据库的连接了.

二、编写配置文件

在 application.properties 中编写如下基本的配置

// 用户名
spring.datasource.username=root
// 密码
spring.datasource.password=123456
// 我这里连接的是 Linux 上的 mysql
spring.datasource.url=jdbc:mysql://192.168.229.131:3308/jdbcDemo
// mysql 驱动 (mysql 8.x 版本的使用 com.mysql.cj.jdbc.Driver 
// 5.x 版本的使用的是 com.mysql.jdbc.Driver
// 使用 spring.datasource.driver-class-name 也是一样的,点击这个属性,会跳到同一个位置
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

三、测试类

@SpringBootTest
class SpringbootdatasourceApplicationTests {
    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() throws SQLException {
        System.out.println("springboot默认使用的数据源是: " + dataSource.getClass());
        Connection connection = dataSource.getConnection();
        System.out.println("获取的连接是: " + connection);
        // 关闭连接
        connection.close();
    }
}

四、测试结果

输出结果可以看到默认给我们配置的数据源为 class com.zaxxer.hikari.HikariDataSource,可是我们并没有手动配置,那么这个数据源是从哪里来的呢?我们可以去探究一下原理

五、Springboot Datasource 自动配置原理

来到了 DataSourceProperties 这个类中,这个类是将 application.properties 配置文件中 spring.datasource 开头的属性与该类绑定起来,这个类可以对 username、password、驱动等等进行自动配置

那么数据源是怎么来的呢?

Springboot 对 Datasource 的自动配置都在 DatasourceAutoConfiguration 这个类中

从图中可以得知启动了 DataSourceProperties ,关于数据源的来源可以点开 DataSourceConfiguration 这个类

里面就有我们默认的数据源,当然还有其它的数据源,只是因为没有符合判断条件而没有注入到 Spring 容器中,也就不能自动配置了.

Springboot 2.x 默认使用 com.zaxxer.hikari.HikariDataSource 数据源,而以前版本,比如 Spring Boot 1.5.9 默认使用 org.apache.tomcat.jdbc.pool.DataSource 作为数据源,至于原因也很简单,听闻 HikariDataSource 是当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池优势更加明显,因此 springboot 把它作为默认的数据源了

这里有一个需要注意的是,如果我们不使用 springboot 默认的数据源,而想使用第三方的数据源,比如 Druid 数据源,可以通过修改 spring.source.type 来实现,因为只要是往 Spring 容器中注入了 DataSource,那么 Springboot 默认配置的 HikariDataSource 就会失效.

六、切换 Druid 数据库连接池

1、pom.xml 中引入 Druid 依赖

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

2、application.properties 配置

spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://192.168.229.131:3308/jdbcDemo
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

# 配置当前要使用的数据源的操作类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 进行数据库链接池的配置,数据库最小维持连接数
spring.datasource.dbcp2.min-idle=1
# 数据库初始化提供的连接数
spring.datasource.dbcp2.initial-size=1
# 数据库最大维持连接数
spring.datasource.dbcp2.max-total=1
# 等待连接获取的最大超时时间

3、编写 Durid 数据源的配置类 

@Configuration
public class DruidConfig {
    @Bean
    // 与 spring 的配置文件 application.properties 中前缀为 spring.datasource 的标签进行属性绑定
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

    // 配置 Druid 的监控
    // 1、配置一个管理后台的 Servlet
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean(
                new StatViewServlet(), "/druid/*");
        Map<String, String> initParams = new HashMap<>();
        initParams.put("loginUsername", "admin");
        initParams.put("loginPassword", "123456");
        initParams.put("allow", "");
        //默认就是允许所有访问
        initParams.put("deny", "192.168.15.21");
        bean.setInitParameters(initParams);
        return bean;
    }

    //2、配置一个 web 监控的 filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String, String> initParams = new HashMap<>();
        initParams.put("exclusions", "*.js,*.css,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

4、访问 Druid 监控后台

访问 http://localhost:8080/druid/ ,就可以进入到 Druid 监控后台管理页面了

原文地址:https://www.cnblogs.com/xiaomaomao/p/14063212.html