Netbeans 7でアプリケーションを作成しています!アプリケーションに小さなコードをメインに含めて、Java DB接続を作成し、データベースと関連テーブルが存在するかどうかを確認します。存在しない場合は、データベースとテーブルを作成します。サンプルコードを提供できれば、それも同じくらい素晴らしいでしょう!すでにhttp://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/を見ましたが、作成する前に既存のデータベースを確認する方法がまだわかりません。
4 に答える
アプリケーションのメインに小さなコードを追加して、Java DB 接続チェックを作成して、データベースと関連テーブルが存在するかどうかを確認し、そうでない場合はデータベースとそのテーブルを作成できるようにしたいと考えています。
create=true
プロパティを JDBC URL に追加できます。databaseName
で指定されたデータベースが接続時に存在しない場合、これにより Derby データベース インスタンスが作成されます。データベースが既に存在する場合は警告が発行されますが、私の知る限り、noSQLException
はスローされません。
テーブルの作成に関する限り、通常のトランザクション アクティビティでデータベースにアクセスする前に、アプリケーションの起動時にこれを行うのが最適です。テーブルが存在するかどうかを確認するには、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 をブランド変更する前にどれだけ変更したかはわかりませんが、あまり変更されていない場合は、 Derby DB のすべてのテーブルを削除することで解決できる可能性があります。その質問への回答には、データベース内に存在するテーブルを確認するいくつかの方法がリストされています。
DB 接続を作成するときにデータベースを指定します。そうしないと、接続が正常に作成されません。(これの正確な構文は、データベースへの接続方法次第ですが、そのロジックはシュリーの回答と同じです。)
この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();