1、导入 JDBC 场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
为什么导入JDBC场景,官方不导入数据库驱动?因为官方不知道我们接下要操作什么数据库。
以 MySQL 为例,选择与数据库版本对应的驱动版本。
到 Maven Repository 寻找 MySQL 驱动依赖:https://mvnrepository.com/artifact/mysql/mysql-connector-java
根据数据库的版本,选择对应的驱动版本。
方式1:在引入 mysql-connector-java 依赖时,指定驱动版本:
直接依赖引入具体版本(maven的就近依赖原则)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.33</version>
</dependency>
方式2:在 pom 文件里的 properties 标注上 MySQL 的版本,在 dependency 引入依赖时就不需要再加版本了。
重新声明版本(maven的属性的就近优先原则)
<properties>
<java.version>1.8</java.version>
<mysql.version>5.1.33</mysql.version>
</properties>
2、分析自动配置
autoconfigure.data.jdbc
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration
autoconfigure.data.jdbc 下有两个类是关于 JDBC 的相关配置,用于寻找 JDBC 的接口类在哪儿,这是第一个的自动配置,现在暂时用不到。
org.springframework.boot.autoconfigure.jdbc
这里是关于我们整个数据库的配置。
自动配置的类
DataSourceAutoConfiguration
数据源的自动配置,相当于自动帮我们配好了底层要用到的数据库连接池。
- 修改数据源相关的配置:spring.datasource
- 数据库连接池的配置,是容器中没有 DataSource 才给你配置的
底层配好的连接池是:HikariDataSource
部分源码:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
@ConditionalOnMissingBean(type = “io.r2dbc.spi.ConnectionFactory”)
容器中没有这种类型的组件时,才启用这种配置。
而 miss 的这个玩意儿 “io.r2dbc.spi.ConnectionFactory”是基于响应式编程的数据库连接池的类。所以如果你不是用响应式的技术栈,而是用原生的这种编程,才给你配置原生的数据源。
@EnableConfigurationProperties(DataSourceProperties.class)
开启了配置文件绑定功能。跟数据源有关的配置,都在 DataSourceProperties 里边绑定了。
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
可以看到,是跟 spring.datasource 的配置项绑定的。
数据库连接池的配置,如果没有的话,会自动配置:
@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
protected static class PooledDataSourceConfiguration {
}
DataSourceTransactionManagerAutoConfiguration
事务管理器的自动配置。
JdbcTemplateAutoConfiguration
Jdbc template 组件的自动配置。
因为我们现在没有整合任何的第三方框架,比如 MyBatis 用来操作数据库,所以 Spring 官方提供了一个轻量的操作数据库的小工具:Jdbc template ,可以用来对数据库进行 CURD 。
JndiDataSourceAutoConfiguration
jndi 的自动配置
XADataSourceAutoConfiguration
分布式事务的自动配置
3、修改配置项
application.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/db_jeecg
data-username: db_jeecg
data-password: Rebox1930!
driver-class-name: com.mysql.jdbc.Driver
# type: com.zaxxer.hikari.HikariDataSource
jdbc:
template:
query-timeout: 3
4、测试
可以写一个 controller 来测试,为了简单一点,我在 Spring Boot 提供的一个测试类里( SpringbootAdminApplicationTests )直接写了。
SpringbootAdminApplicationTests
@SpringBootTest
@Slf4j
class SpringbootAdminApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
// jdbcTemplate.queryForObject("select * from t_s_depart");
// jdbcTemplate.queryForList("selec * from t_s_depart");
Long departCount = jdbcTemplate.queryForObject("select count(*) from t_s_depart", Long.class);
log.info("部门总数:{}", departCount);
ArrayList departs = (ArrayList) jdbcTemplate.queryForList("select * from t_s_depart");
// List departs = jdbcTemplate.queryForList("select * from t_s_depart");
log.info("部门信息:{}", departs);
}
}