0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MyBatisのcollectionの書き方

Posted at

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の書き方で躓いた方には参考にしていただきたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?