Mybatis的一對多,多對一以及延遲載入
阿新 • • 發佈:2019-01-07
一對多查詢
實體類
package com.zucc.model; import java.util.List; public class District{ private Integer did; private String dname; private List<Street> streets; public Integer getDid() { return did; } public void setDid(Integer did) { this.did = did; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } <span style="white-space:pre"> </span>public List<Street> getStreets() { <span style="white-space:pre"> </span>return streets; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void setStreets(List<Street> streets) { <span style="white-space:pre"> </span>this.streets = streets; <span style="white-space:pre"> </span>} }
配置檔案
<resultMap type="com.zucc.model.District" id="districtResultMap"> <id column="did" property="id"/> <result column="dname" property="name"/> <collection property="streets" ofType="cn.wd.entity.Street" column="district_id"> <id column="sid" property="id"/> <result column="sname" property="name"/> </collection> </resultMap> <select id="findAllDistrictById" parameterType="int" resultMap="districtResultMap" > select d.*,s.* from district d,street s where s.district_id=d.did and d.did=#{id} </select>
多對一
實體類
package com.zucc.model; public class Street { private Integer sid; private String sname; private Integer disId; private District district; public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Integer getDisId() { return disId; } public void setDisId(Integer disId) { this.disId = disId; } public District getDistrict() { return district; } public void setDistrict(District district) { this.district = district; } }
配置檔案
<resultMap type="com.zucc.model.Street" id="StreetResultMap">
<id column="sid" property="sid"/>
<result column="sname" property="sname"/>
<association property="district" javaType="com.zucc.model.District">
<id column="did" property="did"/>
<result column="dname" property="dname"/>
</association>
</resultMap>
<select id="findStreetById" parameterType="int" resultMap="StreetResultMap">
select d.*,s.* from district d,street s where d.did=s.district_id and s.sid=#{id}
</select>
總結:
在MyBatis進行查詢對映的時候,其實查詢出來的每一個屬性都是放在一個對應的Map裡面的,其中鍵是屬性名,值則是其對應的值。
使用association和collection完成一對一和一對多高階對映。
association:將關聯查詢資訊對映到一個pojo物件中。
collection:將關聯對映資訊對映到一個集合中。
延遲載入
延遲載入(Lazy Load)實現的功能很好理解,就是在資料與物件進行Mapping操作時,只有當真正使用該物件時,才進行Mapping操作,以減少不必要的資料庫查詢開銷,從而提升了程式的效率。
首先進行配置
<!-- 全域性配置引數,需要時再設定 -->
<settings>
<!-- 開啟延遲載入的開關 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 將積極載入改為消極載入即按需載入 -->
<setting name="aggressiveLazyLoading" value="false" />
</settings>
在Street的配置檔案中修改<resultMap type="com.zucc.model.Street" id="StreetResultMapLazyLoadingMap">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<association property="district" javaType="com.zucc.model.District"
select="cn.wd.dao.DistrictMapper.findAllDistrictById" column="district_id">
</association>
</resultMap>
<select id="selectStreetLazyLoading" parameterType="int" resultMap="StreetResultMapLazyLoadingMap">
<span style="white-space:pre"> </span>select * from street where sid=#{id}
</select>
這樣一來,當你不需要使用District的物件時就不會進行處理,只有在你需要使用時才會處理