为什么需要为JdbcTemplate指定架构

时间:2018-06-27 19:27:05

标签: spring-boot spring-jdbc

这是application.properties中的数据源规范

spring.dw.datasource.jdbc-url=jdbc:h2:tcp://localhost/file:~/developer/myprojects;schema=DW;FILE_LOCK=SOCKET;MVCC=true
spring.dw.datasource.driver-class-name=org.h2.Driver
spring.dw.datasource.username=me
spring.dw.datasource.password=p
spring.dw.datasource.platform=h2

在我的配置中,我这样做:

@Configuration
public class DatasourceConfiguration {
    //...

    @Bean
    @ConfigurationProperties(prefix="spring.dw.database")
    public DataSource dwDatasource(){
        return DataSourceBuilder.create().build();
    }

我使用一种服务方法:

@Autowired
public DataSource dwDatasource;

public void run() {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dwDatasource);
    jdbcTemplate.update("INSERT INTO SAMPLETABLE1 (STRING1, STRING2) VALUES ('TEST4', 'TEST2')");
        System.out.println("<<run()");
    }

我得到:

 StatementCallback; bad SQL grammar [INSERT INTO SAMPLETABLE1 (STRING1, STRING2) VALUES ('TEST4', 'TEST2')]; nested exception is org.h2.jdbc.JdbcSQLException: Table "SAMPLETABLE1" not found; SQL statement:

但是,如果我这样做:

public void run() {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dwDatasource);
    jdbcTemplate.update("INSERT INTO DW.SAMPLETABLE1 (STRING1, STRING2) VALUES ('TEST4', 'TEST2')");
        System.out.println("<<run()");
    }

所有作品。

问题是,为什么我必须指定架构

1 个答案:

答案 0 :(得分:2)

摘自H2文档:schema

  

默认   在未显式设置任何模式的语句中使用schema。的   新连接的默认架构为PUBLIC

您可以从同一文档中指定要使用的默认架构:

  

此设置可以附加到数据库URL:   jdbc:h2:test;SCHEMA=ABC