Spring Boot数据访问数据库的自动配置及源码注解分析

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);
    }

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值