由于多表查询相对于单表查询是非常消耗时间的,所以就出现了延迟加载的方法,首先延迟加载,先从单表开始查询,在查询对应多表的数据,单表查询速度比多表查询块,所以延迟加载是可以提升数据查询速度。
使用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中的foodjavaType:延迟加载数据类型select:延迟加载需要使用的方法对应的statement的id也就一个sql方法对应的id,这里需要注意的是如果这个sql不再该mapper.xml中那么需要加上这个sql的namespacecolum:关联信息,也就是我们通常多表关联的信息
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)namefrom user至于collection使用法大体上是相似的
新闻热点
疑难解答