実際に、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メソッドに渡すのは、
インターフェースの型です。実装クラスのインスタンス化はフレームワークが
やってくれます。