jp.terasoluna.fw.ex.unit.io.impl
クラス DbSource<T>

java.lang.Object
  上位を拡張 jp.terasoluna.fw.ex.unit.io.impl.AbstractInputSource<T>
      上位を拡張 jp.terasoluna.fw.ex.unit.io.impl.DbSource<T>
すべての実装されたインタフェース:
InputSource<T>

public class DbSource<T>
extends AbstractInputSource<T>

DBから入力ソースオブジェクトを生成します。
コンストラクタまたはsetterにて以下のパラメータを指定します。またAbstractInputSource で設定可能なパラメータも指定できます。

パラメータ名 説明 設定箇所 必須
jdbcTemplate JdbcTemplateオブジェクト。DataSource オブジェクトが設定されている必要があります。 コンストラクタ
clazz ResultSetからマッピングするBeanのクラス コンストラクタ
sql マッピングしたい行データを取得するためのSQL。明示的に指定しない場合は 「select * from テーブル名」が実行されます。 コンストラクタ or setter rowMapperを指定する場合は○
tableName マッピングしたい行データを取得する対象のテーブル名。デフォルトではマッピング対象クラスから Class.getSimpleName()で取得します。 コンストラクタ or setter  
rowMapper SQL実行結果の各ResultSetからオブジェクトをマッピングするためのRowMapper オブジェクト。デフォルトではBeanPropertyRowMapper を使用します(要Spring2.5以上)。 コンストラクタ  
isConvertDate マッピングするオブジェクトのjava.util.Date型フィールドに対して、java.util. Date拡張型(java.sql.Timestamp、java.sql.Date、java.sql.Time )がマッピングされた場合にjava.util.Date型に戻す処理を行うかどうかのフラグ。 Boolean.TRUEまたはnullの場合は、マッピングするクラスのjava.util.Date型フィールドにマッピングされた java.util.Date型拡張クラスのオブジェクトを、 java.util.Date型に変換してフィールドに設定し直します。デフォルトはnullです 。変換が不要の場合はBoolean.FALSEを設定してください。(「■ 留意事項」参照) setter  
 以下の例にて使用法を説明します。
 
 DB上のpersonテーブルの内容を以下とします。
 
 
 ID,NAME,ADDRESS
 1,田中,東京
 2,鈴木,大阪
 3,山田,神奈川
 4,山本,福岡
 
 これに対してマッピングするクラスを以下とします。
 
 public class Person {
   private Integer id;
   private Sring name;
   private String address;
   // setter/getterは略
 }
 
 【データ比較機能】
 
 業務処理の結果としてPersonクラスのリストが作成される際に、このPersonテーブルの内容が期待値となる場合、次のように比較することができます。
 
 // DBから入力ソースを作成する
 DbSource<Person> source = new DbSource<Person>(jdbcTemplate, Person.class);
 // 業務処理の結果
 List<Person> result = ...;
 // 業務処理の結果とテーブルの内容を比較する
 AssertUtils.assertInputEquals(source, result);
 
 【データ保存機能】
  // DBに格納されていた試験データをcsvファイルに保存します
  source.to(new CsvTarget<Person>("person.csv", Person.class));
  
  ※↑の例でデータを取得するSQLを変更したい場合、次のようにsetterにて設定できます
  source.setSql("SELECT id, name FROM person ORDER BY name");
  
  
■ 留意事項 本クラスではDBへの問い合わせ結果をオブジェクトにマッピングするためにRowMapperを使用しますが、 デフォルトではRowMapperの仕様によらず、マッピングするクラスのjava.util.Date型フィールドにマッピングされた java.util.Date型拡張クラス(java.sql.Timestamp、java.sql.Date、java.sql.Time)のオブジェクトを、java.util.Date型に変換してフィールドに設定し直します。 すなわちRowMapperでjava.util.Date型のフィールドに対して、 ResultSet.getTimestamp(int)の結果を設定した場合等は、変換処理により 設定されたjava.sql.Timestampオブジェクトからjava.util.Dateオブジェクトを作成して 設定し直します。 (本クラスのデフォルトRowMapperであるBeanPropertyRowMapperは java.util.Dateフィールドに対してjava.sql.Timestampオブジェクトを設定する仕様となっています。) AbstractInputSource.compare(jp.terasoluna.fw.ex.unit.io.InputSource)によるオブジェクト同士の比較処理において、 型が違う場合に不一致と判断されるための処理です。 iBatisではjava.util.Date型のフィールドへのデータのマッピングの際に、java.sql.Timestampからjava.util.Dateに変換するため、 この処理に合わせています。 この変換処理によって問題になるのは、 本クラスが取得するオブジェクトと比較対象のオブジェクト(試験対象処理の結果得られるオブジェクト)のjava.util.Dateフィールドに 対して意図的にjava.sql.Timestampオブジェクトが設定されている場合や、そのような仕様のORマッパーを使用している場合です。 この場合、変換処理を行わずにRowMapperの仕様通りの結果を得るためにsetIsConvertDate(Boolean)Boolean.FALSEを設定してください。 試験対象処理内容とRowMapperの実装内容について以下のパターンについて対応方法を説明します。
RowMapperが設定するjava.util.Dateフィールドへの値
試験対象処理中で設定するjava.util.Dateフィールドへの値   java.util.Dateオブジェクトを設定 java.sql.Timestampオブジェクトを設定
java.util.Dateオブジェクトを設定 パターンA パターンB
java.sql.Timestampオブジェクトを設定 パターンC パターンD
パターンA
追加設定は不要です。試験対象処理内でiBatisでDBからデータを取得し、独自RowMapperがjava.util.Dateフィールドに対して、new Date(rs.getTimestamp().getTime());のように設定している場合等がこのパターンにあたります。 ただし、変換処理は不要であるためsetIsConvertDate(Boolean)でBoolean.FALSEを設定した方が単体テストの性能は良くなります。
パターンB
追加設定は不要です。デフォルトで想定しているパターンです。試験対象処理内でiBatisでDBからデータを取得し、RowMapperBeanPropertyRowMapper(デフォルト)を使用している場合はこのパターンです。
パターンC
このRowMapperではテストできません。別のRowMapperを設定してください。試験対象処理内で返却するオブジェクトのjava.util.Dateフィールドにjava.sql.Timestampオブジェクトを設定し、独自RowMapperがjava.util.Dateフィールドに対して、new Date(rs.getTimestamp().getTime());のように設定している場合等がこのパターンにあたります。
パターンD
必ずsetIsConvertDate(Boolean)でBoolean.FALSEを設定してください。試験対象処理内で返却するオブジェクトのjava.util.Dateフィールドにjava.sql.Timestampオブジェクトを設定し、RowMapperにBeanPropertyRowMapper(デフォルト)を使用している場合はこのパターンです。
・java.sql.Date ・java.sql.Time の場合についても試験対象処理内容とRowMapperの実装内容の関係に対する対応方法はjava.sql.Timestampの場合と同様です。 上記以外のjava.util.Date独自拡張型をフィールドに持つオブジェクトへのマッピングには本クラスは対応していません。


フィールドの概要
protected  Class<T> clazz
           
protected  org.springframework.jdbc.core.RowMapper rowMapper
           
protected  String sql
           
protected  org.springframework.jdbc.core.JdbcTemplate template
           
 
クラス jp.terasoluna.fw.ex.unit.io.impl.AbstractInputSource から継承されたフィールド
equalStrategy, header, headerMap
 
コンストラクタの概要
DbSource(org.springframework.jdbc.core.JdbcTemplate template, Class<T> clazz)
          コンストラクタ
DbSource(org.springframework.jdbc.core.JdbcTemplate template, Class<T> clazz, String sql, org.springframework.jdbc.core.RowMapper rowMapper)
          コンストラクタ
DbSource(org.springframework.jdbc.core.JdbcTemplate template, String tableName, Class<T> clazz)
          コンストラクタ。
 
メソッドの概要
 Iterator<T> getIterator()
          DB問い合わせ結果をイテレータで返却します。
 void setIsConvertDate(Boolean isConvertDate)
          マッピングするオブジェクトのjava.util.Date型フィールドに対して、java.util.
 void setSql(String sql)
          マッピングしたい行データを取得するためのSQLを設定します。
 
クラス jp.terasoluna.fw.ex.unit.io.impl.AbstractInputSource から継承されたメソッド
compare, getEqualStrategy, getHeader, getHeaderMap, setEqualStrategy, setHeader, setHeaderMap, to
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

template

protected final org.springframework.jdbc.core.JdbcTemplate template

clazz

protected final Class<T> clazz

rowMapper

protected final org.springframework.jdbc.core.RowMapper rowMapper

sql

protected String sql
コンストラクタの詳細

DbSource

public DbSource(org.springframework.jdbc.core.JdbcTemplate template,
                String tableName,
                Class<T> clazz)
コンストラクタ。
RowMapperBeanPropertyRowMapperを使用します。

パラメータ:
template - JDBCテンプレート
tableName - マッピングしたい行データを取得する対象のテーブル名
clazz - 行データをマッピングするクラス

DbSource

public DbSource(org.springframework.jdbc.core.JdbcTemplate template,
                Class<T> clazz)
コンストラクタ

パラメータ:
template - JDBCテンプレート
clazz - 行データをマッピングするクラス

DbSource

public DbSource(org.springframework.jdbc.core.JdbcTemplate template,
                Class<T> clazz,
                String sql,
                org.springframework.jdbc.core.RowMapper rowMapper)
コンストラクタ

パラメータ:
template - JDBCテンプレート
clazz - 行データをマッピングするクラス
sql - マッピングしたい行データを取得するためのSQL
rowMapper - SQL実行結果の各ResultSetからオブジェクトをマッピングするためのRowMapper オブジェクト
メソッドの詳細

setIsConvertDate

public void setIsConvertDate(Boolean isConvertDate)
マッピングするオブジェクトのjava.util.Date型フィールドに対して、java.util. Date拡張型(java.sql.Timestamp、java.sql.Date、java.sql.Time )がマッピングされた場合にjava.util.Date型に戻す処理を行うかどうかのフラグを設定します。

パラメータ:
isConvertDate - マッピングするオブジェクトのjava.util.Date型フィールドに対して、java.util. Date拡張型(java.sql.Timestamp、java.sql.Date、java.sql.Time )がマッピングされた場合にjava.util.Date型に戻す処理を行うかどうかのフラグ (Boolean.FALSEの場合は変換しません 。Boolean.TRUEまたはnullの場合は変換します。)

getIterator

public Iterator<T> getIterator()
DB問い合わせ結果をイテレータで返却します。
 sqlとrowMapperからJdbcTemplate.query(String, RowMapper)を実行し、
 その結果をイテレータで返却します。
 (すべての行データがメモリ上に展開されてからイテレータを作成する点に注意してください。)
 
 DbSourceの「■ 留意事項」を参照してください。
 

戻り値:
イテレータ

setSql

public void setSql(String sql)
マッピングしたい行データを取得するためのSQLを設定します。

パラメータ:
sql - マッピングしたい行データを取得するためのSQL


Copyright © 2011. All Rights Reserved.