collection映射


講了many2one和one2many,下面來看看get方法。在之前已經說過,如果是映射單對象,直接使用association來映射。而如果關系 是一個集合,則需要使用collection來描述。和association一樣,mybatis不會去管關系是many2many還是 one2many。同理要完成collection映射,也應該有兩種方式,1,發送另一條sql;2,內聯映射。
第一種配置方式:
首先在departmentMapper.xml中添加:
<select id="get" resultMap="departmentmapper" parameterType="long">
    SELECT * FROM department WHERE id =  #{id}
</select>
這只是查詢出一條Department,接下來配置resultMap:
<resultMap type="Department" id="departmentmapper">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="emps" column="id" ofType="Employee" select="cd.itcast.mybatis.mapper.EmployeeMapper.gets" />
</resultMap>
這里配置了collection,在collection中:
1,property:代表集合對應的屬性名稱為emps;
2,column:代表one方的id(配合下面的select就清楚了)
3,ofType:注意,這里的ofType代表的是集合里面的對象類型
4,select:非常重要的一條,我們先看看這條select對應的映射:
<select id="gets" resultType="Employee" parameterType="long">
    SELECT * FROM EMPLOYEE WHERE DEPT_ID = #{id}
</select>
可以看到,這段sql根據外鍵從employee表中查詢所有的匹配給定的department的employee對象。
結合select和column,再聯想之前的association中的select方式,我們可以明白,mybatis的存放策略為:首先執行查詢得 到department結果集,從結果集中得到相關的列,拼裝id和name屬性。當mybatis運行到emps屬性時,會從結果集中,把id得到,並 作為參數傳入cd.itcast.mybatis.mapper.EmployeeMapper.gets,並查詢到該department對應的 employees,最后把employees設置到Department的emps屬性中。
注意這種方式也遵循延遲加載策略,並且容易產生N+1問題。

第二種配置方式,內聯。
<select id="get" resultMap="departmentmapper" parameterType="long">
    SELECT d.*,e.id as eid,e.name as ename FROM
    DEPARTMENT d LEFT JOIN EMPLOYEE e ON e.DEPT_ID = d.id WHERE d.id = #{id}
</select>
    <resultMap type="Department" id="departmentmapper">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
   <collection property="emps" ofType="Employee">
    <id property="id" column="eid"/>
    <result property="name" column="ename"/>
</collection>
</resultMap>
結合前面的解釋,應該很好理解了。

Mybatis學習到此結束,如果你有興趣,可以參照學習!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM