Mybatis的一对多,多对一以及延迟加载

一对多查询

实体类

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的对象时就不会进行处理,只有在你需要使用时才会处理










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值