Mysql 如何在spring上下文初始化期间创建数据库

Mysql 如何在spring上下文初始化期间创建数据库,mysql,spring,datasource,javabeans,Mysql,Spring,Datasource,Javabeans,我需要在本地mysql服务器中创建一个名为test的数据库,用于设置数据源bean。我使用下面的spring配置为测试设置数据源和jdbctemplate @Configuration class Config { @Bean(initMethod = "setupDatabase") public DataSource getDataSource() { String url = "jdbc:mysql://localhost:3306/test";

我需要在本地mysql服务器中创建一个名为test的数据库,用于设置数据源bean。我使用下面的spring配置为测试设置数据源和jdbctemplate

@Configuration
class Config {
        @Bean(initMethod = "setupDatabase")
      public DataSource getDataSource() {
        String url = "jdbc:mysql://localhost:3306/test";
        DriverManagerDataSource dataSource = new DriverManagerDataSource(
                url, settings.getUsername(), settings.getPassword());
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
      }

      @Bean
      public JdbcTemplate getJdbcTemplate() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(((DataSourceTransactionManager)transactionManager()).getDataSource());
        return jdbcTemplate;
      }

      @Bean
      public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(getDataSource());
      }

      @Bean
      public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
        final DataSourceInitializer initializer = new DataSourceInitializer();
        initializer.setDataSource(dataSource);
        initializer.setDatabasePopulator(databasePopulator());
        return initializer;
      }

      private DatabasePopulator databasePopulator() {
        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScript(schemaScript);
        return populator;
      }

      @PostConstruct
      public void setupDatabase() {
        String url = "jdbc:mysql://localhost:3306";
        try {
          Connection connection = DriverManager.getConnection(url, settings.getUsername(), settings.getPassword());
          Statement statement = connection.createStatement();
          statement.execute("create database test");
        } catch (SQLException exception) {
          LOGGER.error("Could not setup database for test", exception);
          throw new RuntimeException(exception);
        }
    }
}
我收到以下错误,原因是:

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test'
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:46)

有人能解释一下这个配置出了什么问题吗?

您是否在本地mysql上创建了测试数据库?您需要先创建数据库,才能从应用程序进行连接。如果要通过执行sql查询来创建数据库,请以root用户身份连接到数据库并创建数据库。

异常的来源:您的
setupDatabase()
方法实际上是由Spring
getDataSource()
原因
@Bean(initMethod=“setupDatabase”)之后执行的
强制Spring在为bean初始化创建bean之后执行
initMetod
。但这不是你期望的

您需要以某种方式定义
getDataSource()
依赖于
setupDatabase()
。例如,借助注释

也看到


p.S.但是为什么不简单地手动添加
setupDatabase()
调用
getDataSource()
方法?

我希望在初始化spring上下文时能够以编程方式创建数据库。如果我手动创建数据库,它可以工作;但我希望能够在上下文初始化期间创建该数据库,并在我的bean中使用它