使用方法

最低限すべきことはjp.ac.fun.db.diff.DefaultDbDifferのインスタンスを作成し、初期化メソッド、「操作前」のDB状態取得メソッド、「操作後」のDB状態取得メソッド、それにDB差分の出力メソッドを呼んでやることだけです。

順にやっていきましょう。
まずはjp.ac.fun.db.diff.DefaultDbDifferを継承したクラスの用意です。

  1. import jp.ac.fun.db.diff.DefaultDbDiffer;
  2. DefaultDbDiffer<String, Object> dbDiffer = new DefaultDbDiffer<>();

ここでDefaultDbDifferに対し、型パラメータStringとObjectを宣言しています。
型パラメータT1(今回はString)にはカラムを識別するオブジェクトの型を指定します。通常、カラム名がテーブルでの一意な情報になりますのでStringとしています。
型パラメータT2(今回はObject)にはカラム値の取り得るオブジェクトの型を指定します。通常、DBではVARCHAR2型やCHAR型、NUMBER型、DATE型等を取りますのでObject型としました。

最低限の使用をするにはこれで十分ですが、出力方法や差分の取り方などを変更する必要がある場合は
DefaultDbDifferの各メソッドをOverrideして下さい。
Overrideの指針については別途説明します。



次に初期化メソッドの呼び出し方法です。
用意されているシグニチャは以下の二通りがあります。

  1. init(RowsGetter<T1, T2> rowsGetter, String... tableNames)
  1. init(RowsGetter<T1, T2> rowsGetter, List<String> tableNameList)

テーブル名の一覧を渡す型がStringの配列か、List型であるかの違いしかありません。
ここで一点だけ注意しなければならないのはRowsGetterがInterfaceであるという点だけです。
別クラスとしてこのInterfaceを実装したクラスを用意するか、または匿名クラスとして呼び出し時に与えてやる必要があります。
ここでは後者の方法で記載します。

このInterfaceで規定されている実装すべきメソッドは、「対象テーブルのPKとして設定されているカラムはどれか」を取得するメソッドと、「対象テーブルの全行データ」を取得するメソッドです。
対象のDBの種類にもよりますが、PK情報を取得するには大抵特別な権限が必要で、このPK情報が取得できない場合、DB-Diffは全てのカラムを結合して「その行である」と特定しようとし、その情報をメモリに格納します。
PK情報が取得できた場合には、PKが設定されているカラムの情報分だけしかメモリに格納されません。
これは何百カラムもあるテーブルに於いて、非常にコストの掛かる動作だということを忘れないで下さい。
出来るならその「特別な権限」をDB-Diffで使用するユーザに割り当ててもらうよう管理者に相談することを推奨します。
遅くなりましたが初期化メソッドの実装サンプルです。

  1. DefaultDbDiffer<String, Object> dbDiffer = new DefaultDbDiffer<>();
  2. dbDiffer.init(new RowsGetter<String, Object>() {
  3. @Override
  4. public List<String> getPkRows(String tableName) {
  5. return JdbcIntegration.getKeyColumnDao().findPkColumn(tableName);
  6. }
  7. @Override
  8. public Map<String, UniqueEntity<String, Object>> getAllRows(List<String> pkList, String tableName) {
  9. List<Map<String, Object>> allRowList = JdbcIntegration.getAllTableDao().findAllRows(tableName);
  10. return DbDiffUtil.convertUniqueEntities(tableName, pkList, allRowList);
  11. }
  12. },
  13. "TABLE_SAMPLE1", "TABLE_SAMPLE2");

何か複雑ですがここだけです。
JdbcIntegration.getKeyColumnDao().findPkColumn()とJdbcIntegration.getAllTableDao().findAllRows()は架空の、先に述べていた情報を取得するだけのものです。
使用する環境に合わせて実装してください。

最後に「操作前」のDB状態取得メソッド、「操作後」のDB状態取得メソッド、それにDB差分の出力メソッドの呼び出しです。
ここは一気に進みましょう。

  1. dbDiffer.setReadyToProcess();
  2. ~~「操作」~~
  3. dbDiffer.output(dbDiffer.getDiff());

簡単ですね!
標準のoutputメソッドでは以下のように「System.err」に出力されます。

準備中

またJRE1.7以上用のJARファイルには簡易XML出力クラス、SimpleDiffOutputXmlが同梱されています。