私の理解が正しければ、iBatis がオブジェクトにどのようにマップされるかを完全に制御したいと思うでしょう。
これはITypeHandlerCallbackで行うことができます。詳細については、セクション「3.5.5. カスタム タイプ ハンドラー」のPDF ドキュメントを参照してください。
私は DataTables で似たようなことをしました。実装は次のようになります。
class DataTableBuilder : ITypeHandlerCallback
{
public object GetResult(IResultGetter getter)
{
IDataReader reader = getter.DataReader;
// (A) define whatever type you want to
// (B) read rows from DataReader and populate your type from (A)
while (reader.Read())
{
// iterate over the columns of the current row
for (int i = 0; i < reader.FieldCount; i++)
{
// populate your type from (A)
}
}
return ...; // return your type from (A)
}
// implement the other members of ITypeHandlerCallback
// the implementation below actually worked for me
public object NullValue { get { return null; } }
public void SetParameter(IParameterSetter setter, object parameter) { }
public object ValueOf(string s) { return s; }
}
最後の注意: iBatis は、データ転送オブジェクト (DTO) を構築するのに適しています。上記のようなことを試してみると、すでにビジネス オブジェクト アプローチに移行している可能性があります。これは、iBatis では苦痛になる可能性があります。現在(ええと...時間がないため、すでに数か月間)、代替手段としてNHibernateを評価しています。NHibernate は、iBatis よりもはるかにスムーズにビジネス オブジェクト アプローチを処理していると思います。