1.与JDBC连接
1.1连接步骤
1.依赖(pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2.配置数据库连接信息:application.yml(这个连接的数据库时在Docker上的,这个mysql的使用可以查看:Docker入门)
spring:
datasource:
username: root
password: 19960722
url: jdbc:mysql://192.168.2.128:3306/jdbc
driver-class-name: com.mysql.cj.jdbc.Driver
3.测试是否能连接上数据库:
@SpringBootTest
class SpringbootJdbcApplicationTests {
@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作为数据源。
数据源的相关配置都在DataSourceProperties里面。
1.2 自动配置原理
jdbc的相关配置都在org.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) {
return properties.initializeDataSourceBuilder().build();
}
}
1.3 启动应用执行sql
1.3.1 配置原理
SpringBoot在创建连接池后还会运行预定义的SQL脚本文件。具体参考org.springframework.boot.autoconfigure.jdbc.DataSourceInitializationConfiguration配置类。
@Import({DataSourceInitializerInvoker.class, DataSourceInitializationConfiguration.Registrar.class})
class DataSourceInitializationConfiguration {
在DataSourceInitializerInvoker中有createSchema和InitSchema方法的调用,这两个方法在DataSourceInitializer方法中:
createShema方法中获取shema脚本文件:
List<Resource> scripts = this.getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");
private List<Resource> getScripts(String propertyName, List<String> resources, String fallback) { if (resources != null) { return this.getResources(propertyName, resources, true); } else { String platform = this.properties.getPlatform(); List<String> fallbackResources = new ArrayList(); fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql"); fallbackResources.add("classpath*:" + fallback + ".sql"); return this.getResources(propertyName, fallbackResources, false); } }
可以看出,如果我们没有在配置文件中配置脚本的具体位置,就会在classpath下找schema-all.sql(platform赋值为all,在DataSourceProperties,这个可以在配置文件中修改)和schema.sql。
initSchema方法中获取脚本:getScripts与上面的一样
List<Resource> scripts = this.getScripts("spring.datasource.data", this.properties.getData(), "data");
initSchema()方法获得是data-all.sql,data.sql。
我们可以在配置文件中中配置sql文件的位置:
spring:
datasource:
schema:
- classpath:department.sql
- 指定位置
1.3.2 测试
在类路径下创建schema.sql,运行程序查看数据库是否存在该表
DROP TABLE IF EXISTS `department`