笔者最近刚刚学习mybatis,然后学习了ResultType和ResultMap,记得书中说稍微复杂的关联就使用resultMap,还告诉我使用resultMap可以不关注字段和属性是否不一样,
然后我潜意识就喜欢在很多情况下使用ResultMap,不用不知道,一用吓一跳,由此引发了血案,笔者花了一上午的时间也没找出来原因,后来还是在老同事的帮助下解决了问题,这里还是要感谢一下那位老同志,下面就来还原一下血案发生的前后。
笔者正在做一个论坛项目。
这里要显示五个数据
main_forum.title,
post.ptitle,
post.reply_num, post.view_num, post.send_date,
后面4个数据都是在一个表中,而第一个数据是在另外的表中,而当前的表和第一个数据所在的表并没有任何关联
必须通过中间一个表建立关联
于是我就在mapper映射中写下了如下的语句
<resultMap type="com.bbs.beans.Post" id="PostResultMap"> <id property="id" column="id" /> <result property="ptitle" column="ptitle" /> <result property="sendDate" column="send_date" /> <result property="replyNum" column="reply_num" /> <result property="viewNum" column="view_num" /> <association property="subForum" javaType="com.bbs.beans.SubForum"> <id property="sid" column="sid" /> <association property="mainForum" javaType="com.bbs.beans.MainForum"> <id property="mid" column="mid" /> <result property="title" column="title" /> </association> </association> </resultMap> <select id="showPost" resultMap="PostResultMap"> SELECT post.ptitle, post.reply_num, post.view_num, post.send_date, main_forum.title FROM post left join sub_forum on post.forum=sub_forum.sid left join main_forum on sub_forum.main_forum=main_forum.mid WHERE 1=1 </select> 三表联查没毛病,坑爹的是我数据库中有4条数据,它只是查出来一条数据。后来改成resultType的方式成功查出4条数据。
<select id="showPost" resultType="Post"> SELECT post.ptitle as "ptitle", post.reply_num as "replyNum", post.view_num as "viewNum", post.send_date as "sendDate", main_forum.title as "subForum.mainForum.title" FROM post left join sub_forum on post.forum=sub_forum.sid left join main_forum on sub_forum.main_forum=main_forum.mid WHERE 1=1 </select>跟第一个resultMap语句少了很多而且又是正确结果,笔者深深认识到实践出真知啊,只怪笔者刚学,被这个书坑惨了。选择resultMap要谨慎,最好使用resultType.
