n-3104の備忘録
更新履歴
取得中です。

Java > iBATIS


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


前提

  • 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

そして、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はまだ対応していないようだ。
合計: -
今日: -
昨日: -