1.jdbc的开发场景
导入数据库jdbc的开发场景:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
点进去spring-boot-starter-data-jdbc
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.4.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jdbc</artifactId>
<version>2.1.8</version>
<scope>compile</scope>
</dependency>
spring-data-jdbc是执行jdbc操作的,点进去spring-boot-starter-jdbc包含:
因为不知道你具体使用哪个数据库所以没有自动导入数据库的驱动,接下来导入mysql的数据库驱动:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
默认版本:
<version>8.0.23</version>
数据库的驱动版本必须跟自己安装的数据库版本一致,可以修改数据库的版本:
1.直接依赖引入具体的版本(maven的就近依赖原则):
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
</dependency>
可以去maven的网站里边搜索MySQL的数据库驱动:mysql的数据库驱动
2.重新声明版本(maven的属性的就近优先原则):
在pom的properties配置文件里配置
<properties>
<java.version>1.8</java.version>
<mysql.version>8.0.23</mysql.version>
</properties>
2.分析自动配置
1.自动配置的类:
org.springframework.boot.autoconfigure.jdbc包下:
DataSourceAutoConfiguration:数据源的自动配置类
点开DataSourceAutoConfiguration:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
@ConditionalOnMissingBean(type = “io.r2dbc.spi.ConnectionFactory”)表示容器中没有响应式编程的时候进行下面的配置,用原生的数据源的时候才会进行下面的配置类DataSourceAutoConfiguration,@EnableConfigurationProperties(DataSourceProperties.class)开启数据源绑定的功能,所有的配置文件都在DataSourceProperties里面,点开DataSourceProperties:
@ConfigurationProperties(prefix = "spring.datasource")
可以看到都是以前缀为spring.datasource的配置绑定的,所以修改数据源相关的配置修改spring.datasource开头的配置即可。
数据库连接池的配置,是自己容器中没有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 {
}
底层配置好的连接池是HikariDataSource。
DataSourceTransactionManagerAutoConfiguration:事务管理的自动配置类
JdbcTemplateAutoConfiguration:jdbc的自动配置类,可以来对数据库进行crud
点开JdbcTemplateAutoConfiguration:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(JdbcProperties.class)
@Import({ JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class })
public class JdbcTemplateAutoConfiguration {
}
点进JdbcProperties可以通过修改以spring.jdbc开头进行配置jdbcTemplate:
@ConfigurationProperties(prefix = "spring.jdbc")
点进去JdbcTemplateConfiguration可以看到对jdbcTemplate的配置:
@Bean
@Primary
JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
JdbcProperties.Template template = properties.getTemplate();
jdbcTemplate.setFetchSize(template.getFetchSize());
jdbcTemplate.setMaxRows(template.getMaxRows());
if (template.getQueryTimeout() != null) {
jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());
}
return jdbcTemplate;
}
通过注解可以看到容器中有这个组件可以直接使用jdbcTemplate操作数据库。
JndiDataSourceAutoConfiguration:jndi的自动配置
XADataSourceAutoConfiguration:分布式事务相关的
3.修改配置项
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_account?
username: root
password: root
#type: com.zaxxer.hikari.HikariDataSource
#type: org.springframework.jdbc.datasource.DriverManagerDataSource
jdbc:
template:
#配置jdbc的查询超时时间为3秒
query-timeout: 3
4.测试
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class Shang01ApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void contextLoads() {
String sql = "select count(*) from t_comment";
Long aLong = jdbcTemplate.queryForObject(sql, Long.class);
log.info("记录总数:{}",aLong);
}
运行结果: