SpringBoot数据访问
SQL
一、数据源的自动配置 HikariDataSource
1、导入jdbc使用场景
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
为什么导入jdbc场景,官方不导入驱动呢?官方不知道我们要操作什么数据库。
数据库的版本和驱动的版本要对应;
2、导入mysql驱动
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency>
若想要修改默认版本
1、直接依赖引入具体的版本(maven的就近原则)
2、重新声明版本
<properties>
<java.version>1.8</java.version>
<mysql.version>5.1.47</mysql.version>
</properties>
若未声明版本、则使用当前项目默认版本
2、分析自动配置
DataSourceAutoConfiguration.class:数据源自动配置
修改数据源相关的配置:spring.datasource
数据库连接池中的自动配置,是自己容器中没有DataSource才自动配置的;
@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 {
DataSourceTransactionManagerAutoConfiguration.class:事务管理器的自动配置
JdbcTemplateAutoConfiguration.class:jdbcTemolate自动配置,可以对数据库进行curd
这可以修改这个配置项:@ConfigurationProperties(prefix = "spring.jdbc")来修改jdbcTemplate
@Bean @Primary JdbcTemplate jdbcTemplate:容器中有这个组件
@Bean @Primary JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); Template template = properties.getTemplate(); jdbcTemplate.setFetchSize(template.getFetchSize()); jdbcTemplate.setMaxRows(template.getMaxRows()); if (template.getQueryTimeout() != null) { jdbcTemplate.setQueryTimeout((int)template.getQueryTimeout().getSeconds()); } return jdbcTemplate; }
还有很多自动配置文件、此处不过多描述。。。
3、修改数据源配置项
spring: datasource: url: jdbc:mysql://localhost:3306/spring_boot_data?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
//springboot 2.0中需要在url后添加 ?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8来避免报时区错误
测试代码
@Autowired private JdbcTemplate jdbcTemplate; @Test void testJdbcTemplate() { Integer count = jdbcTemplate.queryForObject("select count(*) from user", Integer.class); System.out.println("记录总数:"+count); }
自定义数据源
@Configuration public class MyDataSourceConfig { /** * 配置自定义数据源 * @ConfigurationProperties("spring.datasource"):与配置文件中配置的属性一一对应 */ @Bean @ConfigurationProperties("spring.datasource") public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); return druidDataSource; }