数据源的自动配置
导入JDBC场景
sdsds引入 spring-boot-starter-data-jdbc 场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
sdsd[注1]:JDBC场景并没有导入数据库驱动,这是因为不确定我们要用哪种数据库,因此需要我们自己导入版本,接下来以mysql为例。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
sdsd[注2]:SpringBoot默认数据库驱动是 8.0.22,注意要和自己的数据库驱动对应,其实也不是说版本一定一致,比如我们的mysql版本是5.5.15,而我们通过maven.repository用5开头的数据库驱动即可,而最新版的数据库驱动连接方式不一样,会出现错误。
错误代码:type: com.zaxxer.hikari.HikariDataSourceLoading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver’. The driver is automatically registered Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver’. The driver is automatically registered
sdsdsddsdsdsdsdsd
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version> </dependency>
自动配置原理
sdsds自动配置相关:spring-boot autoconfigure:2.4.0
==> spring-boot-autoconfigure-2.4.0.jar
==>org.springframework.boot.autoconfigure
==> jdbc
sddsdssdsdddsdsddssdsd
sdsdsDataSourceAutoConfiguration 数据源(连接池)自动配置:
sdsddsss①、@EnableConfigurationProperties(DataSourceProperties.class) ==> 修改数据源相关的配置:spring.datasource
ssddsd
sdsddsss②、数据库连接池的配置, 只有当容器中没有DataSource才自动配置的,如果有就用我们自定义的。
sdssdsd
sdsddsss③、数据库一引进jdbc场景就会自动引入 HikariDataSource(我们通过文章开始的图显示导入的jar包就可以发现这一点)(当然通过DataSourceAutoConfiguration 也可以看出这一点)
sdsddss
sdsdsDataSourceTransactionManagerAutoConfiguration 事务管理器的自动配置
sdsdsJdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行crud
sdsddsss①、修改JdbcTemplate相关的配置:spring.jdbc
sdsdssddsss
@ConfigurationProperties(prefix = "spring.jdbc")
public class JdbcProperties { private final JdbcProperties.Template template = new JdbcProperties.Template(); ...}
sdsddsss②、容器中有JdbcTemplate
sdssdsdd
sdssdsdd
sdsdsJndiDataSourceAutoConfiguration: jndi的自动配置
sdsdsXADataSourceAutoConfiguration: 分布式事务相关的
修改配置项\测试代码
spring:
datasource:
url: jdbc:mysql://localhost:3306/girls
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
jdbc:
template:
query-timeout: 3
@Test
void contextLoads() {
// Object object = jdbcTemplate.queryForObject("seclect * from admin");
jdbcTemplate.queryForList("select * from admin");
Long aLong = jdbcTemplate.queryForObject("select Count(*) from admin", Long.class);
log.info("记录总数:{}",aLong);
}
sdsds结果: