微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

 

  ·效果

  

 

  

  

·

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐