menu
書いてる野郎
orebike@gmail.com
Mapper による SQL の結果を Java の何に割り当てるかの機能。
基本的に名前が一致していればなんの設定も無しに自動的にマッピングされる。(ResultType指定)
特にこのようにするとキャメルとスネークの差異も自動的に吸収してくれる。
mybatis: configuration: mapUnderscoreToCamelCase: true
ResultMap を定義してどの結果がどの Java フィールドに入るかを明示的に定義できる。
このようにする。resultMap という定義を増やし select の resultType ではなく resultMap に定義する
<select id="findById" resultMap="hogeAccountResultMap"> SELECT hoge_id AS hogehoge_id, piyo_id AS piyopiyo_id, name AS fuga_name, memo AS fuga_memo FROM hoge_account WHERE hoge_account.hoge_id = #{hogeId} AND hoge_account.deleted = 0 LIMIT 1 ; </select> <resultMap id="hogeAccountResultMap" type="com.unko.HogeAccount"> <id property="hogeId" column="hogehoge_id" /> <result property="piyoId" column="piyopiyo_id"/> <result property="name" column="fuga_name"/> <result property="memo" column="fuga_memo"/> </resultMap>
resultMap 側では id に PK を指定して SQL の出力のカラム名と Java 側のクラスの setter 名を対応させる。
そうすると見事にマッピングしてくれる。逆に言うと、ここに書かなければまったくマッピングされない。
id
にその resultMap を識別するための名称を入れる。これを使って適用する select 要素の resultMap
属性で指定する。
type
に select の結果をマッピングするインスタンスである Java 側のクラスを指定する。
result
要素で property
で Java側のアクセサ、 column
で select 側の結果カラムを指定する。
id
要素もあるが基本的に result と同じ、PK をマッピングする際に id 要素で指定するとパフォーマンスが高くなる可能性があるという感じっぽい。
違いは無い。interface にどう定義されているかによってそれが List のインスタンス1個1個にあたるのか、結果インスタンス1個にあたるのかを勝手に切り替えるので同じモノが使える。 なので基本形を作っていれば使い回せるということである。