在主要检查中创建“Java DB”数据库和关联表以查看它们是否存在?

时间:2011-10-12 03:59:25

标签: java netbeans javadb

我正在Netbeans 7上创建一个应用程序!我希望我的应用程序在main中有一些代码,以便它可以创建一个Java DB连接检查以查看数据库和关联表是否存在,如果没有创建数据库及其中的表。如果你能提供一个示例代码,那就太棒了!我已经查看了http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/但是我仍然不确定如何在创建之前检查现有数据库!

4 个答案:

答案 0 :(得分:4)

  

我希望我的应用程序在main中有一些代码,以便它可以创建一个Java DB连接检查以查看数据库和关联表是否存在,如果没有创建数据库及其中的表。

您可以在JDBC URL中添加create=true property。如果在连接时databaseName指定的数据库不存在,则会创建Derby数据库实例。如果数据库已经存在,则会发出警告,但据我所知,不会抛出SQLException

就创建表而言,在访问典型事务活动的数据库之前,最好在应用程序启动时完成。您需要查询Derby / JavaDB中的SYSTABLES system table以确定您的表是否存在。

Connection conn;
try
{
    String[] tableNames = {"tableA", "tableB"};
    String[] createTableStmts = ... // read the CREATE TABLE SQL statements from a file into this String array. First statement is for the tableA, and so on.
    conn = DriverManager.getConnection("jdbc:derby:sampleDB;create=true");
    for(int ctr =0 ; ctr < tableNames.length; ctr++)
    {
        PreparedStatement pStmt = conn.prepareStatement("SELECT t.tablename FROM sys.systables t WHERE t.tablename = ?");
        pStmt.setString(1, tableNames[ctr]);
        ResultSet rs = pStmt.executeQuery();
        if(!rs.next())
        {
            // Create the table
            Statement stmt = conn.createStatement();
            stmt.executeUpdate(createTableStmts[ctr]);
            stmt.close();
        }
        rs.close();
        pStmt.close();
    }
}
catch (SQLException e)
{
    throw new RuntimeException("Problem starting the app...", e);
}

然后可以创建任何不存在的表。如果您的应用程序有多个版本,并且架构因应用程序的一个版本而异,那么这当然不是一个好的做法。如果必须处理这种情况,则应将应用程序的版本存储在不同的表中(通常不会在不同版本中更改),然后应用特定于较新版本的数据库增量脚本,以便从旧版本迁移数据库。建议使用DbDeployLiquiBase等数据库更改管理工具。这些工具通过在表中存储应用程序的版本号来执行相同的操作,并执行版本大于数据库版本的delta脚本。

最后一点,JavaDB and Apache Derby之间没有显着差异。

答案 1 :(得分:0)

我不知道Oracle在重新命名之前改变了多少德比,但如果他们没有改变太多,那么Delete all tables in Derby DB可能会帮助你。该问题的答案列出了几种检查数据库中存在哪些表的方法。

您将在创建数据库连接时指定数据库;否则将无法成功创建连接。 (确切的语法取决于你如何连接到你的数据库,但它的逻辑与shree的答案相同。)

答案 2 :(得分:0)

create=true属性将创建一个新数据库(如果它不存在)。您可以使用DatabaseMetadata.getTables()方法检查是否存在Tables

Connection cn=DriverManager.getConnection("jdbc:derby://localhost:1527/testdb3;create=true", "testdb3", "testdb3");

ResultSet mrs=cn.getMetaData().getTables(null, null, null, new String[]{"TABLE"});

while(mrs.next())
 {
  if(!"EMP".equals(mrs.getString("TABLE_NAME")))
   {
    Statement st=cn.createStatement(); 
    st.executeUpdate("create table emp (eno int primary key, ename varchar(30))");
    st.close();;
   }
}
mrs.close();
cn.close();

答案 3 :(得分:-3)

Connection conn = getMySqlConnection();
    System.out.println("Got Connection.");
    Statement st = conn.createStatement();

    String tableName = ur table name ;
    String query = ur query;
    Statement stmt = null;
    ResultSet rs = null;
    try {
      stmt = conn.createStatement();
      rs = stmt.executeQuery(query);
      System.out.println("Exist");;
    }
    catch (Exception e ) {
      // table does not exist or some other problem
      //e.printStackTrace();
      System.out.println("Not Exist");
    }

    st.close();
    conn.close();