一、SpringBoot 访问JDBC原理
我们可以参考源代码:SpringBoot2中默认的数据源是使用HikariDataSource
/**
* Hikari DataSource configuration.
*/
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)
同时可以支持其他类型的数据源:
org.apache.tomcat.jdbc.pool.DataSource
"com.zaxxer.hikari.HikariDataSource"
org.apache.commons.dbcp2.BasicDataSource
对于其他公司如阿里巴巴的druid数据源,通过查看源码,可以自行在配置文件中配置
/**
* Generic DataSource configuration. 通过数据源配置
*/
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
在application.xml|.yml中添加如下配置:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
1.关于SpringBoot自动建表、执行Sql语句
通过查看DataSourceInitializer这个类源代码:
/** 建表结构 * Create the schema if necessary. * @return {@code true} if the schema was created * @see DataSourceProperties#getSchema() */ public boolean createSchema() { List<Resource> scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema"); if (!scripts.isEmpty()) { if (!isEnabled()) { logger.debug("Initialization disabled (not running DDL scripts)"); return false; } String username = this.properties.getSchemaUsername(); String password = this.properties.getSchemaPassword(); runScripts(scripts, username, password); } return !scripts.isEmpty(); }
查看getScripts()方法
private List<Resource> getScripts(String propertyName, List<String> resources,
String fallback) {
if (resources != null) {
return getResources(propertyName, resources, true);
}
String platform = this.properties.getPlatform();
List<String> fallbackResources = new ArrayList<>();
fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql"); //.sql文件存放在这路径下
fallbackResources.add("classpath*:" + fallback + ".sql"); //.sql也可以使用者方式存放
return getResources(propertyName, fallbackResources, false);
}
//执行Sql语句原理
private void runScripts(List<Resource> resources, String username, String password) {
if (resources.isEmpty()) {
return;
}
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.setContinueOnError(this.properties.isContinueOnError());
populator.setSeparator(this.properties.getSeparator());
if (this.properties.getSqlScriptEncoding() != null) {
populator.setSqlScriptEncoding(this.properties.getSqlScriptEncoding().name());
}
for (Resource resource : resources) {
populator.addScript(resource);
}
DataSource dataSource = this.dataSource;
if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
dataSource = DataSourceBuilder.create(this.properties.getClassLoader())
.driverClassName(this.properties.determineDriverClassName())
.url(this.properties.determineUrl()).username(username)
.password(password).build();
}
DatabasePopulatorUtils.execute(populator, dataSource);
}
默认创建表:
schema-*.sql、data-*.sql
默认规则:schema.sql,schema-all.sql;
可以使用
schema:
- classpath:指定名称.sql
指定位置
2.不使用默认的数据源,使用阿里的数据源。
通过查看源代码可以知道,默认的数据源中是没有druid连接池的,但是默认的连接池都有放在容器中,所以我们可以手写一个配合类,并放在容器中即可,容器会自动加载我们的。
2.1首先在pom.xml中依赖druid的依赖包
2.2写一个配置类,可以参照DataSourceConfiguration
根据以下配置就可以配置好Druid数据库
@Configuration
public class config {
@Bean
@ConditionalOnProperty(name = "spring.datasource.type")
public DataSource dataSource(){
return new DruidDataSource();
}
·效果:
·