概述
在Mybatis中,通常会进行多表联合查询,但是有的时候并不会立即用到所有的联合查询结果,此时需要一种机制,当需要的时候再查询,这种“按需查询”的机制,就可以使用延迟加载来实现。
延迟加载可以做到,先从单表查询,需要时再从关联表关联查询,这样可以大大提高数据库的性能,因为查询单表要比关联查询多张表速度快。
首先给出javaBean,然后在Mapper映射文件定义查询操作
public class BatchItem {
private int batch_id;
private int cus_id;
private String number;
private Date createtime;
private String note;
private Customer customer;
//set,get
}
public class Customer {
private int cus_id;
private String username;
private String acno;
private String gender;
private String phone;
//set,get
}
在mapper.xml中定义select操作
<select id="lazyLoadTest" resultMap="lazyLoadTestResultMap">
select * from batch
</select>
编写resultMap
<resultMap type="cn.com.mybatis.po.BatchItem" id="lazyLoadTestResultMap">
<id column="batch_id" property="batch_id"/>
<result column="cus_id" property="cus_id"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 实现延迟加载用户信息 -->
<association property="customer" javaType="cn.com.mybatis.po.Customer"
select="findCustomerById" column="cus_id">
</association>
</resultMap>
这里使用association进行关联,其中使用select及column实现延迟加载用户信息。select用来指定延迟加载所需要执行的SQL语句,也就是指定Mapper.xml配置文件中的某个select标签的id,而column是指订单信息中关联用户信息查询的列,这里关联的是用户的主键,即cus_id。最后给出select语句
<select id="findCustomerById" parameterType="int" resultType="cn.com.mybatis.po.Customer">
select * from customer where cus_id=#{id}
</select>
上面的配置会被用来延迟加载的resultMap中的association调用,输入参数就是association中column中定义的字段信息。
在编写测试方法之前,首先开启延迟加载功能,在sqlConfig.xml中配置setting属性
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载(即按需加载) -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
说明:
lazyLoadingEnabled设置全局性懒加载,可设置的值为“false”和”true“。若为false,则所有相关联的数据都会被初始化加载,否则会延迟加载相关的数据
aggressiveLazyLoading设置积极加载,可设置的值为false和true,当设置为true时,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。
测试方法:
@Test
public void TestLazyLoad() throws IOException{
SqlSession sqlSession = dataCon.getSqlSession();
List<BatchItem> list = sqlSession.selectList("bank.lazyLoadTest");
for (BatchItem batchItem : list) {
System.out.println("订单编号:"+batchItem.getNumber());
System.out.println("订购用户姓名:"+batchItem.getCustomer().getUsername());
}
//关闭sqlSession会话
sqlSession.close();
}
只有用到customer这个对象时才会加载它
最后
以上就是纯真柜子为你收集整理的mybatis延迟加载的全部内容,希望文章能够帮你解决mybatis延迟加载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复