你知道Mybatis3.X 懒加载吗-看这个就懂了

什么是懒加载: 按需加载,先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性
,并不是所有场景下使用懒加载都能提高效率
Mybatis懒加载: resultMap里面associationcollection有延迟加载功能

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());//需要的时候直接取值,会得到用户信息
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值