どとねとネタが増えてきたなぁ(;´Д`)

そなわけで、gdgdなプロジェクトを反面教師にして昨日からO/Rマッパーを使ってみましたよと。
そう、NHibernate…じゃなくてiBATIS.NETをヽ(´ー`)ノ
なにごともシンプルいずベストをw


準備としてここからfor .NETの「DataMapper 1.6.1」と「DataAccess 1.9.1」をゲッツ。
英語だけどドキュメントもあるといいかも。(あんまり読めないから微妙だけどw)
ZIPを解凍してbinaries-2.0の中にある「*.xsd」ファイルをVS2005インストフォルダ > XML > Schemasの中にコピー。
これを入れておくとVS2005のエディタから参照できるらしい。(入れないでやったからしらないw)

Webプロジェクトを新規作成

プロジェクトの参照設定に次のDLLを追加。

  • IBatisNet.Common.dll
  • IBatisNet.DataAccess.dll
  • IBatisNet.DataMapper.dll
  • Castle.DynamicProxy.dll (DAOFrameworkが依存)

プロジェクトのルートに次のファイルを追加。

  • providers.config

これで準備完了。

DAOFrameworkの設定ファイル「dao.config」の作成

プロジェクトのルートにXMLファイルを新規追加。名前は「dao.config(デフォルト)」。

<?xml version="1.0" encoding="utf-8"?>
<daoConfig
  xmlns="http://ibatis.apache.org/dataAccess"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="DaoConfig.xsd">

  <providers resource="providers.config"/>

  <context id="SqlMapDao">

    <properties resource="database.config"/>

    <database>
      <provider name="oracle10.1"/>
      <dataSource
        name="iBatisSample"
        connectionString="User Id=${user};Password=${password};Data Source=${datasource}"/>
    </database>

    <daoSessionHandler id="SqlMap">
      <property name="resource" value="sqlMap.config"/>
    </daoSessionHandler>

    <daoFactory>
      <dao
        interface="IBatisNetSample.Persistence.Dao.IZipDao, IBatisNetSample"
        implementation="IBatisNetSample.Persistence.MapperDao.ZipSqlMapDao, IBatisNetSample" />
    </daoFactory>

  </context>
</daoConfig>

どうもiBATISのサイトで公開されてるチュートリアルとかPetShopサンプルの設定ファイルと違ったりするんで、「xsi:noNamespaceSchemaLocation="DaoConfig.xsd"」からスキーマ参照した方が確実。
んで、設定自体はドキュメント通り。
databaseタグの箇所は接続するDBによってconnectionStringが変わるのでこれはOracleの場合。
「${name}」はpropertiesタグで参照しているファイル内で定義。(Javaのプロパティファイルと同じ)

<?xml version="1.0" encoding="utf-8" ?>
<settings>
  <add key="user" value="hoge" />
  <add key="password" value="hogehoge" />
  <add key="datasource" value="hogedb" />
</settings>

こんな感じ。
daoSessionHandlerはiBATIS使ったことのある人ならなじみのあるマッピングファイルの定義。(後述)
daoFactoryてのがDIをつかってインスタンスを返してくれるらしい。

interface="インタフェースクラス名, アセンブリ名"
implementation="インタフェースクラス名, アセンブリ名"

このdao.configがDAOFrameworkの基点になる設定ファイル。

マッピング設定定義ファイル「sqlMap.config」の作成

これもプロジェクトのルートに作成。
作成したファイル名をdao.config内のdaoSessionHandlerタグで参照する。

<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="SqlMapConfig.xsd">

  <settings>
    <setting useStatementNamespaces="false"/>
    <setting cacheModelsEnabled="true"/>
  </settings>

  <sqlMaps>
    <sqlMap resource="Maps/Zip.xml" />
  </sqlMaps>

</sqlMapConfig>

SqlMapperのみ利用する場合にはこのファイル内に接続するDB情報を記述するが、DAOFrameworkを使う場合はそちらが優先されるので不要。
あとはJavaと同じなので略。(とくに難しいこともないし)

SQLマッピングファイル「xxx.xml

SQLとそのResultSetとクラスのマッピングを定義するファイル。
このファイルの設置場所はどこでもOK。
ただ、sqlMap.configファイルを基点に相対パスで指定できる箇所のほうが楽。

<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Person"
  xmlns="http://ibatis.apache.org/mapping"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="../SqlMap.xsd">

  <alias>
    <typeAlias alias="Zip" type="IBatisNetSample.Domain.Zip, IBatisNetSample" />
  </alias>

  <resultMaps>
    <resultMap id="SelectResult" class="Zip">
      <result property="ZipCd" column="ZIP_CD" />
      <result property="PrefectureNm" column="PREFECTURE_NM" />
      <result property="MunicipalityNm" column="MUNICIPALITY_NM" />
    </resultMap>
  </resultMaps>

  <statements>
    <select id="Select" resultMap="SelectResult">
      SELECT
        ZIP_CD, PREFECTURE_NM, MUNICIPALITY_NM
      FROM
        T_ZIP
      ORDER BY
        ZIP_CD
    </select>
  </statements>
</sqlMap>

Java版となんらかわりなし。


ながいんで、ここでやめw
追記
各種設定ファイルの読取の基点は「アプリの実行フォルダ」。
基本そこからファイルを参照する。