我正在 Netbeans 7 上创建一个应用程序!我希望我的应用程序在 main 中有一些代码,以便它可以创建一个 Java DB 连接,检查数据库和关联表是否存在,如果不存在,则创建数据库和其中的表。如果您可以提供示例代码,那就太好了!我已经查看了http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/但我仍然不确定如何在创建现有数据库之前检查它!
4 回答
我希望我的应用程序在 main 中有一些代码,以便它可以创建一个 Java DB 连接,检查数据库和关联表是否存在,如果不存在,则创建数据库和其中的表。
您可以在 JDBC URL 中添加create=true
属性。如果由 指定的数据库databaseName
在连接时不存在,这将创建一个 Derby 数据库实例。如果数据库已经存在,则会发出警告,但据我所知,不会SQLException
抛出。
就表的创建而言,最好在应用程序启动时完成,然后再访问数据库进行典型的事务活动。您将需要在 Derby/JavaDB 中查询SYSTABLES 系统表以确定您的表是否存在。
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);
}
然后可以创建任何不存在的表。如果您的应用程序有多个版本,并且架构因应用程序的一个版本而异,那么这当然不是一个好的做法。如果您必须处理这种情况,您应该将应用程序的版本存储在不同的表中(通常不会跨版本更改),然后应用特定于新版本的数据库增量脚本,以从旧版本迁移数据库. 建议使用DbDeploy或LiquiBase等数据库更改管理工具。在后台,这些工具通过将应用程序的版本号存储在表中来执行相同的操作,并执行版本高于数据库中版本的增量脚本。
最后一点, JavaDB 和 Apache Derby之间没有显着差异。
我不知道甲骨文在重新命名之前对 Derby 进行了多少更改,但如果它们没有发生太大变化,那么Delete all tables in Derby DB可能会对您有所帮助。该问题的答案列出了检查数据库中存在哪些表的几种方法。
您将在创建数据库连接时指定数据库;否则将无法成功创建连接。(确切的语法取决于您连接到数据库的方式,但它的逻辑与 shree 的答案相同。)
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();
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();