mybatis延迟加载

问题出现

由于多表查询相对于单表查询是非常消耗时间的,所以就出现了延迟加载的方法,首先延迟加载,先从单表开始查询,在查询对应多表的数据,单表查询速度比多表查询块,所以延迟加载是可以提升数据查询速度


延迟加载的实现

使用resultMap实现高级映射,也就是使用association或者collection

实现延迟加载需要开启mybatis延迟加载的开关,和关闭积极加载(也就是按需加载)
lazyLoadingEnable:延迟加载开关,默认关闭,所以想要延迟加载必须开启。
aggressiveLazyLoading:积极加载,默认开启,所以需要关闭,关闭后就是按需求来进行加载。

Mybatis配置文件加入

<settings>
	<!-- 打开延迟加载开关 -->
	<setting name="lazyLoadingEnabled" value="true"/>
	<!-- 关闭积极加载,就是按需加载 -->
	<setting name="aggressiveLazyLoading" value="false"/>
</settings>


代码实例

UserVo.java就是我们需要获取的user信息和food信息,直接查询必然会出现多表查询
这里我们具体实现就是先加载user信息,而food信息进行延迟加载

package com.my.shiro.Entity;

public class UserVo {
	
	private static final long serialVersionUID = 1L;
	private String username;
	private String password;
	private String permission;
	
	private Food food;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPermission() {
		return permission;
	}

	public void setPermission(String permission) {
		this.permission = permission;
	}

	public Food getFood() {
		return food;
	}

	public void setFood(Food food) {
		this.food = food;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
}


UserMapper.xml   resultMap实现延迟加载需要的配置

<resultMap id="LazyLoading" type="com.my.shiro.Entity.UserVo" >
	    <id column="username" property="username" jdbcType="VARCHAR" />
	    <result column="password" property="password" jdbcType="VARCHAR" />
		<result column="permission" property="permission" jdbcType="VARCHAR" />
		
		<!-- 用于延迟加载 
			select中的statement的id:比如findpassword,如果不在同一个mapper中就应该加上全限定名
			colum关联信息 -->
		<association property="food" javaType="com.my.shiro.Entity.Food" 
			select="com.my.shiro.Dao.FoodMapper.findFoodByUsername" 
			column="username">
		</association>
		<!-- <collection property=""></collection> -->
	</resultMap>
  
这里使用association实现延迟加载
这里主要有4的属性

property:这里的这个属性对应的是UserVo中的food
javaType:延迟加载数据类型
select:延迟加载需要使用的方法对应的statement的id也就一个sql方法对应的id,这里需要注意的是如果这个sql不再该mapper.xml中那么需要加上这个sql的namespace
colum:关联信息,也就是我们通常多表关联的信息

resultMap的使用

<select id="findUserAndFood" resultMap="LazyLoading">
		select * from user;
	</select>
这里先会执行select * from user 查询到信息,再通过resultMap中配置的association来执行findFoodByUsername对应的sql,从而实现延迟加载
findFoodByUsername

<select id="findFoodByUsername" parameterType="java.lang.String" resultType="com.my.shiro.Entity.Food">
		select * 
		from food 
		where username = #{username}
	</select>

这里的parameter可以看做resultMap中的association中的colum对应的值,也就是关联属性
在这里我遇到一个问题就是当parametreType为sting的时候不可以写成下面的格式

<where>
	 <if test="username != null and username != ''">
	    	and username = #{username}
	 </if>
</where>


其实上面sql可以看作,这里避免了多表之间的查询

select username,password,
(select price from food where username = user.username)price,
(select name from food where username = user.username)name
from user
至于 collection使用法大体上是相似的





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值