依赖
快捷创建SpringBoot时候选中,选择Spring Web,JDBC API 和 MySQL
配置数据库连接信息
spring:
datasource:
username: root
password: 1022
url: jdbc:mysql://localhost/test
driver-class-name: com.mysql.jdbc.Driver
测试能否连接上数据库:
@SpringBootTest
class SpringbootDataJdbcApplicationTests {
//数据源
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
//是否获取到数据源
System.out.println(dataSource.getClass());
//获取一个连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
}
springboot默认是使用com.zaxxer.hikari.HikariDataSource
作为数据源,2.0以下是用org.apache.tomcat.jdbc.pool.DataSource
作为数据源;
数据源的相关配置都在DataSourceProperties里面;
自动配置原理
jdbc的相关配置都在springframework\boot\autoconfigure\jdbc
包下
参考DataSourceConfiguration,根据配置创建数据源,默认使用Hikari连接池;可以使用spring.datasource.type指定自定义的数据源类型;
springboot默认支持的连池:
- org.apache.commons.dbcp2.BasicDataSource
- com.zaxxer.hikari.HikariDataSource
- org.apache.tomcat.jdbc.pool.DataSource
自定义数据源类型:
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnMissingBean({
DataSource.class})
@ConditionalOnProperty(
name = {
"spring.datasource.type"}
)
static class Generic {
Generic() {
}
@Bean
DataSource dataSource(DataSourceProperties properties) {
//使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性
return properties.initializeDataSourceBuilder().build();
}
}
启动应用执行sql
SpringBoot在创建连接池后还会运行预定义的SQL脚本文件,具体参考org.springframework.boot.autoconfigure.jdbc.DataSourceInitializationConfiguration
配置类,
在该类中注册了dataSourceInitializerPostProcessor
下面是获取schema脚本文件的方法:
List<Resource> scripts =
this.getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");
可以看出,如果我们没有在配置文件中配置脚本的具体位置,就会在classpath下找schema-all.sql
和schema.sql
platform获取的是all,platform可以在配置文件中修改
具体查看createSchema()
方法和initSchema()
方法
initSchema()
方法获取的是data-all.sql
,data.sql
我们也可以在配置文件中配置sql文件的位置:
spring:
datasource:
schema:
- classpath:department.sql
- 指定位置
测试:
在类路径下创建schema.sql
,运行程序查看数据库是否存在该表:
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`departmentName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=In