2010-02-19 20 views
7

Io uso hsqldb per eseguire i miei test di unità che richiedono un accesso al database.Esecuzione di uno script per creare tabelle con HSQLDB

Per il momento, quando voglio creare un tavolo per un test specifico, ho il seguente codice:

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(); 
    } 
} 

Il metodo getConnection() recuperare un DataSource definito in un contesto 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> 

Ora, voglio creare la mia tabella da uno script SQL (ovviamente, questo script conterrà più di una creazione tabella):

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

Ho visto nella documentazione HSQLDB che posso chiedergli di run a script at the startup. Tuttavia, non soddisfa i miei requisiti, poiché voglio eseguire uno script in fase di esecuzione.

Naturalmente, posso leggere il file da solo, e per ogni istruzione SQL, eseguo un comando ps.executeUpdate(), ma non voglio usare questo tipo di soluzione (tranne se non ci sono altre soluzioni).

Qualche idea?

risposta

2

poiché si sta già utilizzando la molla, è possibile che si desideri utilizzare il metodo SimpleJdbcUtils.executeSQLScript che esegue uno script SQL in cui le istruzioni sono separate da punto e virgola. questa classe è nel modulo di prova della molla (JAR).

+0

Questo funziona, grazie! Tuttavia, non capisco perché Spring rifiuti di avere un'istruzione in più righe (anche con un ';' alla fine) ... – romaintaz

+1

quale metodo executeSqlScript usi? c'è una differenza nell'implementazione –

0

Ho avuto lo stesso problema. Ho finito per dividere il file di testo; ed eseguendo ogni dichiarazione separatamente. Era OK perché non avevamo inserti quindi nessun punto e virgola all'interno delle istruzioni. Non ho trovato un modo semplice per eseguire uno script SQL in quel momento

+0

Nel mio caso, la suddivisione degli script sarà semplice, poiché gli script non sono molto complicati e non hanno caratteri specifici. Tuttavia, preferirei davvero una soluzione migliore se esiste ... – romaintaz

1

Prima di tutto, non conosco le implicazioni di questo. L'ho usato molto tempo fa ha funzionato per me. La classe SQLExec è da ant.jar, probabilmente si può guardare alla fonte di formica per creare la propria classe di utilità,

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

Si potrebbe dare org.hsqldb.util.SqlFile una prova. Questa classe sembra essere perfetta per il tuo problema.

Problemi correlati