如何在创建新数据库之前检查现有的h2数据库

时间:2016-09-02 14:21:36

标签: java servlets jdbc h2

我正在使用java servlet和h2嵌入式数据库开发学生数据库Web应用程序。我需要知道如何查找典型的学生数据库是否存在。因此,如果不存在,则必须创建它,否则程序应继续使用现有程序。

3 个答案:

答案 0 :(得分:4)

package com.dora.databasecheck;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;

@Configuration
public class DataSourceInit {

    boolean dbExists = false;

    @Bean(name = "dataSource")
    public DataSource getDataSource(){
        DataSource dataSource = createDataSource();
        DatabasePopulatorUtils.execute(createDatabasePopulator(), dataSource);
        return dataSource;
    }

    private DatabasePopulator createDatabasePopulator() {
        ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
        databasePopulator.setContinueOnError(true);
        if(!dbExists){
            databasePopulator.addScript(new ClassPathResource("db/sql/create-db.sql"));
            databasePopulator.addScript(new ClassPathResource("db/sql/insert-data.sql"));
        }
        return databasePopulator;
    }

    private SimpleDriverDataSource createDataSource() {
         SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
         simpleDriverDataSource.setDriverClass(org.h2.Driver.class);
         simpleDriverDataSource.setUsername("sa");
         simpleDriverDataSource.setPassword("");
         Connection conn = null;
        try{
            conn = DriverManager.getConnection("jdbc:h2:~/doradb;IFEXISTS=TRUE","sa","");           
            this.dbExists =true;

         }
        catch(Exception e){         
             this.dbExists = false;  
        }

         simpleDriverDataSource.setUrl("jdbc:h2:~/doradb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");

        return simpleDriverDataSource;      
    }
}

答案 1 :(得分:2)

IFEXISTS

您可以在连接尝试中指定只有在请求的数据库已存在时才应完成连接。此功能使用IFEXISTS=TRUE语法。

String url = "jdbc:h2:/data/sample;IFEXISTS=TRUE";

当数据库不存在时抛出异常的陷阱。

默认情况下,如果没有指定IFEXISTS,H2会自动创建数据库(如果尚未存在)。

文件

您检查文件系统中是否存在数据库文件,假设您的数据库持久存储(而不是内存数据库)。

答案 2 :(得分:2)

我发现这个方法解决了我的问题,首先连接对象检查数据库是否存在,如果没有,它会抛出创建数据库的异常。

try
{
Connection c=DriverManager.getConnection("jdbc:h2:aaa;IFEXISTS=TRUE",username,password);
}
Catch(final Exception e)
{
connection c=DriverManager.getConnection("jdbc:h2:aaa","user","pass");
}