2015-08-08 111 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期望每次执行一条语句(并且大多数驱动程序遵循该规则,并且具有违反规范的显式配置选项)。 –