どとねとネタが増えてきたなぁ(;´Д`)
そなわけで、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
追記
各種設定ファイルの読取の基点は「アプリの実行フォルダ」。
基本そこからファイルを参照する。