マッピングに関して、階層の深さやオブジェクトの大きさに制限はありませんし、両者を組み合わせることも可能です。パフォーマンスのことは忘れないようにしてください。ユニットテストと負荷テストを怠らなければ、あなたのアプリケーションにとっての最適なアプローチを見つけることができます。コードの変更は最小限(あるいはゼロ)で済みます。使った高度なマッピングはかなり深いテーマです。ドキュメントで全てを網羅することはできませんが、少し練習すればすぐに全体がクリアになるはずです。resultType="DraftPost"/></discriminator>データベースに対して実行した1回のクエリによって、複数の異なる(何らかの関係を持った)データ型を含む結果が戻ってくることがあります。要素は、こうしたケースをはじめとして、クラスの継承関係を再現する場合など様々な用途を想定して作られています。文と同じように働くので理解するのはそれほど難しくないはずです。比較対象の値を参照する際に使用されます。指定すれば期待通りに動作するはずです)。使用例を見てみましょう。使って結果のマッピングを行います。この処理は排他的に行われます。継承されている場合は別です。これについてはすぐ後で説明します)。次のように定義されていたとします。プロパティのみが読み込まれることになります。グループを定義することができます。間に関連性があることは明らかです。以外のプロパティも読み込んで欲しいと思うでしょう。一箇所変更すれば、希望通りの動作になります。両方で定義されているすべてのプロパティが読み込まれるようになります。定義するのが面倒だと考える方もいると思います。簡潔にまとまった表記が好みだという方のために、別の記法も用意されています。自動的に列名と一致する名前を持つプロパティに値を設定します。上で挙げた例の多くは必要以上に冗長になっているといえます。データベースは複雑ですから全てのケースで自動マッピングが使えるということもないでしょう。記述する必要があるということを説明しました。この章では更に、この2つの方法を同時に利用する方法を説明していきます。自動マッピングの動作について詳しく見て行きましょう。列名と同じ名前を持つプロパティを探します(大文字と小文字は区別しません)。列の値をセットします。プロパティはキャメルケースで定義されるのが一般的です。設定すると、この一般的な命名規則に基づいて自動マッピングを適用することができます。指定されている場合でも自動マッピングは動作します。明示的にマッピングが指定されていない列が自動マッピングの対象となります。列が自動マッピングの対象となります。column="hashed_password"/></resultMap>自動マッピングには3つのレベルがあります。自動マッピングを無効化します。明示的にマッピングが指定されたプロパティにのみ値がセットされます。自動マッピングの対象となります。自動マッピングの対象となります。それには理由があります。句によって複数のエンティティに対する結果が一行に結合されているような場合に自動マッピングによって意図しないマッピングが実行されてしまう場合があります。次の例を見てください。セットされることになります。指定する場合は、こうした意図しないマッピングが行われないように注意する必要があります。属性を指定することで特定のステートメントでの自動マッピング動作を有効/無効化することもできます。非常に柔軟なトランザクション対応のクエリキャッシング機能が用意されています。強力で、かつ簡単に設定できるよう、キャッシュの実装に多くの改良が加えられています。デフォルトでは、セッション生存期間中のデータを保持するローカルセッションキャッシュのみが有効です。ファイルに次の一行を追加するだけです。<cache/>文字通りこれだけです。この行の効果は次の通りです。ステートメントの結果は全てキャッシュされます。ステートメントを実行するとキャッシュがフラッシュされます。アルゴリズムに基づいて置き換えられます。設定されていないということです)。このキャッシュは読み書き可能なキャッシュとして扱われます。これはつまり、取得したオブジェクトは共有されず、呼び出した側で安全に変更することができる(別の呼び出し元や他スレッドでの変更の影響を受けない)ということを意味しています。マッパーのネームスペースを指定する必要があります。要素の属性で変更することができます。readOnly="true"/>この設定では、以下のようなキャッシュが作成されます。アルゴリズムに基づいて置き換えられる。秒ごとにフラッシュされる。返されるオブジェクトは読み取り専用(read-only)(変更した場合、他の呼び出し元や別スレッドからの変更とコンフリクトする可能性がある)。指定可能な置換(eviction)ポリシーは以下の通りです。長いこと使われていないオブジェクトを優先的に削除します。最初に登録されたオブジェクトから順番に削除します。規則に基づいてオブジェクトを削除します。規則に基づいて、より積極的にオブジェクトを削除します。適切な時間(ミリ秒)を表す正の整数を指定することができます。select)が実行された場合のみです。任意の正の整数を指定することができますが、実行環境で利用可能なメモリリソースとキャッシュされるオブジェクトのサイズに配慮してください。設定することができます。読み取り専用キャッシュはキャッシュされたオブジェクトのインスタンスをそのまま呼び出し元に返しますので、このオブジェクトを変更すべきではありません。読み取り専用キャッシュの利点は非常に高速だということです。読み書き可能なキャッシュは、キャッシュされたオブジェクトを複製して(シリアライゼーションを使います)返しますので読み取り専用と比較すると遅いですが安全です。2次レベルキャッシュはトランザクションに対応しています。された場合に2次レベルキャッシュが更新されます。パーティのキャッシュソリューションのアダプタを作成してキャッシュの挙動を完全にオーバーライドしてしまうこともできます。type="com.domain.something.MyCustomCache"/>上記は、カスタムキャッシュの実装を使用するための設定例です。インターフェイスを実装している必要があります。中では複雑な方ですが、その役割を考えればシンプルです。要素でプロパティを渡しします。いうメソッドが呼び出されます。以外でも使用可能です。加えて、コンフィギュレーション用のプロパティに定義した値で置き換えるために、プレースホルダ(例:${cache.file})を指定することができます。MyBatisはすべてのプロパティを設定した後に初期化メソッドを呼び出す仕組みをサポートしています。この機能の使用したい場合は、あなたが作成したキャッシュの実装クラスにorg.apache.ibatis.builder.InitializingObjectインタフェースを実装してください。ファイルのネームスペースに関連付けられているということです。あるネームスペースに対して定義されているキャッシュは、同じネームスペース内で定義されている全てのステートメントに関連付けられます。ステートメントごとにキャッシュとの関連性を変更したり無効化することができるように、二つの簡単な属性が用意されています。デフォルトでは、各ステートメントは下記のように設定されています。flushCache="true"/>上記の設定はデフォルトですので、明示的に上記のように設定する必要はありません。属性を設定するようにしてください。ステートメントを実行する際にキャッシュをフラッシュしたい、といった場合です。ステートメントを定義したいと思う時があるかも知れません。cache-ref前の章で説明した通り、あるネームスペースに対して設定されているキャッシュが適用されるのは同じネームスペース内で定義されているステートメントのみですし、このキャッシュをフラッシュするのも同じネームスペース内で定義されているステートメントのみです。あるキャッシュの設定とインスタンスを複数のネームスペースで共有したいと思う時があるかも知れません。要素を使って別のネームスペースで定義されているキャッシュの定義を参照することができます。