MyBatis 一對多映射
阿新 • • 發佈:2019-03-21
一個 simple sta password 精通 type lec 多條 iat
From《MyBatis從入門到精通》
<!-- 6.1.2.1 collection集合的嵌套結果映射 和association類似,集合的嵌套結果映射就是指通過一次SQL查詢將所有的結果查詢 出來,然後通過配置的結果映射,將數據映射到不同的對象中去。在一對多的關系中,主 表的一條記錄對對應關聯表中的多條數據,因此一般查詢時會查詢多個結果,按照一對多 的數據結構存儲數據的時候,最終的結果數會小於等於查詢的總記錄數。 --><resultMap id="userRoleListMap" type="tk.mybatis.simple.model.SysUser" extends="userMap"> <id property="id" column="id"/> <result property="userName" column="user_name"/> <result property="userPassword" column="user_password"/> <result property="userEmail" column="user_email"/> <result property="userInfo" column="user_info"/> <result property="headImg" column="head_img"/> <result property="createTime" column="create_time"/> <collection property="roleList" columnPrefix="role_"javaType="tk.mybatis.simple.model.SysRole"> <id property="id" column="id"/> <result property="roleName" column="role_name"/> <result property="enabled" column="enabled"/> <result property="createBy" column="create_by"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> </collection> </resultMap> <!--最終簡化版本--> <resultMap id="userRoleListMap" extends="userMap" type="tk.mybatis.simple.model.SysUser"> <collection property="roleList" columnPrefix="role_" resultMap="tk.mybatis.simple.mapper.RoleMapper.roleMap"/> </resultMap> <!-- 解讀: 我忽視了一個問題,數據庫呈現查詢結果是通過記錄數~~~ 通過日誌可以清楚的看到,SQL執行的結果數有3條,後面輸出的用戶數是2,也就是說 本來查詢出的3條結果經過MyBatis對collection數據處理後,變成了兩條。一個用戶 擁有多個角色,查詢到的記錄中,是通過記錄數呈現的。但是MyBatis又怎麽知道要處理 成這樣的結果呢? 先來看看MyBatis是如何知道要合並admin的兩條數據的: MyBatis在處理結果的時候,會判斷結果是否相同,如果相同的結果,則只會保留第一個結果 所以這個問題的關鍵點就是MyBatis如何判斷結果是否相同。MyBatis判斷結果是否相同時, 最簡單的情況就是在映射配置中至少有一個id標簽: <id property="id" column="id"> 我們對id(構造方法中為idArg)的理解一般是,它配置的字段為表的主鍵(聯合主鍵時可以配置 多個id標簽),因為MyBatis的resultMap只用於配置結果如何映射,並不知道這個表的具體如何。 id的唯一作用就是在嵌套的映射配置時判斷數據是否相同,當配置id標簽時,MyBatis只需要逐條 比較所有數據中id標簽配置的字段值是否相同即可。在配置嵌套結果查詢時,配置id標簽可以提高 處理效率。 --> <!-- 6.1.2.2 collection集合的嵌套查詢 -->
MyBatis 一對多映射