java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...
Code-Apprentice
2
java
sql
junit
jdbc
我正在用Java編寫數據庫程序,并且想要創建一個表(如果它還不存在).我從中了解DatabaseMetaData.getTables()了如何在Java中檢測SQL表的存在?而我正在嘗試使用它:
private boolean tableExists() throws SQLException {
System.out.println("tableExists()");
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getTables(null, null, this.getTableName(), null);
System.out.println("TABLE_NAME: " + rs.getString("TABLE_NAME"));
return rs.getRow() == 1;
}
問題是即使在創建表之后rs.getRow()總是返回0.使用rs.getString("TABLE_NAME")拋出異常表明結果集為空.
我想到的一個可能的解決方案是執行CREATE TABLE語句并捕獲拋出的任何異常.但是,我不喜歡在程序的控制流程中使用異常的想法.
FWIW,我正在使用HSQLDB.但是,我想編寫獨立于RDMS引擎的Java代碼.有沒有其他方法可以DatabaseMetaData.getTables()用來做我想要的事情?或者是否有其他解決方案來編寫我的tableExists()方法?
添加:
使用這里給出的建議,我找到了一個似乎適用于我的生產代碼的解決方案:
private void createTable() throws SQLException {
String sqlCreate = "CREATE TABLE IF NOT EXISTS " + this.getTableName()
+ " (brand VARCHAR(10),"
+ " year INTEGER,"
+ " number INTEGER,"
+ " value INTEGER,"
+ " card_count INTEGER,"
+ " player_name VARCHAR(50),"
+ " player_position VARCHAR(20))";
Statement stmt = conn.createStatement();
stmt.execute(sqlCreate);
}
現在我也在編寫一個JUnit測試來斷言表確實已經創建了:
public void testConstructor() throws Exception {
try (BaseballCardJDBCIO bcdb = new BaseballCardJDBCIO(this.url)) {
String query = "SELECT count(*) FROM information_schema.system_tables WHERE table_name = '" + bcdb.getTableName() + "'";
Connection conn = DriverManager.getConnection(this.url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
Assert.assertTrue(rs.next());
Assert.assertEquals(1, rs.getInt(1));
Assert.assertFalse(rs.next());
}
}
此測試assertEquals()在以下消息上失敗:
FAILED: expected: <1> but was: <0>
總結
以上是生活随笔為你收集整理的java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql8添加索引_MySQL8.0新
- 下一篇: android分辨率px跟dp,Andr