いろいろ備忘録日記

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

iBatis奮闘記-0021 (ユーティリティクラスの利用)

前回より、大分間があいてしまいましたが前回作成したユーティリティクラスを利用したバージョンです。

[DAO実行クラス]

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

import java.util.*;

import gsf.interfaces.dao.*;
import gsf.utils.dao.*;

public class IBatisSample012DaoManagerUtilsVersion{

    private static class Sample012TestTableDaoExecutor implements DaoExecutor{

        private Sample012TestTableDao dao;

        protected void setSample012TestTableDao(Sample012TestTableDao dao){
            this.dao = dao;
        }

        public Object execute(){

            return dao.findAll();

        }
    }

    public static void main(String[] args){

        Map<String, Class> daoInterfacesMap = new HashMap<String, Class>();
        daoInterfacesMap.put("sample012TestTableDao", Sample012TestTableDao.class);

        List<Sample012TestTable> result 
                = (List<Sample012TestTable>) DaoManagerUtils.executeNoTransaction(new Sample012TestTableDaoExecutor(), daoInterfacesMap);

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

    }

}

DaoManagerUtils.executeNoTransactionに、実行されるDaoExecutorの実装とセットしてほしいDaoのマップを渡すと
iBatisのDaoManagerから該当DAOを生成し、内部でリフレクションを使用してバインドしてからDaoExecutor#executeをコールします。
プチDIみたいなものですね。

Sample012TestTableDaoExecutorが複数のDAOの実行と制御を担当するFacadeになります。

一つのExecutorに対して、一つのDAOが関連している場合のみだとあまり意味ないですが
複数のDAOが関連している場合とかは、自動でセットしていく方が楽ですね。