mybatis でいくつかの問題に遭遇しました。これは私の構成です:
PostMapper.xml
<mapper namespace="com.king.model.PostMapper">
<select id="selectById" parameterType="int" resultMap="postMap">
select * from posts where id = #{id}
</select>
<select id="selectAll" resultType="hashmap">
select * from posts order by created_at desc
</select>
<resultMap id="postMap" type="Post">
<result property="createDate" column="created_at" />
<result property="updateDate" column="updated_at" />
</resultMap>
</mapper>
CommentMapper.xml
<mapper namespace="com.king.model.CommentMapper">
<select id="selectById" parameterType="int" resultMap="commentMap">
select * from comments where id = #{id} order by id desc
</select>
<select id="selectAll" resultMap="commentMap">
select * from comments
</select>
<select id="selectByPost" resultMap="commentMap" parameterType="int">
select * from comments where post_id=#{id}
</select>
<resultMap id="commentMap" type="Comment">
<result property="createDate" column="created_at" />
<result property="updateDate" column="updated_at" />
<association property="post" column="post_id" javaType="Post" select="com.king.model.PostMapper.selectById" />
</resultMap>
</mapper>
public class Post {
private int id;
private String title;
private String body;
private Date createDate;
private Date updateDate;
private List<Comment> comments;
}
public class Comment {
private int id;
private String commenter;
private String body;
private Post post;
private Date createDate;
private Date updateDate;
}
CommentDao で:
public List<Comment> listForPost(Post post) {
return getSqlSession().selectList("com.king.model.CommentMapper.selectByPost", post.getId());
}
次に、コントローラーで、特定の投稿に対するすべてのコメントを一覧表示しようとします。
List<Comment> coms = commentDao.listForPost(post);
post.setComments(coms)
そして、上記のコードが2つのSQL選択ステートメントをトリガーすることがわかりました:
select * from comments where post_id=?
select * from posts where id = ?
ただし、mybatis 3 ガイドでは、このスイートでは "N+1" 問題が発生することが明記されています。
選択されたコメントごとに、詳細 (投稿) の選択ステートメントがトリガーされます。
ただし、ここでは 2 つだけ選択します。
どうしたの?
また、mybatis では、1 対多または多対多の関連付けに対して、リレーションを双方向または単方向として設定する必要がありますか?