SQL Maps



Similar documents
iBATIS SQL Maps

SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 文 言 変 更 p.12(1. 基 本 事 項 ) (5)SXF 入 出 力 バージョン Ver.2 形 式 と Ver.3.0 形 式 および Ver.3.1 形 式 の 入 出 力 機 能 を

計算式の取り扱い

Microsoft Word - サンプル _データベースアクセス_.doc

労働時間と休日は、労働条件のもっとも基本的なものの一つです

V-CUBE One

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加

PowerPoint プレゼンテーション

富士山チェックリスト

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド

1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図

目 次 1. ログイン ユーザー 登 録 TOP 職 員...8 (1) 職 員 の 名 刺 表 示...8 (2) 職 員 の 名 刺 一 括 ダウンロード...8 (3) 職 員 の 名 刺 帳 から 検 索 検 索...9 (1) 氏 名

IAF ID x:2010 International Accreditation Forum, Inc. Page 2 of 8 国 際 認 定 機 関 フォーラム(IAF)は 適 合 性 評 価 サービスを 提 供 する 機 関 の 認 定 のためのプログラ ムを 運 営 している この 認 定

<4D F736F F D20819C B78AFA95DB91538C7689E68DEC90AC289

Microsݯft Word - 91 forܠ2009November.docx

(Microsoft PowerPoint - Ver12\203o\201[\203W\203\207\203\223\203A\203b\203v\216\221\227\277.ppt)

目 次 1. 大 学 情 報 データベースシステムの 使 用 方 法 について EXCEL 一 括 登 録 EXCEL ダウンロード 検 索 条 件 の 指 定 プレビュー EXCEL ダウンロード(データ 抽 出 あ

Microsoft Word - 第3章.doc

2 県 公 立 高 校 の 合 格 者 は このように 決 まる (1) 選 抜 の 仕 組 み 選 抜 の 資 料 選 抜 の 資 料 は 主 に 下 記 の3つがあり 全 高 校 で 使 用 する 共 通 の ものと 高 校 ごとに 決 めるものとがあります 1 学 力 検 査 ( 国 語 数

育休代替任期付職員制度について

Microsoft Word - 佐野市生活排水処理構想(案).doc

<4D F736F F D20819C486F70658F6F93588ED297708AC7979D89E696CA837D836A B E A2E646F63>

特別徴収封入送付作業について

Microsoft Word - tutorial5-teammodeling.docx


Microsoft Word - FrontMatter.doc

Untitled

平成21年9月29日

預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可

からは 課 題 が 残 っている また 不 純 物 標 準 品 を 用 いて 不 純 物 を 特 定 した 方 法 で 承 認 された 新 有 効 成 分 含 有 医 品 に 対 しては 日 局 収 載 時 に 従 来 の 不 純 物 標 準 品 を 用 いず 不 純 物 を 特 定 しない 設 定

POWER EGG V2.01 ユーザーズマニュアル ファイル管理編

1. 前 払 式 支 払 手 段 サーバ 型 の 前 払 式 支 払 手 段 に 関 する 利 用 者 保 護 等 発 行 者 があらかじめ 利 用 者 から 資 金 を 受 け 取 り 財 サービスを 受 ける 際 の 支 払 手 段 として 前 払 式 支 払 手 段 が 発 行 される 場 合

Microsoft Word - MC_v4.1.1_Release_Notes_Japanese.doc

(Microsoft Word - \221\346\202P\202U\201@\214i\212\317.doc)

1

私立大学等研究設備整備費等補助金(私立大学等

スライド 1

<4D F736F F D F4390B3208A948C E7189BB8CE F F8C668DDA97702E646F63>

注 雇 促 進 税 制 と 本 制 度 のどちらかを 利 する 可 能 性 があるが あらかじめどちらの 制 度 を 利 するか 判 断 できない という 場 合 雇 促 進 税 制 の 事 前 届 出 ( 雇 促 進 計 画 の 提 出 )をした 上 で 申 告 の 際 にどちらを 利 するかご

●電力自由化推進法案

<4D F736F F D208ED089EF95DB8CAF89C193FC8FF38BB CC8EC091D492B28DB88C8B89CA82C982C282A282C42E646F63>

Microsoft Word - TechSmith Deployment Tool Documentation.docx

容 積 率 制 限 の 概 要 1 容 積 率 制 限 の 目 的 地 域 で 行 われる 各 種 の 社 会 経 済 活 動 の 総 量 を 誘 導 することにより 建 築 物 と 道 路 等 の 公 共 施 設 とのバランスを 確 保 することを 目 的 として 行 われており 市 街 地 環

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

MapDK3のインストール

Microsoft Word - ML_ListManager_10j.doc

PowerPoint プレゼンテーション

目 次 1. 論 理 関 数 IF IF の 概 要 論 理 式 の 種 類 等 号 不 等 号 具 体 的 な 使 い 方 ネスト 複 数 の 条 件 を 記 述...

Ver 改 訂 日 付 改 訂 内 容 1

検 討 検 討 の 進 め 方 検 討 状 況 簡 易 収 支 の 世 帯 からサンプリング 世 帯 名 作 成 事 務 の 廃 止 4 5 必 要 な 世 帯 数 の 確 保 が 可 能 か 簡 易 収 支 を 実 施 している 民 間 事 業 者 との 連 絡 等 に 伴 う 事 務 の 複 雑

Oracle Text 概要

Microsoft Word - 養生学研究投稿規定(改)

XML形式の電子報告書作成に当たっての留意事項

研究者情報データベース

5-2.操作説明書(支店連携)_xlsx

H28記入説明書(納付金・調整金)8

4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10

募集新株予約権(有償ストック・オプション)の発行に関するお知らせ

SPARQL Finder設置方法

任意整理について | 多重債務Q&A | 公益財団法人 日本クレジットカウンセリング協会

目 次 利 用 に 際 しての 注 意 事 項... ユーザー 登 録... ログイン... 課 題 申 請... 5 装 置 予 約... 6 ライセンス 取 得 方 法... 7 利 用 料 金 の 確 認 ( 準 備 中 ) 外 部 発 表 登 録 の 方 法... 5 < 附

<4D F736F F D F93878CA797708F4390B3816A819A95CA8B4C976C8EAE91E682538B4C8DDA97E12E646F6378>

ーがサーバーにファイルをアップロードしたり ファイルを 電 子 メールで 送 信 したために) 利 用 できるようになった 場 合 手 動 で 転 送 されたこれらのファイルにアクセスするユーザーまたはデバイスに CAL は 必 要 ありません 以 下 の 例 では 特 定 の 製 品 について 説

Box-Jenkinsの方法

CSV_Backup_Guide

WebAlertクイックマニュアル

あいち電子調達共同システム

Mac OS Xでの利用設定 マニュアル

目 次 1. Web メールのご 利 用 について Web メール 画 面 のフロー 図 Web メールへのアクセス ログイン 画 面 ログイン 後 (メール 一 覧 画 面 ) 画 面 共 通 項 目

情報処理技能検定試験 表計算2級 手順書

職 員 の 平 均 給 与 月 額 初 任 給 等 の 状 況 (1) 職 員 の 平 均 年 齢 平 均 給 料 月 額 及 び 平 均 給 与 月 額 の 状 況 ( 平 成 年 月 1 日 現 在 ) 1 一 般 行 政 職 福 岡 県 技 能 労 務 職 歳 1,19,98 9,9 歳 8,

Microsoft Word - Active.doc

中国会社法の改正が外商投資企業に与える影響(2)

工事記録写真チェックシステム 操作説明書

RaQuest MindManager

税金読本(8-5)特定口座と確定申告

< E95FB8CF689638AE98BC689FC90B390A CC8CA992BC82B582C982C282A282C E90E096BE8E9E8E9197BF2E786477>

PowerPoint プレゼンテーション

<4D F736F F D F8D828D5A939982CC8EF68BC697BF96B38F9E89BB82CC8A6791E52E646F63>

<IE の 設 定 について> 従 来 版 をすでにご 利 用 の 方 の 場 合 互 換 表 示 設 定 がある 状 態 になっていると 思 わ れますので 必 ず 解 除 の 設 定 を 行 ってください 従 来 版 では IE の 10 以 上 では 互 換 表 示 設 定 が 必 要 でした

WEB版「新・相続対策マスター」(ご利用の手引き)

0 目 次 1. 畑 のあしあとの 使 い 方 P.3 2.オプション P.6 3.モバイルデバイスより 履 歴 取 得 P.8 4. 基 本 情 報 管 理 P 栽 培 計 画 P.22 6.ドキュメント 出 力 P 栽 培 履 歴 管 理 P.28 8.モバイルでの 栽

(Microsoft Word - \212\356\226{\225\373\220j _\217C\220\263\201j.doc)

は 固 定 流 動 及 び 繰 延 に 区 分 することとし 減 価 償 却 を 行 うべき 固 定 の 取 得 又 は 改 良 に 充 てるための 補 助 金 等 の 交 付 を 受 けた 場 合 にお いては その 交 付 を 受 けた 金 額 に 相 当 する 額 を 長 期 前 受 金 とし

購買ポータルサイトyOASIS簡易説明書 b

目 次 目 次 1 ログイン ログアウト ログインする...1 ログイン 画 面 が 表 示 されないときは?... 1 初 めてログインするときのパスワードは?... 2 初 期 パスワードを 忘 れてしまったときは?... 2 変 更 したパスワードを 忘 れてしまったときは?.

以 下 に 手 順 の 流 れを 記 載 します 3ページ 以 降 で 各 項 目 の 手 順 を 説 明 します ( をクリックすると 該 当 ページにジャンプします ) また 15ページに 汎 用 データ 受 入 に 関 する よくあるお 問 い 合 わせをご 紹 介 しています Step1 (

Ⅰ 調 査 の 概 要 1 目 的 義 務 教 育 の 機 会 均 等 その 水 準 の 維 持 向 上 の 観 点 から 的 な 児 童 生 徒 の 学 力 や 学 習 状 況 を 把 握 分 析 し 教 育 施 策 の 成 果 課 題 を 検 証 し その 改 善 を 図 るもに 学 校 におけ

一般競争入札について

の と す る (1) 防 犯 カ メ ラ を 購 入 し 設 置 ( 新 設 又 は 増 設 に 限 る ) す る こ と (2) 設 置 す る 防 犯 カ メ ラ は 新 設 又 は 既 設 の 録 画 機 と 接 続 す る こ と た だ し 録 画 機 能 付 防 犯 カ メ ラ は

1 変更の許可等(都市計画法第35条の2)

中 間 利 払 日 とし 預 入 日 または 前 回 の 中 間 利 払 日 からその 中 間 利 払 日 の 前 日 までの 日 数 および 通 帳 または 証 書 記 載 の 中 間 利 払 利 率 によって 計 算 した 中 間 利 払 額 ( 以 下 中 間 払 利 息 といいます )を 利

( 別 途 調 査 様 式 1) 減 損 損 失 を 認 識 するに 至 った 経 緯 等 1 列 2 列 3 列 4 列 5 列 6 列 7 列 8 列 9 列 10 列 11 列 12 列 13 列 14 列 15 列 16 列 17 列 18 列 19 列 20 列 21 列 22 列 固 定

経験発表

4 承 認 コミュニティ 組 織 は 市 長 若 しくはその 委 任 を 受 けた 者 又 は 監 査 委 員 の 監 査 に 応 じなければ ならない ( 状 況 報 告 ) 第 7 条 承 認 コミュニティ 組 織 は 市 長 が 必 要 と 認 めるときは 交 付 金 事 業 の 遂 行 の

Meet-Me Number/Pattern の 設定

Microsoft Word - ★HP版平成27年度検査の結果

一 括 登 録 方 法 一 括 登 録 をするには 予 め 専 用 の CSV ファイルを 作 成 する 必 要 があります 普 段 エクセルファイルで 管 理 をされている 方 は, 以 下 の 3 列 のみのデータとなるようにデータを 加 工 して CSV ファイルとして 保 存 して 下 さ

「1 所得税及び復興特別所得税の確定申告書データをお持ちの方」からの更正の請求書・修正申告書作成編

技術報告会原稿フォーマット

Transcription:

Data Mapper (a.k.a SQL Maps) Version 2.0 Developer Guide November 30, 2006 翻 訳 :ibatis マニュアル 日 本 語 訳 グループ (ibatis_manual_japanese_translation_group@googlegroups.com)

2 目 次 序 文...4 Data Mapper...4 インストール...6 1.x からのアップグレード...7 SQL マップ 設 定 ファイル...9 <properties>エレメント...10 <settings>エレメント...10 <resultobjectfactory>エレメント...13 <typealias>エレメント...14 <transactionmanager>エレメント...14 <datasource>エレメント...16 <sqlmap>エレメント...18 SQL Map XML ファイル...19 Mapped Statements...20 Statement の 種 類...20 The SQL...22 SQL フラグメントの 再 利 用...22 キーの 自 動 生 成...23 ストアドプロシージャ...24 Parameter Maps と インライン Parameters...30 インライン Parameter Maps...32 プリミティブ 型 Parameters...34 Map Type Parameters...34 置 き 換 え 文 字 列...35 Result Maps...35 暗 黙 的 な Result Maps...38 プリミティブ Results (すなわち. String, Integer, Boolean)...38 複 雑 な Properties (すなわち. ユーザ 定 義 クラスのプロパティ)...39 N+1 Select(1:1)を 回 避 する...40 複 雑 な Collection Properties...41 N+1 Selects を 回 避 する (1:M と M:N)...42 Composite キー または Multiple Complex パラメータプロパティ...43 サポートしている Parameter Maps と Result Maps の 型...45 Custom Type Handler の 作 成...46 Mapped Statement Results のキャッシュ...47 Read-Only vs. Read/Write...47 Serializable Read/Write Caches...47 Cache Types...49 動 的 な Mapped Statements...52 バイナリ 条 件 エレメント...53 シンプルな 動 的 SQL エレメント...57 Data Mapper によるプログラミング:The API...58 設 定...58 トランザクション...58 ibatis クラスローディング...62 バッチ...62

3 SqlMapClient API 経 由 でのステートメントの 実 行...64 SqlMap アクティビティのロギング...70 1 ページの JavaBeans コース...73 Resources (com.ibatis.common.resources.*)...75 リソースの 国 際 化...76 SimpleDataSource (com.ibatis.common.jdbc.*)...77

4 序 文 ibatis Data Mapper フレームワークは リレーショナルデータベースへアクセスするのに 必 要 な Java コードを 著 しく 減 少 させる 手 助 けをします ibatis は とてもシンプルな XML の 記 述 で JavaBeans を SQL ステートメントにマップします シンプルなのは 他 のフレームワークやオブ ジェクトリレーショナルツールよりも ibatis が 優 れているところです ibatis Data Mapper を 使 うには なじみやすい JavaBeans, XML と SQL だけが 必 要 です テーブルの 結 合 や 複 雑 なクエ リーを 実 行 するのに 複 雑 なスキーマを 必 要 しません Data Mapper を 使 用 することで 精 通 して いる SQL の 全 ての 機 能 が 利 用 できます Data Mapper (com.ibatis.sqlmap.*) コンセプト ibatis Data Mapper API は プログラマが JavaBeans のオブジェクトを PreparedStatement パラ メータと ResultSets に 簡 単 にマップできます Data Mapper の 考 え 方 は シンプルです コード の 20%だけを 使 用 して 80%の JDBC 機 能 を 提 供 するシンプルなフレームワークを 提 供 します どのように 動 作 するか? Data Mapper は XML を 使 用 して JavaBeans Map の 実 装 プリミティブラッパータイプ そして XML さえも SQL ステートメントにマップするためにシンプルなフレームワークを 提 供 します 下 記 は ライフサイクルの 高 レベルな 記 述 です: 1. JavaBean Map もしくはプリミティブラッパーのいずれかのオブジェクトをパラメ ータとして 提 供 してください パラメータオブジェクトは クエリー 内 の update ス テートメントまたは where 句 などの 入 力 値 として 使 用 されます 2. mapped statement を 実 行 します このステップは 魔 法 がおきるところです Data Mapper フレームワークは PreparedStatement インスタンスを 作 成 して 提 供 されたパ ラメータをセットし ResultSet から 結 果 オブジェクトを 構 築 します 3. 更 新 の 場 合 更 新 した 行 数 を 返 します 検 索 の 場 合 単 一 のオブジェクトかオブジェ クトのリストを 返 します パラメータのように 結 果 オブジェクトは JavaBean Map プリミティブラッパータイプ または XML になることができます

5 下 記 のダイアグラムは 記 述 したフローを 示 します Parameter Object (Input) SqlMap.x ml SqlMapConfig.xml SqlMap.x ml Result Object (Output) JavaBean JavaBean SQL Map Map (HashMap, TreeMap ) Mapped Statement Mapped Statement Mapped Statement Map (HashMap, TreeMap ) Primitive (Integer, Mapped Statement Mapped Statement Mapped Statement Mapped Statement Mapped Statement Mapped Statement Primitive (Integer, XML JDBC XML

6 インストール ibatis Data Mapper フレームワークのインストールは classpath に 適 切 なファイルを 単 に 置 く だけです JVM 起 動 時 に(java -cp 引 数 )で 指 定 するか Web アプリケーションの/WEB-INF/lib に 置 いてください Java classpath については 本 ドキュメントの 範 囲 外 となります もし Java か classpath(もしくは ともに) 不 慣 れであれば 下 記 のリソースを 参 照 してください: http://java.sun.com/j2se/1.4/docs/tooldocs/win32/classpath.html http://java.sun.com/j2se/1.4.2/docs/api/java/lang/classloader.html http://java.sun.com/j2se/1.4.2/docs/ ibatis は 下 記 の 単 一 の JAR ファイルで 配 布 されます ファイル 名 は この 形 になります: ibatis-version.build.jar 例 えば ibatis-2.3.0.677.jar となります 一 般 的 には この 単 一 の JAR ファイルをアプリケーションのクラスパスに 含 めれば 十 分 です JAR ファイルと 依 存 性 フレームワークが 多 くの 依 存 性 を 持 ちすぎると アプリケーションへの 組 み 込 みや 他 のフレーム ワークとの 連 携 が 難 しくなります 2.0 のキーポイントの1つは 依 存 性 の 管 理 と 減 少 です し たがって もし JDK1.4 で ibatis を 動 作 させるのであれば ibatis は 他 の 依 存 性 を 持 ちません オプショナルの JAR ファイルは 下 記 のウェブサイトからダウンロードできます それらは 機 能 によってカテゴライズされています 下 記 にオプショナルのパッケージが 必 要 な 時 をまとめて います 記 述 使 用 するとき 依 存 レガシー JDK サ ポート JDK1.4 より 前 の JDK を 利 用 し ていてアプリケーションサー バがこれらの JAR を 提 供 してい ない 時 にこれらのオプショナ ルのパッケージを 必 要 としま す JDBC 2.0 Extensions http://java.sun.com/products/jdbc/download.html JTA 1.0.1a http://java.sun.com/products/jta/ Xerces 2.4.0 http://xml.apache.org/xerces2-j/ ibatis 後 方 互 換 性 実 行 時 バイトコ ード 拡 張 データソース 実 装 ibatis の DAO フレームワーク (1.x) 使 用 しているか 古 い Data Mapper(1.x)を 使 用 していると きに 単 に JAR ファイルを 含 め るだけで 使 いつづけられます lazy loading とリフレクショ ンのパフォーマンスを 改 善 する ために CGLIB 2.0 を 有 効 にした い 時 Jakarta DBCP コネクションプ ールを 使 用 したい 時 ibatis DAO 1.3.1 http://sourceforge.net/projects/ibatisdb/ CGLIB 2.0 http://cglib.sf.net DBCP 1.1 http://jakarta.apache.org/commons/dbcp/ 分 散 キャッシン グ 集 中 もしくは 分 散 されたキ ャッシュサポートのために OSCache を 使 用 したい 時 OSCache 2.0.1 http://www.opensymphony.com/oscache/ ロギング Log4J ロギングを 使 用 したい 時 Log4J 1.2.8 http://logging.apache.org/log4j/docs/ ロギング Jakarta Commons Logging を 使 用 したい 時 Jakarta Commons Logging http://jakarta.apache.org/commons/logging

7 1.x からのアップグレード アップグレードすべきかどうか? アップグレードすべきかどうか 決 めるベストな 方 法 は それらを 試 すことです いくつかのアッ プグレードする 方 法 があります 1. バージョン 2.0 は 1.x リリースとほぼ 完 全 に 後 方 互 換 性 を 持 つようにメンテナンスされ ています そのため JAR ファイルを 単 に 置 き 換 えるだけで 十 分 な 人 もいます このアプ ローチは 最 もシンプルですがメリットが 一 番 少 ないです XML ファイル または Java コードを 変 更 する 必 要 がありません 非 互 換 性 がいくつか 見 付 かるかもしれません 2. 二 つ 目 のオプションは XML ファイルを 2.0 の 仕 様 に 変 換 することです しかし 1.x Java API を 使 いつづけなければなりません いくつかのマッピングファイル 間 で 互 換 性 の 問 題 が 発 生 するかもしれませんが 安 全 な 解 決 策 です 下 記 に 記 述 している XML を 変 換 するための Ant タスクはフレームワークに 含 まれています 3. 三 つ 目 のオプションは (2.と 同 じく)XML ファイルの 変 換 と Java コードの 変 換 をする ことです Java コードの 変 換 ツールはないので 手 作 業 で 変 換 しなければなりません 4. 最 後 のオプションは アップグレードをしないことです アップグレードが 困 難 であれ ば 1.x リリースで 動 作 しているシステムをそのままにします 1.x アプリケーションを 離 れて 新 しいアプリケーションのみ 2.0 ではじめることは 悪 いアイデアではないかもしれ ません もちろん いずれにしろ 古 いアプリケーションに(ある 基 準 以 上 の) 大 規 模 な リファクタリングがされる 予 定 ならば Data Mapper のアップグレードも 同 様 に 行 った 方 が 良 いかもしれません 1.X から 2.X への XML 設 定 ファイルの 変 換 2.0 フレームワークは Ant で 動 作 させる XML ドキュメントコンバータを 含 んでいます XML ドキ ュメントを 変 換 することは 1.x コードが 自 動 的 にすぐさま 古 い XML ファイルを 自 動 的 に 変 換 す るため 完 全 に 任 意 です しかしながら ひとまずアップグレードに 不 安 がないのであればファイ ルを 変 換 させることは 良 い 考 えです (1.x Java API を 使 いつづけたとしても)いくつかの 互 換 性 の 問 題 をくぐりぬければ 新 機 能 のアドバンテージを 得 られます build.xml の Ant タスクは 以 下 のようになります: <taskdef name="convertsqlmaps" classname="com.ibatis.db.sqlmap.upgrade.converttask" classpathref="classpath"/> <target name="convert"> <convertsqlmaps todir="d:/targetdirectory/" overwrite="true"> <fileset dir="d/sourcedirectory/"> <include name="**/maps/*.xml"/> </fileset> </convertsqlmaps> </target> ご 覧 のとおり Ant Copy タスクと 同 じような 働 きをします そして 実 際 の 所 Ant タスクを 拡 張 し ています だから Copy タスクでできることは 行 うことができます ( 詳 細 については Ant Copy タスクのドキュメントを 参 照 してください )

8 JAR ファイル: 古 きを 捨 て 新 しきを 得 る アップグレードする 時 に ( 古 い)iBATIS ファイルを 削 除 して 新 しいファイルに 置 き 換 えることは 良 い 考 えです 他 のコンポーネント もしくはフレームワークがまだ 古 い JAR ファイルを 必 要 と していないか 確 認 してください JAR ファイルのほとんどは 状 況 に 応 じて 任 意 の 依 存 であるこ とに 気 を 付 けてください JAR ファイルと 依 存 に 関 する 詳 細 情 報 は 上 記 の 説 明 を 見 てください 古 い JAR ファイルと 新 しい JAR ファイルを 下 記 のテーブルにまとめています 古 いファイル ibatis-db.jar 新 しいファイル Ibatis-version.build.jar ( 必 須 ) 1.2.9b リリース 以 降 このファイルは 下 記 の3つ のファイルに 分 割 されました ibatis-common.jar ibatis-dao.jar ibatis-sqlmap.jar commons-logging.jar commons-logging-api.jar commons-collections.jar commons-dbcp.jar commons-pool.jar oscache.jar jta.jar jdbc2_0-stdext.jar xercesimpl.jar xmlparserapis.jar jdom.jar commons-logging-1-0-3.jar (オプショナル) commons-collections-2-1.jar (オプショナル) commons-dbcp-1-1.jar (オプショナル) commons-pool-1-1.jar (オプショナル) oscache-2-0-1.jar (オプショナル) jta-1-0-1a.jar (オプショナル) jdbc2_0-stdext.jar (オプショナル) xercesimpl-2-4-0.jar (オプショナル) xmlparserapis-2-4-0.jar (オプショナル) xalan-2-5-2.jar (オプショナル) log4j-1.2.8.jar (オプショナル) cglib-full-2-0-rc2.jar (オプショナル) ガイドの 残 りは Data Mapper フレームワークの 使 い 方 を 紹 介 します

9 SQL マップ 設 定 ファイル (/dtd/sql-map-config-2.dtd) Data Mapper は データソースの 詳 細 設 定 Data Mapper とスレッド 管 理 のような 他 のオプショ ンを 設 定 するために XML 設 定 ファイルを 用 いて 設 定 を 行 います 下 記 は SQL マップ 設 定 ファ イルの 例 です : SqlMapConfig.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmapconfig PUBLIC "-//ibatis.apache.org//dtd SQL Map Config 2.0//EN" "/dtd/sql-map-config-2.dtd"> <!-- Always ensure to use the correct XML header as above! --> <sqlmapconfig> <!-- The properties (name=value) in the file specified here can be used placeholders in this config file (e.g. ${driver}. The file is relative to the classpath and is completely optional. --> <properties resource=" examples/sqlmap/maps/sqlmapconfigexample.properties " /> <!-- These settings control SqlMapClient configuration details, primarily to do with transaction management. They are all optional (more detail later in this document). --> <settings cachemodelsenabled="true" enhancementenabled="true" lazyloadingenabled="true" maxrequests="128" maxsessions="10" maxtransactions="5" usestatementnamespaces="false" defaultstatementtimeout="5" statementcachingenabled="true" classinfocacheenabled="true" /> <!-- This element declares a factory class that ibatis will use for creating result objects. This element is optional (more detail later in this document). --> <resultobjectfactory type="com.mydomain.myresultobjectfactory" > <property name="someproperty" value="somevalue"/> </resultobjectfactory> <!-- Type aliases allow you to use a shorter name for long fully qualified class names. --> <typealias alias="order" type="testdomain.order"/> <!-- Configure a datasource to use with this SQL Map using SimpleDataSource. Notice the use of the properties from the above resource --> <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="true" /> <property name="pool.maximumactiveconnections" value="10"/> <property name="pool.maximumidleconnections" value="5"/>

10 <property name="pool.maximumcheckouttime" value="120000"/> <property name="pool.timetowait" value="500"/> <property name="pool.pingquery" value="select 1 from ACCOUNT"/> <property name="pool.pingenabled" value="false"/> <property name="pool.pingconnectionsolderthan" value="1"/> <property name="pool.pingconnectionsnotusedfor" value="1"/> </datasource> </transactionmanager> <!-- Identify all SQL Map XML files to be loaded by this SQL map. Notice the paths are relative to the classpath. For now, we only have one --> <sqlmap resource="examples/sqlmap/maps/person.xml" /> </sqlmapconfig> このドキュメントの 下 記 のセクションで SQL Map 設 定 ファイルのさまざまな 説 明 をしています <properties>エレメント SQL Map は SQL Map 設 定 ファイルと 関 連 する 標 準 の Java プロパティ( 名 前 = 値 )を 受 け 入 れる 一 つの<properties>エレメントを 持 つことができます プロパティファイルの 名 前 付 けされた 値 は SQL Map 設 定 ファイルと 全 ての Data Mapper の 中 で 参 照 できるようになります 例 えば プロパ ティファイルが 下 記 を 含 んでいるとします : driver=org.hsqldb.jdbcdriver 設 定 ドキュメントによって 参 照 される SQL Map 設 定 ファイルか SQL Map は org.hsqldb.jdbcdriver と 置 き 換 えられるプレースホルダーを 使 用 できます 例 えば: <property name="jdbc.driver" value="${driver}"/> これは ビルド テスト デプロイに とても 便 利 です 複 数 の 環 境 のリコンフィグや( 例.Ant) 設 定 のための 自 動 化 ツールの 使 用 を 容 易 にします プロパティファイルは classpath(resource 属 性 を 使 う)または 特 定 の 有 効 な URL(url 属 性 を 使 う)からロードできます 下 記 は 固 定 パス ファイルをロードして 使 用 する 例 です : <properties url= file:///c:/config/my.properties /> <settings>エレメント <settings>エレメントは 様 々なオプションの 設 定 と XML ファイルを 使 用 して 構 築 する SqlMapClient の 最 適 化 をできます settings エレメントと 全 ての 属 性 は 完 全 に 任 意 です サポートされている 属 性 と 振 舞 いを 下 記 のテーブルに 記 述 します : maxrequests これは 一 度 に SQL を 実 行 するスレッドの 最 大 数 です 最 大 数 を 超 えるスレッドは 別 のスレッドが 完 全 に 実 行 するまでブロック されます DBMS ごとに 異 なる 制 限 を 持 ちますが 制 限 を 持 たない データベースはありません 通 常 最 低 でも maxtransaction( 下 記 参 照 )の 10 倍 とします この 値 は 常 に maxsession と maxtransaction より 大 きくします 同 時 リクエスト 数 の 最 大 数 を 減 らすとパフォーマンスの 向 上 が よく 見 受 けられます サンプル: maxrequests= 256 デフォルト: 512

11 maxsessions maxtransactions cachemodelsenabled lazyloadingenabled enhancementenabled usestatementnamespaces 一 時 にアクティブになることができるセッション(もしくはクラ イアント)の 数 です セッションは プログラム 的 に 要 求 した 明 示 的 なセッションか( 例 :ステートメントの 実 行 まで) SqlMapClient インスタンスが 使 うスレッドです この 値 は maxtransaction 以 上 の 値 で maxrequest より 小 さい 値 を 常 に 指 定 するべきです 同 時 セッションの 最 大 数 を 減 らすとメモリ 占 有 量 を 減 少 させることができます サンプル: maxsessions= 64 デフォルト: 128 一 度 に SqlMapClient.startTransaction()に 入 ることができるス レッドの 最 大 数 最 大 数 以 上 のスレッドは 他 のスレッドが 存 在 している 間 ブロックされます 異 なる DBMS は 異 なる 制 限 を 持 ちます しかし それらの 制 約 を 持 たないデータベースはありま せん この 値 は 常 に maxsession 以 下 でかつ maxrequest より も とても 少 なくなければなりません 最 大 同 時 トランザクショ ン 数 を 減 らすことで しばしばパフォーマンスを 向 上 させること ができます サンプル: maxtransactions= 16 デフォルト: 32 この 設 定 は SqlMapClient のための 全 てのキャッシュモデルを 全 体 的 に 有 効 または 無 効 にします デバッグに 役 立 てることがで きます サンプル: cachemodelsenabled= true デフォルト: true (enabled) この 設 定 は SqlMapClient のための 全 ての lazy loading を 全 体 的 に 有 効 または 無 効 にします デバッグに 役 立 てることができ ます サンプル: lazyloadingenabled= true デフォルト: true (enabled) この 設 定 は lazy loading 拡 張 をするだけではなく 容 易 に 最 適 化 した JavaBeans プロパティアクセスするための 実 行 時 のバイト コード 拡 張 を 有 効 にします サンプル: enhancementenabled= true デフォルト: false (disabled) この 設 定 が 有 効 であれば 常 に SqlMap 名 とステートメント 名 の 完 全 修 飾 子 でマップされたステートメントを 参 照 しなければなり ません 例 : queryforobject( sqlmapname.statementname ); サンプル: usestatementnamespaces= false デフォルト: false (disabled)

12 defaultstatementtimeout (ibatis 2.2.0 以 降 ) classinfocacheenabled この 設 定 は 全 てのステートメントのための JDBC クエリータイ ムアウトとして 適 用 される integer の 値 この 値 は マップされ たステートメントの statement の 属 性 値 で 上 書 きできます この 値 を 指 定 しなければマップされたステートメントの statement 属 性 で 上 書 きしない 限 りクエリータイムアウトはセ ットされません 指 定 した 値 は ドライバがステートメントの 実 行 まで 待 てる 秒 数 です 全 てのドライバがこの 設 定 をサポートし てないことに 注 意 してください この 設 定 が 有 効 であれば ibatis は キャッシュされたクラスを 維 持 します もし 多 くのクラスが 再 利 用 されるのであれば 起 動 時 間 の 大 幅 な 減 少 をもたらすでしょう statementcachingenabled (ibatis 2.3.0 以 降 ) サンプル: classinfocacheenabled= true デフォルト: true (enabled) この 設 定 が 有 効 であれば ibatis は prepared statements のロ ーカルキャッシュを 維 持 します これは 大 幅 なパフォーマンス の 改 善 をもたらすことができます サンプル: statementcachingenabled= true デフォルト: true (enabled)

13 <resultobjectfactory>エレメント Important: この 機 能 は ibatis バージョン 2.2.0 以 降 で 利 用 可 能 です resultobjectfactory エレメントは SQL ステートメントの 実 行 結 果 からクラスを 作 成 するため のファクトリクラスを 指 定 できます このエレメントはオプショナルです エレメントを 指 定 し なければ ibatis は 結 果 オブジェクトを 作 成 するために 内 部 メカニズム (class.newinstance())を 使 うでしょう これらのケースにおいて ibatis は 結 果 オブジェクトを 作 成 します 1. ResultSet から 返 された 行 をマップする 時 ( 最 も 共 通 したケース) 2. resultmap の 中 の result エレメントでネストした select ステートメントを 使 用 する 時 もし ネストした select ステートメントで parameterclass を 宣 言 していれば ネスト した select ステートメントを 実 行 する 前 に ibatis はクラスのインスタンスを 作 成 代 入 して 利 用 可 能 にします 3. ストアドプロシージャを 実 行 する 時 ibatis は OUTPUT パラメータのオブジェクトを 作 成 します 4. ネストした result map を 処 理 する 時 ネストした result map が N+1 クエリーを 回 避 す るために groupby サポートを 同 時 に 使 用 するのであれば オブジェクトは 通 常 Collection, List, Set の 実 装 クラスとなります もし 望 むのであれば それらのイン タフェースのカスタム 実 装 を resultobjectfactory を 通 じて 提 供 できます ネストした result map と 1:1 で 結 合 する 場 合 において ibaits は このファクトリを 通 じて 指 定 し たドメインオブジェクトのインスタンスを 作 成 します ファクトリの 実 装 を 選 択 するのであればファクトリクラスは com.ibatis.sqlmap.engine.mapping.result.resultobjectfactory を 実 装 しなければなりません そして ファクトリの 実 装 クラスは public なデフォルトコンストラクタを 持 たなければなりま せん ResultObjectFactory インタフェースは 2 つのメソッドを 持 ちます 1 つはオブジェクト の 作 成 そして あと 1 つは 設 定 で 指 定 されたプロパティ 値 を 受 け 入 れます 例 えば resultobjectfactory の 設 定 エレメントは このように 指 定 します: <resultobjectfactory type="com.mydomain.myresultobjectfactory" > <property name="someproperty" value="somevalue"/> </resultobjectfactory> それから result object factory クラスのコードは 以 下 のようにするべきでしょう: package com.mydomain; import com.ibatis.sqlmap.engine.mapping.result.resultobjectfactory; public class MyResultObjectFactory implements ResultObjectFactory { public MyResultObjectFactory() { super(); } public Object createinstance(string statementid, Class clazz) throws InstantiationException, IllegalAccessException { } // create and return instances of clazz here... public void setproperty(string name, String value) { // save property values here... }

14 } 設 定 において ibatis は 各 プロパティを 指 定 するために 一 度 setproperty メソッドを 呼 び 出 します createinstance メソッドが いずれかの 呼 出 しで 処 理 される 前 に 全 てのプロパティは セットされます ibatis は 上 記 のオブジェクトの 作 成 が 必 要 なケースに 都 度 createinstance メソッドを 呼 び 出 します もし createinstance から null が 返 されたら ibatis は 通 常 の 方 法 (class.newinstance())を 使 用 してオブジェクトの 作 成 を 試 みます もし java.util.collection か java.util.list の 作 成 要 求 から null が 返 された 場 合 ibatis は java.util.arraylist を 作 成 します ibatis は オブジェクト 作 成 要 求 があったコンテキストに 現 在 のステートメント id を 知 らせます <typealias>エレメント typealias エレメントは 完 全 修 飾 された 長 いクラス 名 を 指 定 した 短 い 名 前 で 参 照 できるよう にします 例 : <typealias alias="shortname" type="com.long.class.path.class"/> SQL Map Config ファイルで いくつかのエイリアスが 事 前 に 定 義 されています 事 前 定 義 されているものは 以 下 です: トランザクションマネージャ エイリアス JDBC com.ibatis.sqlmap.engine.transaction.jdbc.jdbctransactionconfig JTA com.ibatis.sqlmap.engine.transaction.jta.jtatransactionconfig EXTERNAL com.ibatis.sqlmap.engine.transaction.external.externaltransactionconfig データソースファクトリ エイリアス SIMPLE com.ibatis.sqlmap.engine.datasource.simpledatasourcefactory DBCP com.ibatis.sqlmap.engine.datasource.dbcpdatasourcefactory JNDI com.ibatis.sqlmap.engine.datasource.jndidatasourcefactory <transactionmanager>エレメント 1.0 変 換 時 の 注 意 点 :Data Mapper 1.0 は 複 数 のデータソース 設 定 が 許 可 されていました これは 扱 いにくく 悪 いプラクティスを 招 きました 従 って 2.0 は 単 一 のデータソースのみ 使 用 可 能 となっています 複 数 の 配 備 / 設 定 には システムごとに 異 なる 設 定 または SQL Map を 作 成 するときパラメータとして 複 数 のプロパティファイルを 使 用 することを 推 奨 しま す ( 下 記 の Java API セクション 参 照 ) <transactionmanager>エレメントは SQL Map のためにトランザクション 管 理 サービスを 設 定 で きます type 属 性 に 使 用 するトランザクションマネージャを 指 定 します その 値 は クラス 名 か typealias を 指 定 できます JDBC, JTA, EXTERNAL の 3 つのトランザクションマネージャは フレームワークに 含 まれています JDBC Connection の commit()と rollback()メソッド 経 由 で JDBC トランザクションコ ントロールが 可 能 です JTA このトランザクションマネージャは ( 他 のデータベースまたは トランザクシ ョンリソースを 含 めることができる) 広 いトランザクションスコープの 一 部 として SQL Map を 含 むことができる JTA グローバルトランザクションを 使 用 します この 設 定 は JNDI リソースから user transaction を 見 つけられる UserTransation プロパティセット を 必 要 とします この 設 定 のサンプルは 下 記 の JNDI データソースサンプルを 見 てくだ さい

15 EXTERNAL 自 分 自 身 で トランザクションを 管 理 することを 可 能 にします データソー スの 設 定 をできますが トランザクションは フレームワークライフサイクルの 一 部 と してコミット またはロールバックされません これは Data Mapper の 外 部 のアプリケ ーションの 一 部 でトランザクションを 管 理 しなくてはならないことを 意 味 します この 設 定 も( 例. 読 み 取 り 専 用 )トランザクションがないデータベースの 役 に 立 ちます <transactionmanager>エレメントは true か false となるオプショナルの commitrequired 属 性 も 使 用 できます 通 常 ibatis は insert, update, delete 操 作 を 実 行 しない 限 りトランザクシ ョンを commit しません これは 明 示 的 に committransaction()メソッドを 読 んだとしてもです この 振 舞 は いくつかのケースにおいて 問 題 があります もし insert,update, delete 操 作 しな くても 常 にトランザクションを commit したいのであれば commitrequired 属 性 を true をセット してください この 属 性 が 便 利 なときの 例 : 1. 更 新 の 結 果 行 を 返 し かつデータを 更 新 するストアドプロシージャを 呼 出 したい 時 こ のケースにおいて queryforlist() 操 作 で そのプロシージャを 呼 び 出 します そのた め ibatis は 通 常 そのトランザクションをコミットしません そのために その 更 新 は ロールバックされます 2. WebSphere 環 境 で コネクションプールと JNDI<datasource>と JDBC か JTA トランザクシ ョンを 使 用 するケース WebSphere は プールされたコネクションにおける 全 てのトラン ザクションをコミットすることが 必 要 です さもなければコネクションはプールに 戻 り ません EXTERNAL トランザクションマネージャを 使 っている 時 は commitrequired 属 性 の 効 果 がないこ とに 気 を 付 けてください いくつかのトランザクションマネージャは 設 定 ファイルの 拡 張 が 可 能 です 下 記 のテーブルは それらのトランザクションマネージャで 利 用 可 能 な 拡 張 プロパティを 記 述 しています トランザクショ ンマネージャ プロパティ EXTERNAL プロパティ 説 明 DefaultAutoCommit true であれば もしベースとなるデータソースによっ て 値 が 提 供 されていないとしても 各 トランザクショ ンのベースとなるコネクションに 対 して setautocommit(true)が 呼 び 出 されます false か 指 定 されていないければ もしベースとなる データソースによって 値 が 提 供 されていないとしても 各 トランザクションのベースとなるコネクションに 対 して setautocommit(false)が 呼 び 出 されます この 振 舞 いは SetAutoCommitAllowed プロパティで 上 書 きできます SetAutoCommitAllowed true か 指 定 されていなければ DefaultAutoCommit プロパティで 指 定 されている 動 作 となります false であれば ibatis は いかなるケースにおいて も setautocommit を 呼 び 出 しません WebSphere のよ うにいかなる 状 況 でも setautocommit メソッドを 呼 び 出 すべきでない 環 境 で 役 に 立 ちます

16 トランザクショ ンマネージャ プロパティ JTA プロパティ 説 明 UserTransaction このプロパティは 必 須 です user transaction の 値 多 くのケースでは java:comp/usertransaction をセットするべきこ とに 注 意 してください <datasource>エレメント トランザクションマネージャの 一 部 として 含 まれているのは datasource エレメントと SQL Map のために 使 われるデータソースを 設 定 するプロパティのセットです 現 在 フレームワークと 一 緒 に 3 つのデータソースファクトリが 提 供 されています しかし 独 自 のファクトリを 作 成 する こともできます 含 まれている DataSourcefactory の 実 装 は 以 降 でそれぞれの 詳 細 を 説 明 して います そして それぞれの 設 定 例 を 記 しています SimpleDataSourceFactory SimpleDataSourceFactoryは コンテナが 提 供 するデータソースがないケースにおいて プールしたデータソースの 基 本 的 な 実 装 を 提 供 します それは ibatis SimpleDataSourceコネクションプール 実 装 をベースにしています <transactionmanager type="jdbc"> <datasource type="simple"> <property name="jdbc.driver" value="org.postgresql.driver"/> <property name="jdbc.connectionurl" value="jdbc:postgresql://server:5432/dbname"/> <property name="jdbc.username" value="user"/> <property name="jdbc.password" value="password"/> <!-- OPTIONAL PROPERTIES BELOW --> <property name="jdbc.defaultautocommit" value="false"/> <property name="pool.maximumactiveconnections" value="10"/> <property name="pool.maximumidleconnections" value="5"/> <property name="pool.maximumcheckouttime" value="120000"/> <property name="pool.timetowait" value="10000"/> <property name="pool.pingquery" value="select * from dual"/> <property name="pool.pingenabled" value="false"/> <property name="pool.pingconnectionsolderthan" value="0"/> <property name="pool.pingconnectionsnotusedfor" value="0"/> <property name="driver.driverspecificproperty" value="somevalue"/> </datasource> </transactionmanager> Driver プレフィックスを 持 つプロパティに 気 を 付 けてください それらは JDBCド ライバの 基 本 的 なプロパティに 追 加 されます DbcpDataSourceFactory この 実 装 は DataSource APIを 経 由 してコネクションプーリングサービスを 提 供 するた めにJakarta DBCP(データベースコネクションプール)を 使 用 します このデータソース は アプリケーション/webコンテナがデータソースを 実 装 していない 時 か スタンドア ロンアプリケーションを 動 作 させるためのものです 設 定 において 希 望 する 指 定 DBCPプ ロパティを 指 定 することによってiBATISは DBCPデータソースのプロパティへの 直 接 的 なアクセスを 提 供 します 例 えば:

17 <transactionmanager type="jdbc"> <datasource type="dbcp"> <property name="driverclassname" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <!-- OPTIONAL PROPERTIES BELOW --> <property name="maxactive" value="10"/> <property name="maxidle" value="5"/> <property name="maxwait" value="60000"/> <!-- Use of the validation query can be problematic. If you have difficulty, try without it. --> <property name="validationquery" value="select * from ACCOUNT"/> <property name="logabandoned" value="false"/> <property name="removeabandoned" value="false"/> <property name="removeabandonedtimeout" value="50000"/> <property name="driver.driverspecificproperty" value="somevalue"/> </datasource> </transactionmanager> 利 用 可 能 な 全 てのプロパティは ここから 参 照 できます: http://jakarta.apache.org/commons/dbcp/configuration.html Driver プレフィックスを 持 つプロパティに 気 を 付 けてください それらはJDBCドラ イバの 基 本 的 なプロパティに 追 加 されます ibatisは 下 記 の 柔 軟 ではないレガシー 設 定 オプションもサポートしています しかし ながら 上 記 の 設 定 オプションの 使 用 を 推 奨 します <transactionmanager type="jdbc"> <!-- Legacy DBCP Configuration --> <datasource type="dbcp"> <property name="jdbc.driver" value="${driver}"/> <property name="jdbc.connectionurl" value="${url}"/> <property name="jdbc.username" value="${username}"/> <property name="jdbc.password" value="${password}"/> <!-- OPTIONAL PROPERTIES BELOW --> <property name="pool.maximumactiveconnections" value="10"/> <property name="pool.maximumidleconnections" value="5"/> <property name="pool.maximumwait" value="60000"/> <!-- Use of the validation query can be problematic. If you have difficulty, try without it. --> <property name="pool.validationquery" value="select * from ACCOUNT"/> <property name="driver.driverspecificproperty" value="somevalue"/> </datasource> </transactionmanager> 示 されたプロパティは レガシー 設 定 オプションを 使 用 している 時 だけ ibatisに 認 識 されるプロパティです Driver プレフィックスを 持 つプロパティに 気 を 付 けてく ださい それらはJDBCドライバの 基 本 的 なプロパティに 追 加 されます JndiDataSourceFactory この 実 装 は コンテナのJNDIコンテキストからデータソースの 実 装 を 利 用 します これ は アプリケーションサーバからコネクションプールが 提 供 されている 場 合 に 標 準 的 に 使 用 されます JDBC DataSource 実 装 にアクセスする 標 準 的 な 方 法 は JNDIを 経 由 する 方 法 です JndiDataSourceFactoryは JNDI 経 由 でデータソースにアクセスするための

18 機 能 を 提 供 します データソースの 設 定 において 指 定 しなければならない 設 定 パラメ ータは 以 下 です: <transactionmanager type="jdbc" > <datasource type="jndi"> <property name="datasource" value="java:comp/env/jdbc/jpetstore"/> </datasource> </transactionmanager> 上 記 の 設 定 は 通 常 のトランザクション 管 理 を 使 用 します しかし コンテナが 管 理 す るリソースで 下 記 のようにグローバルなトランザクションを 設 定 したいかもしれませ ん <transactionmanager type="jta" > <property name="usertransaction" value="java:/comp/usertransaction"/> <datasource type="jndi"> <property name="datasource" value="java:comp/env/jdbc/jpetstore"/> </datasource> </transactionmanager> UserTransaction プロパティは UserTransaction インスタンスを 見 つけられる JNDI の ロケーションを 指 し 示 します Sql Map が 他 のデータベースとトランザクショナルリソー スを 巻 き 込 めるスコープの 広 いトランザクションに 参 加 するために JTA トランザクショ ン 管 理 は 必 須 です context プレフィックスを 持 つプロパティを 追 加 することによって lookup の 前 に JNDI コンテキストプロパティに 追 加 できます 例 : <property name= context.java.naming.provider.url value= ldap://somehost:389 /> <sqlmap>エレメント sqlmapエレメントは SQL Mapまたは 別 のSQL Map 設 定 ファイルを 明 示 的 に 含 めるために 使 わ れます それぞれのSQL Map XMLファイルは SqlMapClientインスタンスによって 使 われるため に 宣 言 する 必 要 があります SQL Map XMLファイルは classpath もしくはURLからストリーム リソースとしてロードされます (ある 限 りの)ありとあらゆるData Mapperを 指 定 しなければ なりません 下 記 は サンプルです: <!-- CLASSPATH RESOURCES --> <sqlmap resource="com/ibatis/examples/sql/customer.xml" /> <sqlmap resource="com/ibatis/examples/sql/account.xml" /> <sqlmap resource="com/ibatis/examples/sql/product.xml" /> <!-- URL RESOURCES --> <sqlmap url="file:///c:/config/customer.xml " /> <sqlmap url="file:///c:/config/account.xml " /> <sqlmap url="file:///c:/config/product.xml" /> 次 のいくつかのセクションで SQL Map XML ファイルの 構 造 を 詳 しく 記 述 します

19 SQL Map XML ファイル ( /dtd/sql-map-config-2.dtd) 上 記 の 例 で Data Mapper の 最 もシンプルな 形 を 見 ました SQL Map ドキュメント 構 造 で 利 用 で きる 他 のオプションがあります これは より 多 くの 機 能 を 使 用 する mapped statement の 例 で す <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.apache.org//dtd SQL Map 2.0//EN" "/dtd/sql-map-2.dtd"> <sqlmap namespace= Product > </sqlmap> <cachemodel id= productcache type= LRU > <flushinterval hours= 24 /> <property name= size value= 1000 /> </cachemodel> <typealias alias= product type= com.ibatis.example.product /> <parametermap id= productparam class= product > <parameter property= id /> </parametermap> <resultmap id= productresult class= product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> </resultmap> <select id= getproduct parametermap= productparam resultmap= productresult cachemodel= product-cache > select * from PRODUCT where PRD_ID =? </select> 多 すぎますか?フレームワークは 多 くのことをしているにも 関 わらず シンプルな select ス テートメントのために 多 くの 余 分 なこと(XML)をしているように 見 えるかもしれません 心 配 しないでください 以 下 は 上 記 を 簡 単 にしたバージョンです <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.apache.org//dtd SQL Map 2.0//EN" "/dtd/sql-map-2.dtd"> <sqlmap namespace= Product > </sqlmap> <select id= getproduct parameterclass= com.ibatis.example.product resultclass= com.ibatis.example.product > select PRD_ID as id, PRD_DESCRIPTION as description from PRODUCT where PRD_ID = #id# </select> 現 在 これらのステートメントは SQL Map の 振 舞 いにおいて 全 く 同 じではありません 始 めに 後 者 のステートメントは キャッシュを 定 義 していません その 為 に 全 てのリクエストはデー

20 タベースに 発 行 されます 次 に 後 者 はオーバーヘッドを 伴 うフレームワークの 自 動 マッピング 機 能 を 利 用 しています しかしながら 2つのステートメントともに Java コードから 同 じよう に 実 行 されます 従 ってシンプルなやり 方 で 始 めて より 詳 細 なマッピングが 必 要 となった 時 に 移 行 できます 最 もシンプルなソリューション 始 めることは 最 近 の 方 法 論 においてはベストプ ラクティスです 単 一 の SQL Map XML ファイルは 多 くのセッションモデル parameter map Result Map とステ ートメントを 含 むことができます アプリケーションのために ふさわしいステートメントとマ ップを 組 織 化 ( 論 理 的 なグループと)してください Mapped Statements Data Mapper のコンセプトは mapped statements を 中 心 としています Mapped statements は parameter map( 入 力 )と Result Map( 出 力 )を 持 つ SQL ステートメントを 構 成 することことができ ます シンプルなケースであれば パラメータと 結 果 を 直 接 マップされたステートメントに 設 定 できます mapped statement マップされたステートメントは メモリでキャッシュしている 一 般 的 な 結 果 にキャッシュモデルを 使 うように 設 定 することもできます <statement id= statementname [parameterclass= some.class.name ] [resultclass= some.class.name ] [parametermap= nameofparametermap ] [resultmap= nameofresultmap ] [cachemodel= nameofcache ] [timeout= 5 ]> select * from PRODUCT where PRD_ID = [? #propertyname#] order by [$simpledynamic$] </statement> ステートメントは insert, update, delete, select, procedure もしくは statement となり ます 上 記 のステートメントにおいて[]で 示 されている 箇 所 はオプションの 設 定 です そして いくつかのケースにおいては 組 み 合 わせて 使 用 することもできます ルールに 則 りシンプルな 形 でマップされたステートメントは このようになります : <insert id= inserttestproduct > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (1, Shih Tzu ) </insert> 上 記 の 例 では 明 示 的 でありませんが 任 意 の SQL を 実 行 するために SQL Map フレームワークを 簡 単 に 使 用 したいのであれば 便 利 です しかしながら parameter map と Result Map を 使 用 して JavaBeans マッピング 機 能 を 使 用 することは 本 当 の 力 であってより 一 般 的 です 以 降 のセクシ ョンで 構 造 と 属 性 そして それらがどのように mapped statement に 影 響 するのかについて 記 述 します Statement の 種 類 <statment>エレメントは SQL ステートメントのどの 種 類 でも 使 用 することが 一 般 的 な catch all ステートメントです 一 般 的 に 一 つ 以 上 の statement エレメントを 指 定 するには 良 い 考 えです より 特 化 したエレメントは より 直 感 的 な XML DTD と 通 常 の<statement>ではできない 追 加 機 能 を 提 供 します 下 記 のテーブルは statement エレメントとそれらがサポートする 属 性 と 機 能 をまとめたものです :

21 ステートメント エ レメント <statement> <insert> <update> <delete> <select> <procedure> 属 性 子 要 素 メソッド id parameterclass resultclass parametermap resultmap cachemodel resultsettype fetchsize xmlresultname remapresults timeout id parameterclass parametermap timeout id parameterclass parametermap timeout id parameterclass parametermap timeout id parameterclass resultclass parametermap resultmap cachemodel resultsettype fetchsize xmlresultname remapresults timeout id parameterclass resultclass parametermap resultmap cachemodel fetchsize xmlresultname remapresults timeout All dynamic elements All dynamic elements <selectkey> All dynamic elements All dynamic elements All dynamic elements All dynamic elements insert update delete All query methods insert update delete insert update delete insert update delete All query methods insert update delete All query methods

22 The SQL SQL は 明 らかにマップの 中 で 最 も 重 要 な 部 分 です データベースと JDBC ドライバで 有 効 な SQL を 使 用 できます どんなファンクションも 利 用 可 能 です そして ドライバがサポートしていれ ば 複 数 のステートメントさえ 送 ることができます 単 一 のドキュメントに SQL と XML を 混 ぜるの で 特 別 な 意 味 をもつ 文 字 の 意 味 が 重 複 してしまいます 最 も 共 通 しているのは 大 なり 小 なり(< >)シンボルです それらは SQL においても 必 須 ですし XML タグの 予 約 シンボルです 簡 単 な 解 決 策 は 他 の 特 別 な XML タグでくくり SQL に 記 述 することです 標 準 的 な XML CDATA セクション を 使 用 することによって 特 別 な 文 字 として 解 釈 させないことで 解 決 できます 例 えば: <select id="getpersonsbyage" parameterclass= int resultclass="examples.domain.person"> SELECT * FROM PERSON WHERE AGE <![CDATA[ > ]]> #value# </select> SQL フラグメントの 再 利 用 SqlMap を 書 いている 時 に しばしば 重 複 した SQL のフラグメントが 出 てきます 例 えば FROM 句 もしくは 条 件 句 です ibatis は それらを 再 利 用 するためにシンプルでパワフルなタグを 提 供 します シンプルさを 目 的 として いくつかのアイテムを 得 たいとして それらの 数 を 取 得 し たいとしましょう 通 常 このように 書 きます: <select id="selectitemcount" resultclass="int"> SELECT COUNT(*) AS total FROM items WHERE parentid = 6 </select> <select id="selectitems" resultclass="item"> SELECT id, name FROM items WHERE parentid = 6 </select> 重 複 を 取 り 除 くために <sql>と<include>タグを 使 用 します <sql>タグは フラグメントの 再 利 用 をするために それぞれのフラグメントを 含 む<include>タグをステートメントの 中 に 含 み ます 例 えば: <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> <include>タグは ネームスペースに 配 慮 しています そのために 別 のマップにフラグメント があっても 参 照 できます (しかしながら ibatis が SqlMap をロードするために 含 められるフ ラグメントを 事 前 にロードしておかなければなりません)

23 フラグメントは 含 められてからクエリーとして 処 理 されます そのため パラメータも 使 用 で きます: <sql id="selectitem_fragment"> FROM items WHERE parentid = #value# </sql> <select id="selectitemcount" parameterclass="int" resultclass="int"> SELECT COUNT(*) AS total <include refid="selectitem_fragment"/> </select> <select id="selectitems" parameterclass="int" resultclass="item"> SELECT id, name <include refid="selectitem_fragment"/> </select> キーの 自 動 生 成 多 くのリレーショナルデータベースシステムは 主 キーの 自 動 生 成 をサポートしています この 機 能 は ( 常 にではないが)しばしば 適 切 な 機 能 です Data Mapper は <insert>ステートメン ト 中 の<selectKey>を 通 じてキーの 自 動 生 成 をサポートします 事 前 (Oracle)と 事 後 (SQL Server)の 両 方 のキー 生 成 をサポートしています 2つの 例 です: <! Oracle SEQUENCE Example --> <insert id="insertproduct-oracle" parameterclass="com.domain.product"> <selectkey resultclass="int" > SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL </selectkey> insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) </insert> <! Microsoft SQL Server IDENTITY Column Example --> <insert id="insertproduct-ms-sql" parameterclass="com.domain.product"> insert into PRODUCT (PRD_DESCRIPTION) values (#description#) <selectkey resultclass="int" > SELECT @@IDENTITY AS ID </selectkey> </insert> もし insert ステートメントより 前 に selectkey があれば insert の 前 に 実 行 されます そう でなかれば insert の 後 に 実 行 されます 始 めの 例 では (シーケンスにとって 適 切 なように) insert ステートメントの 前 に 実 行 される Oracle の selectkey の 例 を 示 しています SQL Server の 例 は (identity カラムにとって 適 切 なように)insert ステートメントの 後 に 実 行 される selectkey の 例 を 示 しています ibatis バージョン 2.2.0 以 降 では 希 望 するのであればステートメント 実 行 の 順 序 を 明 確 に 指 定 することがでいます selectkey エレメントは ステートメントの 順 序 を 明 確 にするためにセッ トする type 属 性 をサポートしています type 属 性 の 値 は pre か post のどちらかです 値 の 意 味 は insert ステートメントの 前 が 後 に 実 行 することです もし type 属 性 を 指 定 したのであ れば selectkey エレメントの 場 所 に 関 係 無 く 指 定 した 値 が 採 用 されます 例 えば エレメント が insert ステートメントの 後 にあっても insert の 前 に 実 行 できます

24 <insert id="insertproduct-oracle-type-specified" parameterclass="com.domain.product"> insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) <selectkey resultclass="int" type="pre" > SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL </selectkey> </insert> <selectkey> 属 性 リファレンス: resultclass keyproperty type <selectkey> 属 性 説 明 <selectkey>ステートメント 実 行 の 結 果 として 生 成 されるべき Java クラス( 通 常 Integer ま たは Long) <selectkey>ステートメント 実 行 の 結 果 として パラメータオブジェクトにセットされるプロパ ティ もし 指 定 されていなければ ibatis は データベースから 返 されたカラム 名 をベー スに プロパティを 見 つけようとします もし プロパティが 見 付 からなければ プロパティは セットされないでしょう しかし ibatis は <insert>ステートメントの 結 果 として 生 成 され たキーを 依 然 として 返 すでしょう pre または post もし 指 定 されば select key ステートメントは 関 連 する insert ステートメントの 前 (pre)または 後 (post)に 実 行 されることを 意 味 する もし 指 定 しなければ insert ステートメン トの 中 のエレメントの 場 所 から 実 行 順 序 を 推 測 します (もし SQL の 前 に 置 かれていれば selectkey は statement の 前 に 実 行 されます) この 属 性 は ibatis versions 2.2.0 以 降 での み 利 用 可 能 です ストアドプロシージャ ストアドプロシージャは <procedure> エレメントによってサポートされます 次 の 例 ではどの ようにストアドプロシージャが 出 力 パラメータとともに 利 用 されるかを 示 します <parametermap id="swapparameters" class="map" > <parameter property="email1" jdbctype="varchar" javatype="java.lang.string" mode="inout"/> <parameter property="email2" jdbctype="varchar" javatype="java.lang.string" mode="inout"/> </parametermap> <procedure id="swapemailaddresses" parametermap="swapparameters" > {call swap_email_address (?,?)} </procedure> 上 記 のプロシージャを 呼 び 出 すことにより 2つの 列 (データベーステーブル)のメールアドレス 同 様 にパラメータオブジェクト(Map)の 内 容 が 交 換 されます このパラメータオブジェクトは <parameter> エレメントの mode 属 性 が INOUT または OUT に 設 定 されている 場 合 のみ 変 更 されます それ 以 外 の 場 合 は 変 更 されません 明 らかに 不 変 のパラメータオブジェクト( 例. String)は 変 更 できません

25 Note! 常 に 標 準 の JDBC ストアドプロシージャ 構 文 を 使 うように 心 がけましょう 詳 しい 情 報 は JDBC CallableStatement documentation を 参 照 してください parameterclass parameterclass 属 性 は 完 全 修 飾 名 された Java クラス(すなわち package を 含 む)の 値 を 指 定 し ます この parameterclass 属 性 はオプショナルですが 強 く 推 奨 されます これは 限 定 された パラメータによるステートメントの 実 行 のみを 許 可 するためと 同 時 にフレームワークのパフォ ーマンスを 最 適 化 します もしあなたが parametermap 属 性 を 使 う 場 合 parameterclass 属 性 を 指 定 する 必 要 はありません 例 えば あなたがオブジェクト 型 ( 例. instanceof) examples.domain.product をパラメータとして 許 可 したいのであれば このように 記 述 でき ます: <insert id= statementname parameterclass= examples.domain.product > insert into PRODUCT values (#id#, #description#, #price#) </insert> IMPORTANT: 下 位 互 換 性 に 対 しては 任 意 ですが parameter class を 常 に 指 定 することは 強 く 推 奨 されています (もちろんパラメータが 不 要 な 場 合 を 除 いて) このクラスを 指 定 することによ りより 良 いパフォーマンスを 達 成 できるでしょう なぜならフレームワークはあらかじめ 型 を 知 ることにより 処 理 を 最 適 化 する 可 能 性 があるからです 特 定 の parameterclass が 無 い 場 合 適 切 なプロパティ(get/set メソッド)を 持 ついずれかの JavaBean も パラメータとして 利 用 可 能 です これはいくつかの 状 況 で 非 常 に 有 益 に 成 り 得 ま す parametermap parametermap 属 性 の 値 は <parametermap> エレメント( 下 記 参 照 )として 定 義 された 名 前 を 指 定 します この parametermap 属 性 は 稀 に parameterclass 属 性 ( 上 記 )とインライン Parameters 属 性 ( 後 述 )のために 使 われることがあります しかし XML の 純 粋 性 と 一 貫 性 があなたの 関 心 事 であるか または より 説 明 的 な parametermap ( 例.ストアドプロシージャのため) を 必 要 とす るなら これは 良 いアプローチです Note! Dynamic mapped statements ( 後 述 ) は インライン Parameters のみをサポートし parameter map には 機 能 しません parametermap の 目 的 は JDBC PreparedStatement の 値 トークンと 一 致 する 順 序 付 きのパラメー タのリストを 定 義 することです 例 えば : <parametermap id= insert-product-param class= com.domain.product > <parameter property= id /> <parameter property= description /> </parametermap> <insert id= insertproduct parametermap= insert-product-param > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?) </insert> この 上 記 の 例 では この parameter map は2つのパラメータが 順 に SQL ステートメントの 値 ト ークン(? )にマッチすることを 表 しています つまり 始 めの? は id のプロパティ 値 に より 置 き 換 えられ 二 つ 目 は description プロパティとなります parameter map とそのオ プションの 詳 細 については この 文 書 で 後 ほど 解 説 します インライン Parameters クイックグランス さらなる 詳 細 は この 文 書 の 後 ほどで 解 説 しますが ここでは 手 短 にインライン parameter の 紹 介 をします インライン parameter は mapped statement の 中 で 使 用 されます 例 えば :

26 <insert id= insertproduct > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#) </insert> 上 記 の 例 において インライン parameter は #id# と #description# です それぞれステート メントの 適 切 な 場 所 へ 配 置 させるために 使 われる JavaBean のプロパティを 表 します 上 記 の 例 では Product クラス( 前 述 の 例 で 使 用 しました)は 関 連 するプロパティトークンが 位 置 するス テートメント 中 で 置 き 換 えられる 値 として 読 み 込 まれる id と description プロパティを 持 ち ます つまりステートメントが Product (id=5, description= dog ) により 実 行 される 時, このステートメントは 以 下 のように 実 行 されることでしょう: resultclass insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (5, dog ) resultclass 属 性 は 完 全 修 飾 名 された Java クラス(すなわち package を 含 む)の 値 です resultclass 属 性 は ResultSetMetaData に 基 づき JDBC ResultSet により 自 動 的 にマッピング されるクラスを 指 定 できます どこであれ JavaBean のプロパティと ResultSet のカラムが 一 致 する 際 プロパティは カラムの 値 が 代 入 されます これによりクエリーマップされたステート メントを 短 期 間 かつ 円 滑 に 作 成 できます 例 えば: <select id="getperson" parameterclass= int resultclass="examples.domain.person"> SELECT PER_ID as id, PER_FIRST_NAME as firstname, PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value# </select> 上 記 の 例 では この Person クラスは 次 のプロパティを 含 みます: id, firstname, lastname, birthdate, weightinkilograms, heightinmeters それぞれが SQL の SELECT ステートメント ( 標 準 SQL 機 能 の as キーワードによる)により 記 述 されたカラムのエイリアスに 合 致 します カラムのエイリアスはデータベースのカラム 名 が 一 致 しない 場 合 のみに 必 要 ですがこれは 一 般 的 ではありません 実 行 すると Person オブジェクトのインスタンスが 生 成 され プロパティ 名 とカラム 名 に 基 づいて 結 果 セットの 値 がマップされます 先 に 述 べたとおり 自 動 マッピングを resultclass で 行 うにはいくつかの 制 限 があります (も し 必 要 な 場 合 ) 出 力 される 列 の 型 を 指 定 する 方 法 がないこと 自 動 的 に 関 連 するデータ( 複 合 プロ パティ)をロードする 方 法 が 無 いこと そしてこの 手 法 が ResultSetMetaData へのアクセスを 要 求 することによる 若 干 のパフォーマンスへの 影 響 もあります これら 全 ての 制 限 は resultmap を 明 示 的 に 使 用 することで 解 決 できます resultmap については この 文 書 で 後 ほど 詳 細 に 記 述 します resultmap この resultmap プロパティはより 一 般 的 に 使 われる 最 も 重 要 な 属 性 と 考 えられます resultmap 属 性 の 値 は resultmap エレメント( 下 記 参 照 )により 定 義 された 名 前 です この resultmap 属 性 の 使 用 により どのようにデータを 結 果 セットから 抽 出 するかとそのプロパティ が どのカラムにマップされるかを 制 御 することが 出 来 ます resultclass 属 性 ( 上 記 )を 使 った 自 動 マッピング 手 法 と 違 い この resultmap は 列 の 型 null 値 の 置 き 換 えと 組 み 合 わせたプロパ

27 ティのマッピングを 記 述 できます ( 他 の JavaBean Collection と 基 本 データ 型 のラップクラス を 含 む) resultmap の 詳 細 の 構 造 についてはこの 文 書 の 後 で 説 明 します しかし 次 の 例 で resultmap がど の 様 に 関 連 するステートメントを 参 照 するかを 示 します <resultmap id= get-product-result class= com.ibatis.example.product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> </resultmap> <select id= getproduct resultmap= get-product-result > select * from PRODUCT </select> 上 記 の 例 では SQL クエリーからの ResultSet が resultmap 定 義 にしたがって Product インスタ ンスにマップされます この ResultMap では id プロパティが PRD_ID 列 そして description プロパティが PRD_DESCRIPTION 列 で 代 入 されることを 表 します select * がサポートされていることに 注 目 してください ResultSet の 全 ての 列 をマップさせる 必 要 はあ りません cachemodel cachemodel 属 性 値 は cachemodel エレメント( 下 記 参 照 )で 定 義 される 名 前 です cachemodel はク エリーマップがマップされたステートメント と 共 に 使 用 されるキャッシュを 記 述 するために 使 われます 個 々のクエリーマップがマップされたステートメントは 別 の cachemodel も 同 じ cachemodel も 利 用 できます cachemodel エレメントとその 属 性 の 全 詳 細 については 後 に 解 説 し ます 次 の 例 はこれが 関 連 するステートメントをどの 様 に 参 照 するかを 表 します <cachemodel id="product-cache" type="lru"> <flushinterval hours="24"/> <flushonexecute statement="insertproduct"/> <flushonexecute statement="updateproduct"/> <flushonexecute statement="deleteproduct"/> <property name= size value= 1000 /> </cachemodel> <select id= getproductlist parameterclass= int cachemodel= product-cache > select * from PRODUCT where PRD_CAT_ID = #value# </select> 上 記 の 例 では 弱 い 参 照 タイプで 24 時 間 毎 または 関 連 する 更 新 ステートメントが 実 行 される 毎 に フラッシュされる product へのキャッシュを 定 義 します xmlresultname 結 果 を 直 接 XML 文 書 にマッピングするとき xmlresultname の 値 はこの XML 文 書 の root エレメン トになります 例 えば: <select id="getperson" parameterclass= int resultclass="xml" xmlresultname= person > SELECT PER_ID as id, PER_FIRST_NAME as firstname, PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value#

28 </select> 上 記 では select 文 は 次 の 構 造 に 従 った XML オブジェクトを 提 供 します: <person> <id>1</id> <firstname>clinton</firstname> <lastname>begin</lastname> <birthdate>1900-01-01</birthdate> <weightinkilograms>89</weightinkilograms> <heightinmeters>1.77</heightinmeters> </person> remapresults この remapresults 属 性 は<statement> <select> と <procedure> にマップされたステートメ ントに 適 用 されます これはオプションの 属 性 で 初 期 値 は false です クエリーが 戻 り 列 の 変 数 セットを 持 つ 時 remapresults 属 性 を true に 設 定 するべきです 例 え ば 次 のクエリーを 考 えてみましょう: SELECT $fieldlist$ FROM table たとえ このテーブルが 常 に 同 じだとしても 前 の 例 では カラムのリストは 動 的 です SELECT * FROM $sometable$ この 例 では このテーブルは 異 なるものにできます select 句 に*を 使 っているため 結 果 の 列 名 も 同 様 に 異 なるものにできます また 動 的 なエレメントは 列 リストを 一 つのクエリー 実 行 か ら 次 のものへと 変 化 させます この resultset metadata が 自 明 でないことを 判 断 / 決 定 するためのオーバーヘッドがあるために ibatis はクエリーが 最 後 に 実 行 された 時 に 何 が 戻 されたかを 思 い 出 します 上 記 の 例 に 類 似 した 状 況 下 で 問 題 を 起 こします 従 って 全 てのクエリーを 実 行 する 際 に metadata introspection を 行 う 可 能 性 があります 従 って この 戻 り 列 を 変 更 するのであれば remapresults を true へ そうでなければ remapresults を false に 設 定 するように 変 更 して metadata introspection のオーバーヘッドを 避 けることが 出 来 ます resultsettype SQl ステートメントの resultsettype を 特 定 するために いずれかを 指 定 できます : FORWARD_ONLY: カーソルは 前 方 へのみ 移 動 する 可 能 性 がある SCROLL_INSENSITIVE: カーソルはスクロール 可 能 しかし 一 般 に 他 からの 変 更 に 対 して 敏 感 で ない SCROLL_SENSITIVE: カーソルはスクロール 可 能 かつ 一 般 に 他 からの 変 更 に 対 して 敏 感 resultsettype は 一 般 に 必 須 ではなく 異 なる JDBC ドライバは 同 じ resultsettype 設 定 を 使 用 しても 異 なる 振 る 舞 いをする 場 合 があることに 注 意 しましょう ( 例 えば Oracle は SCROLL_SENSITIVE をサポートしない ). fetchsize

29 実 行 される SQL ステートメントに 対 して fetchsize を 設 定 します これは JDBC ドライバ にデー タベースサーバへの 最 小 の 通 信 回 数 でプリフェッチするためのヒントを 与 えます timeout (ibatis バージョン 2.2.0 以 降 のみ) ステートメントに 対 する JDBC クエリータイムアウトを 設 定 します ここで 指 定 した 値 が SQLMapConfig.xml ファイルの defaultstatementtimeout で 指 定 された 値 を 上 書 きします も しデフォルトのタイムアウトを 指 定 したい 又 は 個 別 のステートメントに 対 してタイムアウトを 指 定 しない 場 合 は 0 に 設 定 して 下 さい この 指 定 された 値 はステートメントが 完 了 するまでドラ イバが 待 機 する 秒 数 です 全 てのドライバが この 設 定 をサポートしないことに 注 意 して 下 さい

30 Parameter Maps と インライン Parameters 既 に 見 た 通 り parametermap はステートメントのパラメータに JavaBean プロパティをマッピン グする 責 任 があります parametermap が 外 部 的 の 形 をとる 事 は 稀 ですが これらを 理 解 すること はインライン parameter を 理 解 することを 助 けることでしょう インライン parameter は この セクションに 続 いてすぐに 説 明 します <parametermap id= parametermapname [class= com.domain.product ]> <parameter property = propertyname [jdbctype= VARCHAR ] [javatype= string ] [nullvalue= -9999 ] [typename= {REF or user-defined type} ] [resultmap=someresultmap] [mode=in OUT INOUT] [typehandler=sometypehandler] [numericscale=2]/> <parameter /> <parameter /> </parametermap> [ 括 弧 ] の 中 はオプションです parametermap 自 体 はステートメントから 識 別 されるための id 属 性 だけが 必 須 です class 属 性 はオプションですが 強 く 推 奨 されています ステートメントの parameterclass 属 性 と 同 様 に class 属 性 はフレームワークが 入 力 されるパラメータを 検 証 する ことを 許 可 し エンジンの 性 能 を 最 適 化 します <parameter> エレメント parametermap はステートメントのパラメータへ 直 接 マップするパラメータのマッピングをいくつ でも 含 むことが 出 来 ます 次 の 数 節 では property エレメントの 属 性 について 記 述 します property parameter map の property 属 性 はマップされたステートメントへ 渡 されたパラメータオブジェク トの JavaBean プロパティ(get メソッド)の 名 前 です この 名 前 はそのステートメント 中 で 必 要 と される 回 数 に 従 い 複 数 回 使 用 されることがあります ( 例. 同 じプロパティが 一 つの SQL 更 新 ス テートメントの set 句 中 で 更 新 される 場 合 又 は where 句 中 のキーとして 使 われる 場 合 ) jdbctype jdbctype 属 性 は プロパティで 設 定 されるパラメータの database column type を 明 示 的 に 指 定 するために 使 われます いくつかの JDBC ドライバは 列 型 をドライバに 明 確 に 伝 えないと 一 部 の 操 作 において 列 の 型 を 特 定 することが 出 来 ません この 完 全 な 例 は PreparedStatement.setNull(int parameterindex, int sqltype) メソッドです このメソッド は 特 定 される 型 を 必 要 とします いくつかのドライバは 単 純 に Types.OTHER か Types.NULL を 渡 すことでその 型 が 暗 黙 的 になることを 許 可 するでしょう しかし この 振 る 舞 いは 一 貫 性 が 無 い 上 に いくつかのドライバは 特 定 される 明 確 な 型 を 必 要 とします このような 状 況 の 為 に Data Mapper API は parametermap プロパティエレメントの jdbctype 属 性 を 使 用 しての 指 定 を 可 能 にし ます この 属 性 は 通 常 カラムが null を 許 可 する 場 合 のみ 必 要 です しかしながら この jdbctype 属 性 を 使 う 理 由 は date 型 を 明 確 に 特 定 するという 別 の 理 由 があります Java は 唯 一 の Date 型 を 持 ちますが 多 くの SQL データベースは 多 くの 普 通 は 少 なくとも 3 種 類 の 型 を 持 ちます このた め あなたは DATE 型 のカラムに 対 して( 例 えば)DATETIME であることを 明 確 に 指 定 したいこと があるかもしれません JdbcType 属 性 は JDBC 型 クラスの 定 数 に 適 合 する 全 ての 文 字 列 の 値 を 設 定 できます これらはい ずれも 設 定 することが 出 来 ますが いくつかの 型 はサポートされません ( 例 blob 等 ) この 文 書 の 後 の 節 でフレームワークによってサポートされる 型 について 解 説 します

31 Note! ほとんどのドライバは null を 許 可 する 列 への 型 の 指 定 だけを 必 要 とします 従 って そ のようなドライバでは null を 許 可 する 列 への 型 を 指 定 するだけで 構 いません Note! Oracle ドライバを 使 う 場 合 その 型 の 指 定 をせずに 列 に null 値 を 設 定 しようとすると Invalid column type エラーになることがあります. javatype javatype 属 性 は 設 定 されるパラメータの Java property type を 明 確 に 特 定 する 為 に 使 用 されま す 通 常 これは JavaBean のプロパティからリフレクションを 通 じて 導 かれます しかし Map と XML のマッピングの 様 ないくつかのマッピングにおいてはフレームワークへ 型 が 提 供 されません もし javatype が 未 設 定 かつフレームワークが 型 を 他 に 決 定 出 来 なかった 場 合 その 型 は Object と 見 なされます typename typename 属 性 は 参 照 型 またはユーザー 定 義 型 を 明 確 に 特 定 するときに 使 用 されます javadoc には 以 下 のように 述 べられています: typename 属 性... ユーザ 定 義 か 参 照 の 出 力 パラメータに 使 用 されるべきです ユーザ 定 義 型 の 例 :STRUCT, DISTINCT, JAVA_OBJECT, 名 前 付 けされた 配 列 型... ユーザ 定 義 パラメータにはパ ラメータの 完 全 修 飾 された SQL 型 名 さらに 参 照 パラメータは 参 照 型 の 完 全 修 飾 された 型 名 が 与 えられるべきです 型 コードと 型 名 の 情 報 を 必 要 としない JDBC ドライバはこれを 無 視 する 可 能 性 があります 移 植 可 能 性 のため しかしながら アプリケーションは 常 にこれらの 値 をユーザ 定 義 または 参 照 パラメータへ 提 供 するべきです これはユーザ 定 義 と 参 照 パラメータを 意 図 した ものですが この 属 性 はいずれかの JDBC 型 のパラメータを 登 録 するために 使 われることもあり ます もしこのパラメータがユーザ 定 義 または 参 照 の 型 を 持 たないとき typename パラメータは 無 視 されます * 斜 体 字 の 単 語 はこの 文 書 の 文 脈 において 解 説 を 加 えるために 置 き 換 えられました nullvalue nullvalue 属 性 は 任 意 の 有 効 な(プロパティの 型 に 基 づく) 値 が 設 定 されます この nullvalue 属 性 は 出 力 する null 値 の 変 換 を 指 定 するために 使 われます これは JavaBean のプロパティにこの 値 が 見 つかった 時 NULL がデータベースに 書 き 込 まれることを 意 味 します(これは 入 力 される null 値 の 変 換 の 反 対 の 振 舞 いです) これはあなたのアプリケーション 内 の null 値 をサポートし ない 型 ( 例.int,double,float 等 )に 対 して 魔 法 の null 値 を 利 用 可 能 にします プロパティ のこれらの 型 が 合 致 する null 値 ( 例.-9999)を 含 んでいるとき この 値 に 代 わって NULL がデータ ベースへ 書 き 込 まれます resultmap ストアドプロシージャ 出 力 パラメータの 値 として java.sql.resultset のインスタンスを 期 待 す る 場 合 に resultmap エレメントを 指 定 します これは ibatis がオブジェクトマッピングに 正 常 な 結 果 をセットをするのを 可 能 にするでしょう mode この mode 属 性 はストアドプロシージャのモードを 指 定 します 有 効 な 値 は IN,OUT または INOUT です typehandler

32 typehandler 属 性 はデフォルトの ibatis 型 システムの 代 わりにこのプロパティに 使 用 されるカ スタム 型 ハンドラを 指 定 するために 使 われます もし 指 定 される 時 この 値 は com.ibatis.sqlmap.engine.type.typehandler インターフェースまたは com.ibatis.sqlmap.client.extensions.typehandlercallback インターフェースのどちらかを 実 装 したクラスの 完 全 修 飾 名 とする 必 要 があります この 値 はこのプロパティに 適 用 されるグロー バル 型 ハンドラを 上 書 きします カスタム 型 ハンドラに 関 するこれ 以 上 の 詳 細 はこの 文 書 で 後 に 記 述 しています numericscale (numericscale は ibatis バージョン 2.2.0 以 上 でのみ 有 効 です) numericscale 属 性 は NUMERIC もしくは DECIMAL 型 ストアドプロシージャ 出 力 パラメータの 桁 数 ( 小 数 点 以 下 の 桁 数 )を 特 定 するために 使 われます もし mode 属 性 へ OUT または INOUT を 指 定 し かつ jdbctype が DECIMAL または NUMERIC の 時 同 様 に numericscale を 指 定 するべきです この 属 性 に 指 定 される 値 は 0 以 上 でなければいけません <parametermap> の 例 parametermap の 完 全 な 構 造 をした 例 は 次 の 通 りです <parametermap id= insert-product-param class= com.domain.product > <parameter property= id jdbctype= NUMERIC javatype= int nullvalue= -9999999 /> <parameter property= description jdbctype= VARCHAR nullvalue= NO_ENTRY /> </parametermap> <insert id= insertproduct parametermap= insert-product-param > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?) </insert> 上 記 の 例 では JavaBean プロパティの id と description は Mapped Statement insertproduct のパラメータに 列 挙 された 順 番 で 値 が 設 定 されます つまり id は 最 初 のパラ メータ(?)が 設 定 され description は 2 番 目 になります もし 順 序 が 逆 の 場 合 XML は 次 のよう に 見 なされます: <parametermap id= insert-product-param class= com.domain.product > <parameter property= description /> <parameter property= id /> </parametermap> <insert id= insertproduct parametermap= insert-product-param > insert into PRODUCT (PRD_DESCRIPTION, PRD_ID) values (?,?) </insert> Note! Parameter Map 名 は 必 ずそれらが 定 義 されている SQL Map XML ファイルに 対 してローカル です 別 の SQL Map XML ファイルの Parameter Map を SQL Map の id(<sqlmap>ルートタグで 設 定 ) と Parameter Map の id の 前 に 付 けることによって 参 照 することが 出 来 ます 例 えば 上 記 の Parameter Map を 別 のファイルから 参 照 する 時 参 照 への 完 全 名 は Product.insert-productparam となります インライン Parameter Maps とても 記 述 的 ですが parametermap を 宣 言 するための 上 記 のシンタックスは とても 冗 長 です インライン Parameter Maps は 冗 長 さを 減 らし より 記 述 的 です 明 示 的 に parametermap を 書 く 代 わりに こちらを 使 用 することを 勧 めます インライン Parameter Maps で SQL に 直 接 パラ メータを 定 義 できます デフォルトでは マップされたステートメントは インライン

33 Parameter Maps を 解 析 するために 指 定 する 明 示 的 な parametermap を 持 ちません 上 記 のサンプ ル(すなわち product)をインライン Parameter Maps で 実 装 すると このようになります: <insert id= insertproduct parameterclass= com.domain.product > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#) </insert> 下 記 のシンタックスをインライン Parameter Maps に 指 定 することで 型 を 宣 言 できます : <insert id= insertproduct parameterclass= com.domain.product > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:numeric#, #description:varchar#) </insert> 下 記 のシンタックスをインライン Parameter Maps に 指 定 することで 型 と null 値 の 置 き 換 えを 宣 言 できます <insert id= insertproduct parameterclass= com.domain.product > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:numeric:-999999#, #description:varchar:no_entry#) </insert> Note! インライン Parameter Maps を 使 用 している 時 型 を 指 定 せずに null 値 の 置 き 換 えを 指 定 できません 解 析 順 に 指 定 する 必 要 があります Note! null 値 を 完 全 に 透 過 にしたいのであれば このドキュメントで 後 述 しているように Result Map に null 値 の 置 き 換 えを 指 定 しなければなりません Note! 多 くの 型 の 記 述 と null 値 を 置 き 換 える 必 要 があるのであれば 外 部 の parametermap を 記 述 することによりコードをクリーンに 保 つことができます. Inline Parameter Map のシンタックス ibatis は インライン Parameter Maps において 2 つの 異 なるシンタックスをサポートしてい ます シンプルなシンタックスと より 複 雑 で 完 全 なシンタックスです シンプルなシンタックスは 下 記 となります #propertyname# - OR - #propertyname:jdbctype# - OR - #propertyname:jdbctype:nullvalue# 上 記 は シンタックスの 例 です propertyname エレメントは パラメータオブジェクト(もしく は String, Integer などのシンプルな 値 であればパラメータオブジェクト 自 身 の 値 )の 名 前 です jdbc エレメントは パラメータの JDBC 型 を 指 定 するために 使 用 します 値 は java.sql.types (VARCHAR, INTEGER など)にリストされている 型 の1つでなければなりません 一 般 的 に jdbctype エレメントは 値 が NULL か DATE か TIME フィールド(TIMESTAMP フィール ドとは 対 照 的 に)となりえる 可 能 性 があるのであれば 必 要 です nullvalue エレメントは 上 記 の 記 述 において NULL 値 を 置 き 換 える 値 の 指 定 に 使 用 されます jdbctype の 指 定 なしに nullvalue を 指 定 することができないことに 注 意 してください このシンタックスは 正 式 な parameter map の 詳 細 なオプションに アクセスする 必 要 がない 大 抵 のシチュエーションにおいて 適 切 です( 例 えば ストアドプロシージャを 呼 ぶとき) より 詳 細 なシンタックスは 下 記 のようになります: