n-3104の備忘録
iBATIS
最終更新:
n-3104
-
view
前提
- ibatis-2.3.0.677.zip
- j2sdk1.4.2_11
- Microsoft SQL Server 2000
- Eclipse SDK バージョン: 3.1.1
- Abator code generator for iBATIS 1.0.0
特徴
SQL文を記述するO/Rマッピングフレームワーク。参照系SQLの検索結果とJavaBeansのマッピングを設定ファイルで行うことが出来きる。SQLを直接記述できるためチューニングが容易であるが、特定のDBに依存してしまう。
- SQL文を外部ファイルで管理できる。
- 動的SQL用の独自の構文をサポートしている。
- 検索結果のJavaBeansのキャッシュ機能がある。
- あるBeanのプロパティのBeanについてもまとめて検索できる。この際の方法は以下の2通り。
- 遅延ローディング
- join
とりあえず使ってみる
iBATIS SQL Maps チュートリアル For SQL Maps Version 2.0 February 18, 2006
iBATISのサイトで配布されている「iBATIS-SqlMaps-2-Tutorial_ja.pdf」を参考にとりあえず動かしてみようとした。だが、チュートリアルの時点で以下の点で誤植(?)があった。
- クラス名は MyAppSqlConfig だが使用例では MyAppSqlMapConfig で、Mapが増えている。
- MyAppSqlConfig の resource の値が com/ibatis/example/sqlMap-config.xml となっているが、それまで紹介されたものは examples/sqlmap/maps/SqlMapConfigExample.xml である。
しかも、SQLServer2000の場合は、JDBCドライバのコネクションURLに SelectMethod=Cursor を追加する必要があり、これに気付かず1時間近く嵌ってしまった。まぁ、これもiBATIS-SqlMaps-2_ja.pdfに明記されてはいたが。
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B313181
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B313181
そして、setBirthDate(null)にするとエラーとなってしまう。newPerson.setBirthDate(new java.sql.Date(new Date().getTime()))とかすればエラーにはならなかったが。
Person newPerson = new Person(); newPerson.setId(12); // you would normally get the ID from a sequence or custom table // newPerson.setBirthDate(null); newPerson.setBirthDate(new java.sql.Date(new Date().getTime()));
null を指定できるようにするには、xmlファイルにおいてjdbcTypeを指定する必要がある。前述のガイドでも触れられているが、null値を指定する場合はjdbcTypeを明示的に指定しないとエラーになる場合があるらしい。具体的にはPerson.xmlのinsertPersonにおいてbirthDateにjdbcTypeとしてDATEを追加すればよい。
#birthDate# → #birthDate:DATE#
ibatis-2.3.0.677.zipに付属のsimple_example
チュートリアルがうまく動かなかったので、zipファイルに付属している使用例を使ってみようとしたが、Account.xmlの insertAccount で values の前に ')' がついていなかった。。
トランザクション
SqlMapClient+startTransaction をしなければ、オートコミットの挙動になった。以下のソースでstartTransactionメソッドを呼ばなければ、insertについてもコミットされていた
SqlMapClient sqlMap = MyAppSqlMapConfig.getSqlMapInstance(); sqlMap.startTransaction(); // トランザクションの開始 Person person = new Person(); ... sqlMap.delete ("deletePerson", person); sqlMap.commitTransaction(); // この時点で一旦コミット sqlMap.insert("insertPerson", person); sqlMap.endTransaction(); // insertについてはロールバックされる
また、dataSourceのJDBC.DefaultAutoCommitプロパティの値はstartTransactionでトランザクションを開始した場合には有効であるが、開始していない場合は無視された。
<transactionManager type="JDBC" > <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${driver}"/> <property name="JDBC.ConnectionURL" value="${url}"/> <property name="JDBC.Username" value="${username}"/> <property name="JDBC.Password" value="${password}"/> <property name="JDBC.DefaultAutoCommit" value="false"/> </dataSource> </transactionManager>
iBATIS-SqlMaps-2_ja.pdf
短いが、非常に良くまとまっている。不明点があれば参照すべきガイドである。
Abator
概要
iBATIS用の設定ファイルとソースコードを自動生成してくれるツール。Eclipse用のプラグインも存在する。
Eclipseプラグイン
インストール手順
http://ibatis.apache.org/abator.html を参照。更新アクセス先サイトを追加するだけで簡単に追加できる。
使い方
新規メニューの中に "Abator For iBATIS Configuration File" が追加されるので、それをクリックすると abatorConfig.xml の雛形が生成される。この中身を適切に設定すれば自動生成できる。
abatorConfig.xml
<abatorConfiguration> <abatorContext> <jdbcConnection driverClass="com.microsoft.jdbc.sqlserver.SQLServerDriver" connectionURL="jdbc:microsoft:sqlserver://localhost:1433;databaseName=test;SelectMethod=Cursor" userId="???" password="???"> <classPathEntry location="C:/workspace/iBatis/msbase.jar" /> <classPathEntry location="C:/workspace/iBatis/mssqlserver.jar" /> <classPathEntry location="C:/workspace/iBatis/msutil.jar" /> </jdbcConnection> <javaModelGenerator targetPackage="hoge.bean" targetProject="iBatis/src" /> <sqlMapGenerator targetPackage="hoge.map" targetProject="iBatis/src" /> <daoGenerator type="IBATIS" targetPackage="hoge.dao" targetProject="iBatis/src" /> <table tableName="PERSON"/> </abatorContext> </abatorConfiguration>
ポイントは以下の通り。細かい情報は http://ibatis.apache.org/docs/tools/abator/ を参照。
- classPathEntryは絶対パスが無難
- targetProjectはEclipseのプロジェクト名+ソースフォルダ名
- tableにschema属性をつけたらうまく動かなかった。
また、生成されたDAOは iBATIS DAO framework を前提としているためコンパイルエラーになる。iBATISは 2.3 から DAO framework 廃止し、Spring framework に移行することを推奨しているが、Abatorはまだ対応していないようだ。