Spring Boot / MyBatis / Mapper / select / ResultMap

Spring Boot / MyBatis / Mapper / select / ResultMap

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 要素で指定するとパフォーマンスが高くなる可能性があるという感じっぽい。

List<Hoge> と Hoge を戻す ResultMap の違い

違いは無い。interface にどう定義されているかによってそれが List のインスタンス1個1個にあたるのか、結果インスタンス1個にあたるのかを勝手に切り替えるので同じモノが使える。 なので基本形を作っていれば使い回せるということである。

java/spring/spring_boot/mybatis/mapper/select/result_map/start.txt · 最終更新: 2021-06-28 18:03 by ore