いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

iBatis奮闘記-0019 (基本的なDAOの作成-2)

実際に、DAOの作成を行います。

インターフェースを定義します。
DAOフレームワークを使用する場合の決まりごとですが、定義するインターフェースは、

  • com.ibatis.dao.client.Daoインターフェース

を継承して作成します。このインターフェースはマーカーインターフェースです。
メソッドは一つも定義されていません。

// vim:set ts=4 sw=4 et ws is nowrap ft=java:
package gsf.samples.ibatis.sample012;

import java.util.*;

import com.ibatis.dao.client.*;

/**
 * SAMPLE012_TEST_TABLEに対応するDAOインターフェースです.<br/>
 *
 * @author gsf_zero1
 *
 */
public interface Sample012TestTableDao extends Dao{

    /**
     * データを全件取得します.<br/>
     *
     * @return 結果データリスト
     *
     */
    List<Sample012TestTable> findAll();

}

次に、実装クラスを作成します。
実装クラスは、上記で定義したインターフェースをimplmentsし、且つ、
対応するテンプレートクラス(今回の場合は、SqlMapDaoTemplate)を継承させます。

// vim:set ts=4 sw=4 et ws is nowrap ft=java:
package gsf.samples.ibatis.sample012;

import java.util.*;

import com.ibatis.dao.client.*;
import com.ibatis.dao.client.template.*;

/**
 * SAMPLE012_TEST_TABLEに対応するSample012TestTableDaoインターフェースの実装クラスです.<br/>
 * 【注意】iBatis Data Access Objectフレームワークを使用する場合は、DaoManagerを受け取るコンストラクタを<br/>
 * 作成することが義務付けられています.<br/>
 *
 * @author gsf_zero1
 *
 */
public class Sample012TestTableDaoImpl extends SqlMapDaoTemplate implements Sample012TestTableDao{

    /**
     * コンストラクタ.<br/>
     *
     * @param daoManager DaoManagerオブジェクト
     *
     */
    public Sample012TestTableDaoImpl(DaoManager daoManager){
        super(daoManager);
    }

    /**
     * @see gsf.samples.ibatis.sample012.Sample012TestTableDao#findAll()
     *
     * @throws DaoException 処理中にエラーが発生した場合(実行時例外)
     *
     */
    public List<Sample012TestTable> findAll(){
        return super.queryForList("findAllSample012TestTable", null);
    }

}

自前で、SqlMapClientを生成して、処理を行っていたパターンの時と
SqlMapDaoTemplateを利用して処理を行うパターンで、違うのは以下の点です。

  • テンプレートファイルにて、SqlMapClientから実行していたメソッドが定義されています(queryForListなど)
  • SqlMapExecutorを取得するメソッドが用意されています。
  • 処理に失敗した場合は、java.sql.SQLExceptionではなく、実行時例外であるDAOExceptionがスローされます。

ここまでで、DAOの作成は、終了です。
後は、DAO設定ファイルに定義します。

        <dao 
            interface="gsf.samples.ibatis.sample012.Sample012TestTableDao" 
            implementation="gsf.samples.ibatis.sample012.Sample012TestTableDaoImpl"/>

では、動作確認してみます。

// vim:set ts=4 sw=4 et ws is nowrap ft=java:
package gsf.samples.ibatis.sample012;

import com.ibatis.common.resources.*;
import com.ibatis.dao.client.*;

public class IBatisSample012{

    /**
     * アプリケーションエントリポイント.<br/>
     *
     * @param  args 起動時引数
     *
     * @throws java.io.IOException DaoManager生成中にエラーが発生した場合
     *
     */
    public static void main(String[] args) throws java.io.IOException{
        //
        // DaoManagerオブジェクトを生成.
        //
        DaoManager daoManager 
            = DaoManagerBuilder.buildDaoManager(Resources.getResourceAsReader("DaoManagerConfig.xml"));

        //
        // 使用するDAOの具象オブジェクトを取得
        //
        Sample012TestTableDao dao = (Sample012TestTableDao) daoManager.getDao(Sample012TestTableDao.class);

        for(Sample012TestTable aRow : dao.findAll()){
            System.out.println(aRow);
        }

    }

}

DaoManagerの作成は、SqlMapClientの作成方法とほぼ同じです。
使用するファクトリクラスが変更されるぐらいですね。

特徴的なのは、DAOの実装クラスが動作確認クラスには出てこないことです。

    daoManager.getDao()

から、返されているのは、実際には実装クラスなのですがインターフェース経由で
利用することにより、上記の動作確認クラスは、DAOの実装に依存していません。
つまり、あとから実装クラスを変更しても、DAO設定ファイルの定義を修正すれば
利用する側のクラスは修正する必要がないということです。getDaoメソッドに渡すのは、
インターフェースの型です。実装クラスのインスタンス化はフレームワーク
やってくれます。