欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyBatis中延迟加载

程序员文章站 2024-03-26 14:08:17
...

使用延迟加载的意义:

在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询,比多表查询速度要快。

在互联网企业中,如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,在关联查询,当需要关联信息再查询这个叫延迟加载。

resultMap、resultType、延迟加载适用场景:

延迟加载:

延迟加载实现的方法多种多样,在只查询单表就可以满足需求,为了提高数据库查询性能使用延迟加载,再查询关联信息。

mybatis提供延迟加载的功能用于service层。

resultType:

作用:

将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:

常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

resultMap:

使用association和collection完成一对一和一对多高级映射。

association:

作用:

将关联查询信息映射到一个pojo类中。

场合:

为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。

collection:

作用:

将关联查询信息映射到一个list集合中。

场合:

为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。

MyBatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true

下面是一对一的延迟加载测试:(一对多延迟加载的方法同一对一延迟加载,在collection标签中配置select内容
SqlMapConfig.xml配置文件配置延迟加载配置:

<!--全局配置参数-->
<settings>
<!--延迟加载总开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--设置按需加载-->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>

测试:

TbUserMapper.java:

package com.baidu.mapper;

import com.baidu.pojo.TbUser;

import java.util.List;

public interface TbUserMapper {

//延迟加载
List<TbUser> findUserAndDeptlazy();

}

TbUserMapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.baidu.mapper.TbUserMapper">

<resultMap id="findUserAndDeptlazyMap" type="com.baidu.pojo.TbUser">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<!--
select:使用延迟加载的statement
column:你要传递的参数的类名
-->
<association property="tbDept" select="com.baidu.mapper.TbDeptMapper.findDeptById" column="did"></association>
</resultMap>
<select id="findUserAndDeptlazy" resultMap="findUserAndDeptlazyMap">
SELECT * FROM tb_user
</select>

</mapper>

TbDeptMapper.java:

package com.baidu.mapper;

import com.baidu.pojo.TbDept;

import java.util.List;

public interface TbDeptMapper {

TbDept findDeptById(Integer id);
}

TbDeptMapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baidu.mapper.TbDeptMapper">

<select id="findDeptById" resultType="tbDept" parameterType="int">
SELECT * FROM tb_dept where id=#{id}
</select>

</mapper>

测试方法:

public class Test1 {

SqlSession session=null;

@Before
public void myBefore() throws Exception{
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
session = sessionFactory.openSession();

}

@Test
public void test3(){
TbUserMapper mapper = session.getMapper(TbUserMapper.class);
List<TbUser> list = mapper.findUserAndDeptlazy();
for (TbUser tbUser:list){
Integer id = tbUser.getTbDept().getId();
System.out.println(id);
}
}