MyBatis中延迟加载
使用延迟加载的意义:
在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询,比多表查询速度要快。
在互联网企业中,如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,在关联查询,当需要关联信息再查询这个叫延迟加载。
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);
}
}
下一篇: (4)hibernate延迟加载
推荐阅读
-
MyBatis中延迟加载
-
js 延迟加载的方式有哪些?
-
(4)hibernate延迟加载
-
hibernate基础(十):延迟加载(懒加载)
-
Mybatis延迟加载配置
-
Mybatis延迟加载:association和collection实现延迟加载
-
【转】Java程序员的日常 —— Java类加载中的顺序 博客分类: JVM java虚拟机 jvm 类加载
-
【转】Java程序员的日常 —— Java类加载中的顺序 博客分类: JVM java虚拟机 jvm 类加载
-
Java 从Jar文件中动态加载类 博客分类: java java
-
Java 从Jar文件中动态加载类 博客分类: java java