■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名を直接指定しなければなりません。 |
MyBatisとは ![]() |
1)resultMap方式O/Rマッピング |
![]() |