Spring Boo数据访问JDBC

一、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();
    }

 

  ·效果:

  

 

  

  

·

 

posted @ 2019-02-25 19:47  林财钦  阅读(253)  评论(0编辑  收藏  举报