mybatis当中的延迟加载

mybatis之中的延迟加载

定义: 

  我们查询数据表信息的时候, 有时候可能要关联查询多张表才能得到结果, 但是有时候我们不需要全部查询,

当我们需要查看某些表信息的时候我们才希望进行查询, 这样实现按需查询的操作就是延迟加载.

意义:

  先从单表查询, 当需要时再关联表去查询, 这样大大提高数据库的性能, 因为查询单表比关联查询多张表的速度要快.

使用条件:

  resultMap可以实现高级查询, 其中的association和collection标签分别实现一对一, 一对多映射, 这两个标签具备延迟加载的功能.

需求:

  查询订单信息, 关联查询用户信息, 其中用户信息需要延迟加载.

xml文件:

  <resultMap id="OrdersUserLazyLoadingResultMap" type="Order类的全类名">

    <!-- 配置订单信息 -->

    <id column="" property="" />

    <result column="" property="" />

    <!-- 配置用户信息(需要延迟加载)

      select: 指定延迟加载需要执行的statement(即sql)的id(是根据user_id查询用户信息的statement)

        如果不在同一个xml中或者不在同一个namespace中, 需要指定为namespace.statement的id

      column: 订单信息中关联用户信息查询的列, 即user_id

      本例关联查询的sql:

      SELECT * FROM orders.*,

        (SELECT username FROM USER WHERE orders.user_id=user.id) username,

        (SELECT sex FROM USER WHERE orders.user_id=user.id) sex

      FROM orders

     -->

    <association property="user" javaType="User类的全类名" select="namespace.findUserById" column="user_id"></association>

  </resultMap>

  <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">

    SELECT * FROM orders

  </select>

上面延迟加载的执行顺序:

  先执行findOrdersUserLazyLoading查询出List<Orders>, 当调用getUser()方法时, 开始进行延迟加载, 

执行findUserById获取用户信息. 

 

配置:

  mybatis默认不开启延迟加载, 需要在sqlMapConfig.xml中的setting标签中进行配置

<settings>

  <!-- 打开延迟加载的开关 -->

  <setting name="lazyLoadingEnabled" value="true" />

  <!-- 将积极加载改成消极加载, 即按需加载 -->

  <setting name="aggressiveLazyLoading" value="false" />

</settings>

 

思考: 不使用Mybatis提供的association和collection中的延迟加载功能, 如何实现延迟加载?

  方法: 定义两个mapper方法

  1. 查询订单列表;

  2. 根据用户id查询用户信息

实现思路: 先去查询第一个mapper方法, 获取订单信息列表, 然后在程序中(service), 按需去调用第二个mapper方法查询用户信息.

总之: 先查询简单的sql(最好是单表, 也可以是关联查询), 然后按需加载.

 

 

 

 

posted @ 2017-02-25 20:14  半生戎马,共话桑麻、  阅读(147)  评论(0)    收藏  举报
levels of contents