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(最好是单表, 也可以是关联查询), 然后按需加载.