iBATIS

日本語Struts2本が発売になります

毎日コミュニケーションズ社から本サイト関連のStruts2と各コンポーネントの日本語の本が出版されることになりました。Struts2 フルスタック化&Webアプリケーション開発 ~Struts2+Spring 2+Tiles+iBATIS+GWTで作るショッピングサイト~作者: 三国逸文出版社/…

iBATIS2.3.2のバグ

Springのwith dependencyパッケージは関連するJarが含まれていて便利だが、Spring2.5.5付属のiBATISは2.3.2となっていて、このバージョンには副問い合わせでのバグがある。 副問い合わせ指定のSQLを実行すると次のようなエラーが出力されてしまう。 javax.se…

iBatisの結果キャッシュ

iBatisのSQL設定ファイルで次のようにして結果キャッシュの指定ができる <cacheModel id="test.cache" type="LRU"> <flushInterval hours="24"/> <flushOnExecute statement="test.refresh"/> <property name="size" value="200"/> </cacheModel> これはLRUで最大24時間、200件のキャッシュを行う指定となる。またキャッシュを無効にする条件として test.refreshを指定している。あとはこのキャッシュ設定を適用するselectでc…

iBatisのサブクエリに複数のパラメータを渡す

iBatisで1対多のテーブルからの取得などの場合にサブクエリの指定は次のように行う。 <result property="history" column="id" select="getHist"/> これで、 getHist のSQL中で id の値は #value# で参照できるようになる。サブクエリに渡す値が一つで足りる場合は問題ないが、複合キーなどの場合に駆動表の複数カラム</result>…

selectの結果をMapで受け取る

以前resultMapの型をHashMapにする方法を紹介した 結果をMapで受け取る - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク が、今回のは結果をListではなく、Mapにする方法。 queryForListではなくqueryForMap…

結果をMapで受け取る

次のように記述すると、結果をhistの定義に従い受け取るが <resultMap id="hist" class="tutorial.History"> <result property="date" column="date"/> <result property="pay" column="pay"/> </resultMap> <select id="getHist" resultMap="hist"> SELECT date,pay FROM history WHERE id=#id# ORDER by date </select> 結果は ArrayList となる。 これを

iBatisのSQL記述の共通部分の共有

一覧ページング処理では件数の取得を先ず行ってから部分的な一覧の取得を行うことが多いが、その場合SQLの条件部分は全く同じになる。 そのようなSQLの共通部分を別に定義し、参照することで"全く同じ"を保証することが出来る。 <select id="getAllCount" resultClass="java.lang.Integer"> SELECT COUNT(*) as num FRO</select>…

iBatisから1対多のテーブルからのデータ取得2

前の方法(iBatisでの1対多のテーブルからのデータ取得 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク)だと、1対多の多側の取得にN回のクエリ実行が必要で、全体でN+1回のクエリを実行することになって…

Logの設定

Log4jを標準使用するので WEB-INF/classes/commons-logging.properties に次のように書く org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger Log4jの設定はXML形式の方が新しいけど、properties形式の方がなんとなく直感的で好き…

iBatisのLazyLoading設定

sqlMapConfig.xml に次のように記述すると iBatisでLazyLoadingが有効になる。 これで、1対多のような副問い合わせが有る場合、そのプロパティにアクセスされたときに初めてSQLが発行される。 <sqlMapConfig> <settings : lazyLoadingEnabled="true" enhancementEnabled="true" /> : : LazyLoadingEnabledが false の場合、 getSqlMapClient</settings></sqlmapconfig>…

iBatisでの1対多のテーブルからのデータ取得

iBatisで駆動表と1対多の関係にあるテーブルから同時にデータを取得してみる素直な実装では次のよう データを格納するクラスでプロパティとしてList型をつくり public class User { : public static class History { String date; double pay; public Strin…

プロパティ名がSQLの結果と一致する場合

結果Beanのプロパティに一致する場合は resultMap ではなく、 resultClass で直接結果格納用のクラスを書けば処理される <resultMap id="result" class="tutorial.User"> <result property="id" column="id" columnIndex="1"/> <result property="name" column="name" columnIndex="2"/> <result property="password" column="password" columnIndex="3"/> </result></result></result></resultmap>

動的な条件

iBatisで動的な条件を作成してみる。 例えばidのリストもしくは名前のリストで一致するものの一覧を取得する場合 <select id="getFilter" resultMap="result" parameterClass="tutorial.UserFilter"> SELECT id,name,password,salary FROM suser <dynamic prepend="WHERE"> <iterate prepend="OR " property="ids" open="id in (" close=")" conjunction=","> #ids[]# </iterate></dynamic></select>

varchar型以外のデータ型マッピング

PostgrsSQLのdouble型を何も気にせずマッピングしようとしたら駄目だった。 jdbcTypeとして、PostgreSQL側のデータ型を教えてあげる必要があるようだ。WEB-INF/sql/suser.xml <result property="salary" column="salary" jdbcType="double" columnIndex="4"/></result>

設定ファイルの場所

TestNGのテスト実行とWEBアプリケーションの実行双方であまり設定などをいじらずに共用したいが、今までの置き場所だとTestNGでのテスト時に設定が読めなかったので場所を調整。 WEB-INF/ classes/ applicationContext.xml -- spring設定 sqlMapConfig.xml -…

User CRUD操作のDAO

Springの iBatisサポートを使うので殆ど何も難しいことは無いtutorial.UserDAO.java

iBatisでデバッグ中のSQL変更

デバッグ中はSQLを頻繁に変更するけど、アプリケーションを再起動しないと変更が反映されない、これはつらい。 そこで、毎回読み直してくれる設定に強引にするまず Spring の applicationContext.xml で iBatis と dao を sigleton ではなく prototype にする