1、导入 JDBC 场景

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jdbc</artifactId>
  4. </dependency>

image.png

为什么导入JDBC场景,官方不导入数据库驱动?因为官方不知道我们接下要操作什么数据库。

以 MySQL 为例,选择与数据库版本对应的驱动版本。

到 Maven Repository 寻找 MySQL 驱动依赖:https://mvnrepository.com/artifact/mysql/mysql-connector-java

根据数据库的版本,选择对应的驱动版本。

方式1:在引入 mysql-connector-java 依赖时,指定驱动版本:
直接依赖引入具体版本(maven的就近依赖原则)

  1. <dependency>
  2. <groupId>mysql</groupId>
  3. <artifactId>mysql-connector-java</artifactId>
  4. <version>5.1.33</version>
  5. </dependency>

方式2:在 pom 文件里的 properties 标注上 MySQL 的版本,在 dependency 引入依赖时就不需要再加版本了。
重新声明版本(maven的属性的就近优先原则)

  1. <properties>
  2. <java.version>1.8</java.version>
  3. <mysql.version>5.1.33</mysql.version>
  4. </properties>

2、分析自动配置

autoconfigure.data.jdbc

org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration

autoconfigure.data.jdbc 下有两个类是关于 JDBC 的相关配置,用于寻找 JDBC 的接口类在哪儿,这是第一个的自动配置,现在暂时用不到。
image.png

org.springframework.boot.autoconfigure.jdbc

这里是关于我们整个数据库的配置。
image.png

自动配置的类

DataSourceAutoConfiguration

数据源的自动配置,相当于自动帮我们配好了底层要用到的数据库连接池。

  • 修改数据源相关的配置:spring.datasource
  • 数据库连接池的配置,是容器中没有 DataSource 才给你配置的
  • 底层配好的连接池是:HikariDataSource

    部分源码:

    1. @Configuration(proxyBeanMethods = false)
    2. @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
    3. @ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
    4. @EnableConfigurationProperties(DataSourceProperties.class)
    5. @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
    6. public class DataSourceAutoConfiguration {

    @ConditionalOnMissingBean(type = “io.r2dbc.spi.ConnectionFactory”)
    容器中没有这种类型的组件时,才启用这种配置。

而 miss 的这个玩意儿 “io.r2dbc.spi.ConnectionFactory”是基于响应式编程的数据库连接池的类。所以如果你不是用响应式的技术栈,而是用原生的这种编程,才给你配置原生的数据源。

@EnableConfigurationProperties(DataSourceProperties.class)
开启了配置文件绑定功能。跟数据源有关的配置,都在 DataSourceProperties 里边绑定了。

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

可以看到,是跟 spring.datasource 的配置项绑定的。


数据库连接池的配置,如果没有的话,会自动配置:

  1. @Configuration(proxyBeanMethods = false)
  2. @Conditional(PooledDataSourceCondition.class)
  3. @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
  4. @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
  5. DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
  6. DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
  7. protected static class PooledDataSourceConfiguration {
  8. }

DataSourceTransactionManagerAutoConfiguration

事务管理器的自动配置。

JdbcTemplateAutoConfiguration

Jdbc template 组件的自动配置。

因为我们现在没有整合任何的第三方框架,比如 MyBatis 用来操作数据库,所以 Spring 官方提供了一个轻量的操作数据库的小工具:Jdbc template ,可以用来对数据库进行 CURD 。

JndiDataSourceAutoConfiguration

jndi 的自动配置

XADataSourceAutoConfiguration

分布式事务的自动配置

3、修改配置项

application.yml

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://127.0.0.1:3306/db_jeecg
  4. data-username: db_jeecg
  5. data-password: Rebox1930!
  6. driver-class-name: com.mysql.jdbc.Driver
  7. # type: com.zaxxer.hikari.HikariDataSource
  8. jdbc:
  9. template:
  10. query-timeout: 3

4、测试

可以写一个 controller 来测试,为了简单一点,我在 Spring Boot 提供的一个测试类里( SpringbootAdminApplicationTests )直接写了。
image.png

SpringbootAdminApplicationTests

  1. @SpringBootTest
  2. @Slf4j
  3. class SpringbootAdminApplicationTests {
  4. @Autowired
  5. JdbcTemplate jdbcTemplate;
  6. @Test
  7. void contextLoads() {
  8. // jdbcTemplate.queryForObject("select * from t_s_depart");
  9. // jdbcTemplate.queryForList("selec * from t_s_depart");
  10. Long departCount = jdbcTemplate.queryForObject("select count(*) from t_s_depart", Long.class);
  11. log.info("部门总数:{}", departCount);
  12. ArrayList departs = (ArrayList) jdbcTemplate.queryForList("select * from t_s_depart");
  13. // List departs = jdbcTemplate.queryForList("select * from t_s_depart");
  14. log.info("部门信息:{}", departs);
  15. }
  16. }