MybatisPlus延迟加载

延迟加载是一种优化系统性能的技术,主要应用于分布查询中。当不需要立即使用所有数据时,它推迟加载暂时用不到的部分。例如,在学生和教师的例子中,先查询学生信息,只有在需要教师详情时才执行第二步查询。这种方式可以避免不必要的资源浪费,提高查询效率。在实际应用中,可以通过配置MyBatis-Plus的懒加载和侵略性懒加载选项来控制延迟加载的行为。

延迟加载顾名思义,就是加载的时间推迟了,推迟加载的是什么呢,就是目前用不到的数据,延迟加载可以用在分布查询上,就是先查询一个表,再根据这个表里面的信息去查询另一个表的信息,分步查询将两个查询链接起来取得的信息构成返回的数据集,延迟加载就是如果你通过这个这个接口去调用这个分步查询得到的结果,如果你只用的到其中第一步就可以查询出来的信息,那么就不会去执行第二步查询,以此来达到提高系统性能的效果,当你需要用到第二个查询才能得到的数据时,那么这时才会去执行分步查询的第二步。

示例

Entity

@Data
public class Student {
    private Integer id;
    private String name;
    private Integer tid;

    @TableField(exist = false)
    private Teacher teacher;
}
@Data
@TableName("teacher")
public class Teacher {
    @TableId
    private Integer tid;
    private String name;
    @TableField(exist = false)
    private List<Student> students;
}

Mapper

@Mapper
public interface StudentMapper extends BaseMapper<Student> {

    /*分布查询*/
    //查询Student消息
    Student getStudentByStep01(@Param("id") Integer id);

}
@Mapper
public interface TeacherMapper extends BaseMapper<Teacher> {

    //通过tid查询Teacher
    Teacher getTeacherByTid(@Param("tid") Integer tid);
}

mapper.xml

    <!--解决一对多映射关系03  分步查询-->
    <!--Student getStudentByStep01(@Param("id") Integer id);-->
    <select id="getStudentByStep01" resultMap="getStudentByStep02">
        select *
        from student
        where id = #{id};
    </select>

    <resultMap id="getStudentByStep02" type="student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="tid" column="tid"/>
        <!--property属性名  column查询语句的参数-->
        <association property="teacher" column="tid"
                     select="com.lzw.boot.mapper.TeacherMapper.getTeacherByTid"/>

    </resultMap>

    <!--延迟加载策略  -->
    <!--Teacher getTeacherByTid(@Param("tid") Integer tid);-->
    <select id="getTeacherByTid" resultType="teacher" parameterType="integer">
        select *
        from teacher
        where tid = #{tid};
    </select>

application.yml

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml
  type-aliases-package: com.lzw.boot.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    lazy-loading-enabled: true   #延迟加载全局开关
    #    aggressive-lazy-loading 开启时,任何方法的调用都会珈载该对象的所有属性。
    #    否则,每个属性会按需加载  3.4.1之后默认关闭,之前是默认开启
    aggressive-lazy-loading: false
    map-underscore-to-camel-case: true   #映射对象class和数据 进行驼峰命名匹配

测试

1、如果直接查询结果集,而不用,那么只执行分步查询的第一步 

2、如果查询的结果你只用到了第一步就可以得到的数据,那么就不会执行第二步查询

3、如果需要用到第二步查询才能得到的结果,那么才会执行第二部

以上就是延迟查询的效果以及应用,分步查询+延迟加载,在一定情况下可以为我们提升速度,他可以完全避免浪费没有必要的资源,有错误敬请指正!

MyBatis-Plus(简称MP)是基于MyBatis的增强工具库,它提供了一些额外的功能和特性,其中包括延迟加载(Lazy Loading)。 延迟加载是指在查询数据库时,只加载实体对象的部分属性,而不是全部属性。当需要访问未加载的属性时,再去数据库查询并加载这些属性。这样可以减少数据库查询的开销,提高系统性能。 在MyBatis-Plus中,延迟加载的配置与MyBatis的方式类似。首先,需要在实体类中配置需要延迟加载的属性,并在对应的Mapper接口中提供相应的方法。 例如,假设有一个User实体类,其中有一个orders属性需要延迟加载。首先,在User实体类中配置orders属性: ```java public class User { private Long id; private String name; private List<Order> orders; // 延迟加载的属性 // 省略getter和setter方法 } ``` 然后,在对应的Mapper接口中提供查询方法,并使用@Lazy 注解标记需要延迟加载的属性: ```java @Mapper public interface UserMapper extends BaseMapper<User> { @Lazy(value = "orders") User selectUserWithOrders(Long id); } ``` 在上述示例中,通过@Lazy注解将orders属性标记为延迟加载属性。当调用selectUserWithOrders方法查询用户信息时,只会加载User实体对象的部分属性,而orders属性会被延迟加载。当需要访问orders属性时,会再次查询数据库并加载该属性。 需要注意的是,延迟加载需要在MyBatis-Plus的配置文件中开启,并且只对关联查询的属性有效。此外,延迟加载还可以通过配置文件进行全局配置,具体可参考MyBatisMyBatis-Plus的文档。 希望以上信息对你有所帮助!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值