在H2数据库

时间:2015-08-03 23:09:06

标签: java sql jdbc h2

最近我从 HSQLDB 更改为 H2 ,更改了一些代码,我的查询停止执行。

我用RazorSQL测试我的SQL代码,我尝试访问我的数据库,发芽到我的惊喜没有创建表,没有错误抛出没有空指针,有效的sql,db文件创建 - 一切似乎都在运行好芽数据库中没有任何内容。

以下是我的数据库访问/创建的关键部分。

我使用连接器类创建连接数据库

public class H2DatabaseConnector {

    private Connection connection;
    private Statement statement;
    private ResultSet resultSet;


    public static final String[] PREP_STATEMENTS = new String[]{};

    public static final String DB_FILE_NAME = File.separator + "dboc";
    public static final String DB_DIR = Info.OC_DIR + "oc_database\\";

    static {
        try {
            Class.forName("org.h2.Driver");
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    public H2DatabaseConnector(String username, String password) {
        try {
            openConnection(username, password);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

.....
//data credentials are correct
 private void openConnection(String username, String password) throws SQLException {
        connection = DriverManager.getConnection("jdbc:h2:file:" + DB_DIR + DB_FILE_NAME+";DATABASE_TO_UPPER=false", username, password);
        statement = connection.createStatement();
    }

  public void execute() {
    }

}

实用程序类,我执行我的sql命令

public class DbUtil {


    public static final void createUsersTable(){
         new H2DatabaseConnector(Info.Db.DB_MAIN_USERNAME,Info.Db.DB_MAIN_PASSWORD) {

            @Override
            public void execute() {
                try {
                    getStatement().execute("CREATE TABLE users(name VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255));");
                    System.out.println("Table Created users");
                    getStatement().executeUpdate("INSERT INTO users VALUES ('sa','sa',NULL);");
                    closeConnection();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }

        }.execute();
    } 

}

执行正在进行,因为预期的芽没有创建表。 为什么会这样?没有显示错误,并且sql语法是正确的,因为当我在** RazorSQL 中打开数据库并创建/插入表时,一切正常。**

有什么想法吗?我真的坚持了一整天。

2 个答案:

答案 0 :(得分:3)

重新使用Statement可能会导致问题,但由于我没有完全可运行的示例,因此很难确定......

所以,我做了这个非常快速的测试(使用1.4.182)......

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Test {

    public static void main(String[] args) {
        try {
            Class.forName("org.h2.Driver");
            try (Connection con = DriverManager.getConnection("jdbc:h2:file:./Test;DATABASE_TO_UPPER=false", "sa", "sa")) {

                try (Statement stmt = con.createStatement()) {
                    stmt.execute("CREATE TABLE if not exists users(name VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255))");
                    con.commit();
                }

                try (PreparedStatement stmt = con.prepareStatement("INSERT INTO users (name, password, email) VALUES (?,?,?)")) {
                    stmt.setString(1, "sa");
                    stmt.setString(2, "sa");
                    stmt.setString(3, null);
                    int rows = stmt.executeUpdate();
                    System.out.println(rows + " where inserted");
                    con.commit();
                }

                try (PreparedStatement stmt = con.prepareStatement("select * from users")) {
                    try (ResultSet rs = stmt.executeQuery()) {
                        while (rs.next()) {
                            String name = rs.getString(1);
                            String password = rs.getString(2);
                            String email = rs.getString(3);
                            System.out.println(name + "; " + password + "; " + email);
                        }
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

第一次运行时输出...

1 where inserted
sa; sa; null

第二次运行时输出......

1 where inserted
sa; sa; null
sa; sa; null

就个人而言,我会将每个Statement隔离到一个任务中,事实上,我倾向于将每个Connection隔离开来,但那是因为我是偏执狂;)

答案 1 :(得分:0)

在进一步检查我的代码之后:原始帖子中的代码正在运行,无需进行任何更改。

我遇到的问题是我尝试从 RazorSQL 连接到我的数据库的一种方式,我使用的JDBC URL与我在我的代码中使用的确切URL匹配我省略了;DATABASE_TO_UPPER=false这反过来让我连接到它芽的架构没有改变。使用正确的JDBC URL后,我能够在RazorSQL中看到包含数据的表。

如果您遇到同样的问题,请尝试使用您在代码中使用的JDBC URL,以及之后的选项。

网址失败

jdbc:h2:file:C:\Users\tomas\.OpenChannel\oc_database\dboc

更正网址

jdbc:h2:file:C:\Users\tomas\.OpenChannel\oc_database\dboc;DATABASE_TO_UPPER=false

我从来没有想到这个问题会成为问题。 :d