JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■MyBatis の小径
1)resultMapを使ったO/Rマッピング
本編「■SpringMVC の小径 8-3)XMLMapper」で説明している、
MyBatis MapperXML は実は少し手抜きをしてあります。
DBのカラム名と、Java側のDTO(ここではUser)のプロパティ名が完全一致している場合、
本編で紹介している下の例の様に

WebContent/WEB-INF/mappers/UserMapper.xml より抜粋
<!-- User Mapperインターフェースを指定する -->
<mapper namespace="jp.dip.arimodoki.mapper.UserMapper">

  <!-- user情報を取得するSQL -->
  <select id="getUser " parameterType="int" resultType="User">
  Select * From tbluser Where userid = #{value}
  </select>

  <!-- user情報追加 SQL -->
   <insert id="insertNewUser " parameterType="User">
    Insert into tbluser(
      myname,age,phone,email,checkVal
    )Values(
      #{myname},#{age},#{phone},#{email},#{checkVal}
    )
  </insert>
    :
    :
</mapper>

比較的簡潔な定義でO/Rマッピングを行うことが可能ですが、
もし、色々な事情でDBのカラム名とDTOのプロパティ名が違っている場合はどうすればいいでしょう?
実際の業務プロジェクトでは、後でDBのカラム名が変更になるなんてことはザラにあり得る話で、
そうなるとDTO側もプロパティ名を変更しなければならず、影響は少なくありません。

そのような場合は、MyBatisが装備している、resultMapという機能を使用します。
具体的な使用方法は以下の様になります。
<!-- User Mapperインターフェースを指定する -->
<mapper namespace="jp.dip.arimodoki.mapper.UserMapper">
  <!-- DTOプロパティ名とDBのカラム名をマップする -->
  <!-- userResultMap:マップ名 -->
  <!-- User:DTO -->
  <resultMap id="userResultMap" type="User">
    <!-- 個々のプロパティ名とDBカラム名を紐づける -->
    <!-- property:DTOのプロパティ名 -->
    <!-- column:DBのカラム名 -->
    <result property="userid" column="userid" />
    <result property="myname" column="name" /> <!-- property名とcolumn名が異なる -->
    <result property="age" column="age" />
    <result property="phone" column="phone" />
    <result property="email" column="email" />
    <result property="checkVal" column="checkVal" />
  </resultMap>

  <!-- user情報を取得するSQL -->
  <select id="getUser " parameterType="int" resultMap="userResultMap">
  Select * From tbluser Where userid = #{value}
  </select>

  <!-- user情報追加 SQL -->
   <insert id="insertNewUser "parameterType="User">
    Insert into tbluser(
      name,age,phone,email,checkVal
    )Values(
      #{myname},#{age},#{phone},#{email},#{checkVal}
    )
  </insert>
    :
    :
</mapper>

最初の作業量は少し増えますが、resultMapで個々のプロパティ名とDBカラム名をマッピングしておけば
後々、DB側でカラム名が変更されても、このXMLを修正すれば、Java側には影響が少なくて済みます。
注意点としては、
selectタグの resultTypeは、resultMapを使用する場合は、resultMap に変更しないといけません。
parameterTypeは、以前2.x系の頃 parameterMapという属性がありましたが、3.x系では非推奨となっており使用できません。
parameterTypeは残念ながらこれまで通り、DTO名を直接指定しなければなりません。