タイプが必須となります。タイプハンドラーの完全修飾クラス名またはエイリアスを指定して、特定のタイプハンドラーを割り当てることもできます。#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}だんだんゴチャゴチャしてきましたが、実際のところ、これらの属性を指定することは滅多にないと思います。パラメーターを指定することができます。場合は、パラメーターオブジェクトのプロパティの値が変更されます。指定する必要があります。パラメーターを登録するときに型名を指定する必要があります。よきに計らってくれるはずです。指定するくらいでしょう。部分)に対して安全な値が設定されるようになっています。文に挿入した方が都合が良い場合があります。句は以下のように記述できます。引数として渡された文字列を変更したりエスケープしたりしません。文字列代入は、メタ情報(例:テーブル名やカラム名など)をSQLステートメントへ動的に埋め込みたい場合に非常に便利な仕組みです。method指定したカラムの値に一致するレコードを取得するメソッドを一つ用意するだけで、同じことを実現することができます。以下のように使用することができます。"noone@nowhere.com");この考え方はテーブル名にも適用することができます。文に代入するのは危険です。インジェクションの原因となる可能性がありますので、ユーザーによる入力を受け付けないようにしておくか、常にプログラム側で独自にエスケープやチェックの処理を行うようにしてください。サポートすらしていないことも可能となるのです。実際、複雑なクエリの結果を結合してマッピングするコードを書く場合、数千行ものコードになってしまう場合もあります。簡単なステートメントなら明示的にマッピングな記述を省略でき、複雑なステートメントの場合でもオブジェクト同士の関連付けを行うための必要最小限のコードのみを記述すれば良いように設計されています。ついては既に例として出てきました。キーとしてマップされます。良いドメインモデルとは言えません。使っていると思います。どちらもサポートしています。持っているということになります。ステートメントの中で指定されている列名と一致しています。マップすることができます。#{id}</select>タイプエイリアスを使えば何度も完全修飾クラス名を入力しなくて済む、ということも思い出してください。よって自動的に作成されます。素晴らしいところは、まだ一つの例も挙げていないにも関わらず、あなたは既にその多くを学んでいるということです。これらのシンプルなケースでは既に見てきた以上のことは何も必要ありません。明示的に定義したらどうなるか見てみましょう。属性は削除しています)。#{id}</select>全てがこんなに簡単なら良いのでしょうが、そう甘くはありません。「データベースは必ずしも希望通りに定義されている訳ではない」という思想に基づいて設計されています。最高ですが、実際はそうではありません。ひとつで全てのアプリケーションに適合できるようなデータベースを作ることができたら素晴らしいですが、これも現実とは異なります。いったようなオブジェクトモデルにマップしたいと考えるでしょう。すべてタイプエイリアスとします)。後ほどひとつずつ説明しますが、とりあえず目を通してみてください。最初は難解に思えるかも知れませんが、実際は非常にシンプルです。要素には多くの子要素や階層構造があり、それぞれについて多少説明が必要です。クエリ結果をコンストラクタに渡してクラスのインスタンスを作成する場合に使用します。あることを明示します。列を明示することによって全体のパフォーマンスが向上します。通常のコンストラクタ引数です。あることを明示します。明示することによって全体のパフォーマンスが向上します。プロパティにセットされる通常のデータです。複雑型のアソシエーションを定義します。多くのマッピングはこのタイプに当てはまります。参照することもできます。複雑型のコレクションを定義します。参照することもできます。使用するか決定します。一種で、値が一致した場合に使用されます。同じ要素を持つことができます。参照することもできます。このネームスペース内で固有の識別子。参照する際に使用します。クラスの完全修飾クラス名またはタイプエイリアスを指定します(前に出てきた標準のタイプエイリアスのリストを参照してください)。ここでの指定はグローバルな設定(autoMappingBehavior)より優先されます。段階的に実装するようにしましょう。ユニットテストも効果的です。一度に実装しようとするとミスが発生しやすく、作業も困難です。シンプルなところからスタートして、ユニットテストを書きながら徐々に拡張しましょう。フレームワークの欠点でもありますが、ソースが公開されているかどうかに関わらず、フレームワークはある種のブラックボックスとなり得ます。期待通りに動作していることを確かめるにはユニットテストが一番です。ユニットテストはバグを報告する場合も役に立ちます。次の章ではそれぞれの要素について詳しく見ていきます。結果マッピングの基本となる要素です。)のプロパティまたはフィールドにマップするときに使用します。その結果が識別子プロパティ(オブジェクトのインスタンスを比較する際に使われます)であることを表すという点のみです。マッピング)の処理を行うときです。どちらも多くの属性を持っています。結果列の値をマップするフィールドまたはプロパティを指定します。プロパティがあれば、そのプロパティが使われます。次に名前が一致するフィールドを探します。どちらの場合も、ドット表記を使って複雑型のプロパティを指定することができます。ように複雑なプロパティを指定することもできます。データベースで定義されている列名、あるいは列の別名を指定します。メソッドの引数として渡される文字列と同じと考えてください。クラスの完全修飾クラス名またはタイプエイリアスを指定します(前に出てきた標準のタイプエイリアスのリストを参照してください)。よって正しく判別されます。指定するようにしてください。データ型(この後のテーブルにリストがあります)を指定します。許可されている列を指定した場合だけです。許可されている列に対しては、やはりデータ型を指定する必要があります。デフォルトのタイプハンドラーについては既に説明しました。このプロパティを使うと、デフォルトのタイプハンドラーをオーバーライドすることができます。タイプハンドラーの完全修飾クラス名またはタイプエイリアスを指定します。データ型を以下に挙げておきます。ドメインモデルではプロパティを使って値を設定することができますが、時にはイミュータブルなクラスを使いたい場合もあるかも知れません。通常更新されることのない参照用データを含むテーブルなどはイミュータブルクラスに向いています。メソッドの定義が不要となります。して定義されているプロパティやフィールドもサポートしていますが、コンストラクタインジェクションを好む人もいると思います。要素を使うとコンストラクタインジェクションによって値をマップすることが可能となります。次のようなコンストラクタを考えてみます。}//...}コンストラクタ経由で値をマップするためには、指定された引数にマッチするコンストラクタを特定する必要があります。この順番で持つコンストラクタを探します。javaType="_int"/></constructor>上記の指定方法では引数の型を順番通りに並べる必要がありますが、引数の多いコンストラクタを扱うのには向いていません。要素を順不同で記述できるようになりました。(デフォルト値です)を設定します。下記の指定では2番めと3番目の引数の順番がコンストラクタの宣言と異なりますが、引数名が指定されているので正しく動作します。