2010-02-19 113 views
7

我使用hsqldb來運行我需要數據庫訪問的單元測試。運行腳本以創建HSQLDB表格

就目前而言,當我想創建一個表,一個特定的測試,我有以下代碼:

private void createTable() { 
    PreparedStatement ps; 
    try { 
     ps = getConnection().prepareStatement("CREATE TABLE T_DATE (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP)"); 
     ps.executeUpdate(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

getConnection()方法檢索一個Spring上下文中定義一個數據源:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
    <property name="url" value="jdbc:hsqldb:mem:memoryDB"/> 
    <property name="username" value="SA"/> 
    <property name="password" value=""/> 
</bean> 

現在,我想從一個SQL腳本創建我的表(當然,這個腳本將包含多個表創建):

CREATE TABLE T_DATE_FOO (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP); 
CREATE TABLE T_DATE_BAR (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP); 
... 

我在HSQLDB文檔中看到我可以讓他去run a script at the startup。但是,它不符合我的要求,因爲我想在運行時運行腳本。

當然,我可以自己讀取文件,並且對於每個SQL語句,我運行一個ps.executeUpdate()命令,但我不想使用這種解決方案(除非沒有其他解決方案)。

有什麼想法?

回答

2

因爲您已經在使用spring,所以您可能想要使用執行SQL腳本的SimpleJdbcUtils.executeSQLScript方法,其中語句以分號分隔。 該類位於彈簧測試模塊(JAR)中。

+0

這是工作,謝謝!然而,我不明白爲什麼春天拒絕在幾行中有一個聲明(即使在最後有';')... – romaintaz 2010-02-19 12:41:10

+1

你使用哪種executeSqlScript方法?實施有所不同 – 2010-02-19 14:39:44

0

我有同樣的問題。我最終通過分割文本文件;並分別執行每個語句。這是可以的,因爲我們沒有插入內容,因此內部沒有分號。我還沒有找到一個簡單的方法來運行SQL腳本當時

+0

在我的情況下,分割腳本很容易,因爲腳本並不複雜,並且沒有特定的字符。但是,如果它存在,我真的更喜歡更好的解決方案... – romaintaz 2010-02-19 10:26:37

1

首先,我不知道這個影響。我很久以前用它爲我工作。 的SQLEXEC類是從的ant.jar,你也許可以看看螞蟻源來創建自己的實用工具類,

SQLExec sqlExec=new SQLExec(); 
sqlExec.setUserid("user"); 
sqlExec.setPassword("passowrd"); 
sqlExec.setUrl("jdbc:mysql://localhost:3306/dbname"); 
sqlExec.setDriver("com.mysql.jdbc.Driver"); 
sqlExec.setProject(new Project()); 
sqlExec.setSrc(new File("c:/test.sql")); 
sqlExec.execute(); 
4

您可能會給org.hsqldb.util.SqlFile一試。這個班似乎是你的問題的完美搭配。