MyBatis

Mybatis延迟加载

如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 所以延迟加载即先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

也就是说当不需要两个表进行关联的是时候,就不会进行关联,只在一张表上查询。需要关联时根据第一张表中的外码查询第二张表中的数据。

IDEA配置

mybatis默认没有开启延迟加载,需要在conf.xml中setting配置。

<setting name="lazyLoadingEnabled" value="true"/>
        <!-- 将积极加载改为消极加载,即延迟加载 -->
 <setting name="aggressiveLazyLoading" value="false"/>

再mapper.xml文件中,我们需要在association 或者collection中添加select标签和column标签,select标签指定使用哪个语句查询,column则根据第一张表中存储的外码,输入到这个语句中查询。

<select id="queryAllByNameLazyLoad" resultMap="student_card_map_lazy">
        select * from person where  name=#{name}
    </select>
    <select id="queryCardById" resultType="com.cztcode.mybatis.Card">
        select * from  person_card where card_id=#{card_id}
    </select>

    <resultMap id="student_card_map_lazy" type="Person">
        <id property="id" column="id"/>
        <result property="age" column="age"/>
        <result property="name" column="name"/>
        <association property="card" javaType="Card" select="queryCardById" column="card_id">
        </association>
    </resultMap>

实现效果:

不使用延迟加载时,查询第一张表的内容也会把第二张表关联上去,耗费时间。

image 36

使用延迟加载,查询第一张表的内容

image 37

当我们使用延迟加载后,如果查询第二张表的内容。会进行两次查找。

image 35

发表评论