naobe @ ウィキ
iBATIS
最終更新:
Bot(ページ名リンク)
-
view
OpenSourceに戻る
iBATIS概要/特徴
- ORマッパ(Object,RDB)
- RDBのSQLを使う
- JavaBeanとテーブルの同期はない
- JDBC, JTA使用
- 常にPreparedStatementを適用
- キャッシュで高速化可能。JPAと異なり、insert, update , deleteはSQLを使う(個人的にはこちらのほうが判り易くて良い)。
検証環境
iBATIS2.3.4 最新のSpringがサポートするiBATISのバージョン
SQLマップ設定ファイル
目的
名前
SqlMapConfig.xml
配置
名前空間
SqlMapConfig.xmlの<settings>タブで、useStatementNamespaces属性をtrueに設定すると、sqlMapClientの引数idに名前空間を設定しなければならない。
名前空間はSQLマップXMLファイルに以下の様に設定する。
名前空間はSQLマップXMLファイルに以下の様に設定する。
<sqlMap namespace="BookTitleDto">
<settings>要素
プロパティファイル
目的
SQLマップ設定ファイルの値にプレースホルダとして設定。【記述】${プロパティ名}。
名前、配置
SQLマップ設定ファイル中の<properties>タグのresource属性に記述。クラスパスからの相対ディレクトリを指定。
SQLマップXMLファイル
大なり、小なりの記号をSQL内に記述するときは、以下の方法で回避できる。
WHERE AGE <![CDATA[ > ]]> #value#
記述例
Spring - SQLマップXMLファイル 参照
部品化
<sql>タグ、<include>タグを使って、重複するSQLを部品化できる。
【記述例】
<sql id="selectItem_fragment"> FROM items WHERE parentid = 6 </sql> <select id="selectItemCount" resultClass="int"> SELECT COUNT(*) AS total <include refid="selectItem_fragment"/> </select> <select id="selectItems" resultClass="Item"> SELECT id, name <include refid="selectItem_fragment"/> </select>
複雑なJavaBeanの対応
テーブルが別のテーブルの外部キーを持つとき、Objectへの変換は、属性がJavaBeanであるJavaBeanに変換することになる。この場合以下のように記述して対応する。
【記述例】
<resultMap id=”get-product-result” class=”com.ibatis.example.Product”> <result property=”id” column=”PRD_ID”/> <result property=”description” column=”PRD_DESCRIPTION”/> <result property=”category” resultMap=“get-category-result” /> </resultMap> <resultMap id=”get-category-result” class=”com.ibatis.example.Category”> <result property=”id” column=”CAT_ID” /> <result property=”description” column=”CAT_DESCRIPTION” /> </resultMap> <select id=”getProduct” parameterClass=”int” resultMap=”get-product-result”> select * from PRODUCT, CATEGORY where PRD_CAT_ID=CAT_ID and PRD_ID = #value# </select>
PRODUCT, CATEGORYのJOINをとって、全てのカラムをselectした後で、categoryに関しては、別のresultMapからJavaBeanを作成している。
SqlMapClient API
APIの取得
以下を使う。
private Reader reader = new Resources.getResourceAsReader( "com/ibatis/example/sqlMap-config.xml"); private SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader);
トランザクション
- SqlMapClient.startTransaction (), SqlMapClient.commitTransaction() SqlMapClient.endTransaction()を使う
- デフォルトは自動コミット、自動ロールバック
- 1トランザクション/1スレッド
バッチ
insert, updateを連続して実行するときにDBサーバに対してステートメントをまとめて発行する。
try {
sqlMap.startTransaction();
sqlMap.startBatch();
// … execute statements in between
int rowsUpdated = sqlMap.executeBatch(); //optional
sqlMap.commitTransaction();
} finally {
sqlMap.endTransaction();
}
ロギング
以下のログを使う。最初から順番に最初に見つかったものを使う。
- Jakarta Commons Logging
- Log4j
- JDK Logging
課題
| 課題 | 対応 | 備考 |
| SQLで複数のステートメントを送ることが可能なドライバの特性 | ||
