您好,登錄后才能下訂單哦!
延續(xù)mybatis的一對一問題,還是上面一對一舉得那個例子(http://fengcl.blog.51cto.com/9961331/1875657),
如果一個用戶有多個作品怎么辦?這就涉及到了一對多的問題。同樣的,mybatis一對多依然可以分為兩種方式來解決。
一、使用內(nèi)嵌的ResultMap實(shí)現(xiàn)一對多映射
1)實(shí)體
public class User implements Serializable{ private static final long serialVersionUID = 112596782083832677L; private Integer id; //編號 private String email; //郵箱 private String realName; //真實(shí)姓名 private String telephone; //電話號碼 private List<WorksInfo> worksInfos; //作品 //get,set方法 ... } public class WorksInfo implements Serializable{ private Integer id; private Integer userId; private Date uploadDate; //上傳時間 private Date updateDate; //更新時間 //get,set方法 ... }
2)dao接口省略...
3)mapper映射文件
<resultMap type="com.tarena.djs.entity.WorksInfo" id="worksInfoResultMap"> <id column="id" property="id" /> <result column="uploadDate" property="uploadDate" /> <result column="updateDate" property="updateDate" /> </resultMap> <resultMap type="com.tarena.djs.entity.User" id="UserResult"> <id column="id" property="id" /> <result column="email" property="email" /> <result column="telephone" property="telephone" /> <result column="realName" property="realName"/> <collection property="worksInfos" resultMap="worksInfoResultMap" /> </resultMap> <select id="findTutorById" parameterType="int" resultMap="UserResult"> select u.*,w.* from user u left join worksInfo w on u.id = w.userId where u.id = #{id} </select>
4)測試省略
二、嵌套查詢方式實(shí)現(xiàn)一對多
1)實(shí)體類如上
2)dao層接口省略
3)mapper文件映射
<resultMap type="com.tarena.djs.entity.WorksInfo" id="worksInfoResultMap"> <id column="id" property="id" /> <result column="uploadDate" property="uploadDate" /> <result column="updateDate" property="updateDate" /> </resultMap> <select id="findWorksInfoByUserId" parameterType="int" resultMap="worksInfoResultMap"> select * from worksInfo where userId = #{userId} </select> <resultMap type="com.tarena.djs.entity.User" id="UserResult"> <id column="id" property="id" /> <result column="email" property="email" /> <result column="telephone" property="telephone" /> <result column="realName" property="realName"/> <collection property="worksInfos" columns="id" select="findWorksInfoByUserId" /> </resultMap> <select id="findUserByUserId" parameterType="int" resultMap="UserResult"> select * from user where id = #{id} </select>
4)測試方法忽略
注意:collention元素里的column屬性,即主表中要傳遞給副表做查詢的條件,例如本例中:
<collection property="worksInfos" columns="id" select="findWorksInfoByUserId" />
及時將user表中的id字段傳遞給findWorksInfoByUserId方法做參數(shù)使用的,對應(yīng)worksInfo表中的userId字段。除此之外,嵌套select語句會導(dǎo)致N+1的問題。首先,主查詢將會執(zhí)行(1 次) ,對于主
查詢返回的每一行,另外一個查詢將會被執(zhí)行(主查詢 N 行,則此查詢 N 次) 。對于
大型數(shù)據(jù)庫而言,這會導(dǎo)致很差的性能問題。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。