2015-08-08 160 views
4

我需要從我的Java應用程序初始化數據庫。出於代碼可維護性的原因,我想將Java代碼與Java代碼分開維護(它目前在單獨的源文件中)。是HSQLDB over JDBC:批量執行SQL語句

文件的前幾行如下:

-- 1 - Countries - COUNTRIES.DAT; 
drop table Countries if exists; 
create table Countries(
    CID integer, 
    ECC varchar(2), 
    CCD varchar(1), 
    NAME varchar(50)); 

我從文件中讀取的SQL代碼,並將其存儲在一個字符串。然後我做:

PreparedStatement stmt = dbConnection.prepareStatement(sqlString); 

這失敗,出現以下異常:

java.sql.SQLSyntaxErrorException: unexpected token: CREATE : line: 2 

這看起來好像JDBC不喜歡在一個PreparedStatement多個SQL語句。我也試過CallableStatementprepareCall(),結果相同。

JDBC是否提供了一種可以一次性傳遞整個SQL腳本的方法?

回答

3

JDBC標準(以及針對該問題的SQL標準)假設每次執行一條語句。一些驅動程序可以選擇允許在一次執行中執行多個語句,但從技術上講,該選項違反了JDBC標準。 JDBC本身沒有任何支持多語句腳本執行的東西。

您需要自己分開陳述(在;上),然後單獨執行它們,或者找到爲您執行此操作的第三方工具(例如MyBatis ScriptRunner)。

你可能也想看看flyway或liquibase。

0

要運行一個硬編碼/從文件加載查詢您可以使用execute像:

Statement stmt = null; 
String query = "drop table Countries if exists; 
       create table Countries(
         CID integer, 
         ECC varchar(2), 
         CCD varchar(1), 
         NAME varchar(50));"; 
try { 
    stmt = con.createStatement(); 
    stmt.execute(query); 
} catch (SQLException e) { 
    JDBCTutorialUtilities.printSQLException(e); 
} finally { 
    if (stmt != null) { stmt.close(); } 
} 

如果你想運行例如動態查詢追加你必須使用PreparedStatement的值。爲了從文件運行查詢,不建議將動態查詢放入其中。

+0

這對大多數數據庫不起作用,因爲JDBC期望每次執行一條語句(並且大多數驅動程序遵循該規則,並且具有違反規範的顯式配置選項)。 –