什么是懒加载: 按需加载,先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性
能,并不是所有场景下使用懒加载都能提高效率
Mybatis懒加载: resultMap里面的association、collection有延迟加载功能
1、创建数据库
视频表
DROP TABLE IF EXISTS `video_order`;
CREATE TABLE `video_order` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`out_trade_no` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单唯一标识',
`state` int NULL DEFAULT NULL COMMENT '0表示未支付,1表示已支付',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '订单生成时间',
`total_fee` int NULL DEFAULT NULL COMMENT '支付金额,单位分',
`video_id` int NULL DEFAULT NULL COMMENT '视频主键',
`video_title` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '视频标题',
`video_img` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '视频图片',
`user_id` int NULL DEFAULT NULL COMMENT '用户id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 39 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
用户表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '昵称',
`pwd` varchar(124) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`head_img` varchar(524) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',
`phone` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '手机号',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `phone`(`phone`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
2、在mybatis-config.xml文件中配置懒加载开关
<settings>
<!--延迟加载总开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将aggressiveLazyLoading设置为false表示按需加载,默认为true-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
3、Mapper文件中创建懒加载方法
/**
* 查询全部订单,关联用户信息 懒加载
* @return
*/
List<VideoOrder> queryVideoOrderListLazy();
4、在Mapper文件中配置懒加载所需SQL语句
<resultMap id="VideoOrderResultMapLazy" type="VideoOrder">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="out_trade_no" property="outTradeNo"/>
<result column="create_time" property="createTime"/>
<result column="state" property="state"/>
<result column="total_fee" property="totalFee"/>
<result column="video_id" property="videoId"/>
<result column="video_title" property="videoTitle"/>
<result column="video_img" property="videoImg"/>
<!--配置需要懒加载的类 懒加载-->
<association property="user" javaType="User" column="user_id" select="findUserByUserId"/>
</resultMap>
<!--一对一管理查询订单, 订单内部包含用户属性 懒加载-->
<select id="queryVideoOrderListLazy" resultMap="VideoOrderResultMapLazy">
select
o.id id,
o.user_id ,
o.out_trade_no,
o.create_time,
o.state,
o.total_fee,
o.video_id,
o.video_title,
o.video_img
from video_order o
</select>
<select id="findUserByUserId" resultType="User">
select * from user where id=#{id}
</select>
5、测试懒加载
public class SqlSessionDemo {
public static void main(String [] args) throws IOException {
//获取配置文件
String resouce = "config/mybatis-config.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resouce);
//构建Session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Session
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
// resultmap association关联查询(测试懒加载)
VideoOrderMapper videoOrderMapper = sqlSession.getMapper(VideoOrderMapper.class);
List<VideoOrder> videoOrderList = videoOrderMapper.queryVideoOrderListLazy();
System.out.println(videoOrderList.size());
for(VideoOrder videoOrder : videoOrderList){
System.out.println(videoOrder.getVideoTitle());//只会获取到视频的相关信息
System.out.println(videoOrder.getUser().getName());//需要的时候直接取值,会得到用户信息
}
}
}
}