MyBatisのcollection
の書き方でつまづいたので備忘録として残しておく。
今回はmyBatisの設定やcollection以外の書き方には触れません。
MyBatisでは、一対多の関係の場合は以下のようにマッピングできる。
例えばusersテーブルとbooksテーブルが一対多の関係にあるような場合です。
エンティティ:User
User.java
public class User {
private Integer id;
private String name;
private List<Book> bookList;
}
エンティティ:Book
Book.java
public class Book {
private String title;
}
Mapper XML:userMapper
userMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<!-- ユーザーと所有している本を取得 -->
<select id="selectUserWithBooks" resultMap="UserWithUserBooks">
SELECT u.id as userId, u.name as userName,
b.title
FROM users u
LEFT JOIN books b ON u.id = b.user_id
</select>
<!-- ResultMapで一対多のマッピング -->
<resultMap id="UserWithBookMap" type="com.example.model.User">
<id column="userId" property="id"/>
<result column="userName" property="name"/>
<!-- 一対多の関係をマッピング -->
<collection property="books" ofType="com.example.model.Book">
<id column="bookId" property="bookId"/>
<result column="title" property="title"/>
</collection>
</resultMap>
</mapper>
一対多のマッピングの場合、調べたら上記のようなxmlの書き方が出てきて実際に試してみたが、自分の環境では、以下のようにエラーが出てしまった。
The element type "resultMap" must be terminated by the mathing end-tag"</resultMaP>"
Remove "</collection>"
試しに</collection>を削除してみたがダメだった。
以下のように修正する必要があった。
userMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<!-- ユーザーと所有している本を取得 -->
<select id="selectUserWithBooks" resultMap="UserWithUserBooks">
SELECT u.id as userId, u.name as userName,
b.title as title
FROM users u
LEFT JOIN books b ON u.id = b.user_id
</select>
<!-- ResultMapで一対多のマッピング -->
<resultMap id="UserWithBookMap" type="com.example.model.User">
<id column="userId" property="id" jdbcType="Integer"/>
<result column="userName" property="name" jdbcType="String"/>
<!-- 一対多の関係をマッピング -->
<collection property="books" resultMap="bookResultMap">
</resultMap>
<resultMap id="bookResultMap" type="com.example.model.Book">
<result column="title" property="title" jdbcType="String"/>
</resultMap>
</mapper>
自分のようにcollection
の書き方で躓いた方には参考にしていただきたい。