*スクリーンショット張替え中です
しばらくお待ちください。。
XLSファイルを扱うため、Jakarta POIが必要です。
poi-bin-2.0-RC2-20040102.zip
本家:
http://jakarta.apache.org/poi/
上記ファイルを解凍し、中にある「poi-2.0-RC2-20040102.jar」に対して、プロジェクトのプロパティからパスを通します。
データベースからデータを取得し
XLS形式で書き出すプログラムです。
DataExportWithXLS.java
01 package common; 02 03 import java.io.File; 04 import java.io.FileOutputStream; 05 import java.io.FileWriter; 06 import java.sql.Connection; 07 import java.sql.DriverManager; 08 09 import org.dbunit.database.DatabaseConnection; 10 import org.dbunit.database.IDatabaseConnection; 11 import org.dbunit.dataset.IDataSet; 12 import org.dbunit.dataset.csv.CsvDataSetWriter; 13 import org.dbunit.dataset.excel.XlsDataSet; 14 import org.dbunit.dataset.xml.FlatDtdDataSet; 15 import org.dbunit.dataset.xml.FlatXmlDataSet; 16 17 /** 18 * @author n-sasaki 19 */ 20 public class DataExportWithXLS { 21 22 private static final String TEST_DATA_DIRECTORY = "D:/wiki/"; 23 private static final String DATA_FILE_NAME = "dbUnitTest.xls"; 24 25 private static final String DRIVER_CLASS_NAME = "oracle.jdbc.driver.OracleDriver"; 26 private static final String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:DJWiki"; 27 private static final String DATABASE_USER_NAME = "djwiki"; 28 private static final String DATABASE_PASSWORD = "djwiki"; 29 private static final String DATABASE_SCHEMA = "DJWIKI"; 30 31 public static void main(String[] args) throws Exception { 32 33 // database connection 34 Class.forName(DRIVER_CLASS_NAME); 35 36 Connection jdbcConnection = 37 DriverManager.getConnection(DATABASE_URL, DATABASE_USER_NAME, DATABASE_PASSWORD); 38 39 IDatabaseConnection connection = new DatabaseConnection(jdbcConnection, DATABASE_SCHEMA); 40 41 System.out.println("Schema : " + connection.getSchema()); 42 43 // partial database export 44 String[] tableNames = 45 { 46 "USER_TABLE", 47 "WIKI_USER" 48 }; 49 50 System.out.println("対象テーブル"); 51 for (int idx = 0; idx < tableNames.length; idx++) { 52 System.out.println(tableNames[idx]); 53 } 54 55 IDataSet partialDataSet = connection.createDataSet(tableNames); 56 57 System.out.println("<< XLSデータExport開始 >>"); 58 59 XlsDataSet.write(partialDataSet, new FileOutputStream(new File(TEST_DATA_DIRECTORY + DATA_FILE_NAME))); 60 61 System.out.println("<< XLSデータExport終了 >>"); 62 } 63 }
|
●設定が必要な箇所
- 22:ここで設定されたパスにファイルが生成されます。
- 23:出力されるXLSファイル名(原則としてテストケースと同じ名前にします。)
- 25:データベースドライバのクラス名
- 26:データベースのURL
- 27:データベースのユーザ名
- 28:データベースのパスワード
- 29:データベースのスキーマ名(ユーザ名を大文字にしたもの)
但し、PostgreSQLはスキーマという概念が存在しないので空にする。
- 46:出力したいテーブルの名前(Stringの配列)
以上の設定が完了したら実行します。
22行目で設定したパスにXLSファイルが出来ています。
複数テーブルを指定した場合は、1シートに1テーブルのデータが書き込まれます。
XLSファイルのデータをデータベースにインポートするプログラムです。
DataImportWithXLS.java
01 package common; 02 03 import java.io.File; 04 import java.io.FileInputStream; 05 import java.io.FileNotFoundException; 06 import java.io.FileReader; 07 import java.sql.Connection; 08 import java.sql.DriverManager; 09 10 import org.dbunit.database.DatabaseConnection; 11 import org.dbunit.database.IDatabaseConnection; 12 import org.dbunit.dataset.IDataSet; 13 import org.dbunit.dataset.excel.XlsDataSet; 14 import org.dbunit.dataset.xml.FlatDtdDataSet; 15 import org.dbunit.dataset.xml.FlatXmlDataSet; 16 import org.dbunit.operation.DatabaseOperation; 17 18 /** 19 * @author n-sasaki 20 */ 21 public class DataImportWithXLS { 22 23 private static final String TEST_DATA_DIRECTORY = "D:/wiki/"; 24 private static final String DATA_FILE_NAME = "dbUnitTest.XLS"; 25 26 private static final String DRIVER_CLASS_NAME = "oracle.jdbc.driver.OracleDriver"; 27 private static final String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:DJWiki"; 28 private static final String DATABASE_USER_NAME = "djwiki"; 29 private static final String DATABASE_PASSWORD = "djwiki"; 30 private static final String DATABASE_SCHEMA = "DJWIKI"; 31 32 public static void main(String[] args) throws Exception { 33 34 // database connection 35 Class.forName(DRIVER_CLASS_NAME); 36 37 Connection jdbcConnection = 38 DriverManager.getConnection(DATABASE_URL, DATABASE_USER_NAME, DATABASE_PASSWORD); 39 40 IDatabaseConnection connection = new DatabaseConnection(jdbcConnection, DATABASE_SCHEMA); 41 42 System.out.println("Schema : " + connection.getSchema()); 43 44 System.out.println("<< データImport開始 >>"); 45 46 IDataSet partialDataSet = null; 47 48 partialDataSet = new XlsDataSet(new FileInputStream(new File(TEST_DATA_DIRECTORY + DATA_FILE_NAME))); 49 50 DatabaseOperation.CLEAN_INSERT.execute(connection, partialDataSet); 51 52 System.out.println("<< データImport終了 >>"); 53 } 54 } |
●設定が必要な箇所
- 23:XLSファイルがあるフォルダ。
- 24:インポートするXLSファイル名
- 26:データベースドライバのクラス名
- 27:データベースのURL
- 28:データベースのユーザ名
- 29:データベースのパスワード
- 30:データベースのスキーマ名(ユーザ名を大文字にしたもの)
但し、PostgreSQLはスキーマという概念が存在しないので空にする。
以上の設定が完了したら実行します。
基本的に以下の3つのファイルはFlat XML DataSetのファイルと同じです。
- DBUnitTestCase.java
- DatabseProperties.java
- TestData.properties
DBUnitTestDataManager.javaのcreateDataSet(108行目~)を以下のようにします。
01 /** 02 * 引数で渡されたファイル名を元にXLSファイルを読み込み, IDataSetを生成し返却する. 03 * 04 * @param testDataFile テストファイル名 05 * @return IDataSet 06 */ 07 protected IDataSet createDataSet(String fileName) throws Exception { 08 09 if (fileName == null) 10 return null; 11 12 IDataSet dataSet = null; 13 try { 14 dataSet = new XlsDataSet( 15 new File(databaseProperties.getTestDataDirectory() + "/" + fileName + ".XLS")); 16 } 17 catch (FileNotFoundException e) { 18 } 19 20 return dataSet; 21 } |
通常JUnitのテストケースを作成する場合は"junit.framework.TestCase"クラスを継承しますが、DBUnitTestCaseを継承してテストケースを作成します。
実行方法はJUnitと同様です。
テストケース内のsetUp()でデータのクリーンInsertを行い、tearDown()でデータの消去を行います。
よって、
テスト終了時にはデータベースのデータは無くなります。
(Exportする際に指定したテーブルのみ。)
出力されたXLSファイルで、各データの間に空白データがあるとNullPointerExceptionが発生します。
ダメな例)
これならOK)