MyBatis优化之延迟加载实例
什么是延迟加载:
在MyBatis中经常会进行多表查询,但是有的时候不会立即用到所有的联合查询结果。例如查询一个游戏玩家的基本信息,这个时候并不会去用这个玩家个人仓库里的物品列表,等到玩家去交易或者取/拿物品时才会查询,这种按需查询的机制就是延迟加载,合理利用延迟加载可以大大提高系统的查询效率;
如何实现:
首先我们要在MyBatis的全局配置setting中加入这两个玩意儿:
<!--设置是否启用懒加载/延迟加载,不启用的话,所有相关联的数据都会被初始化加载"/>
-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--按需加载/消极加载开关 延迟加载也需要开启,默认为积极true-->
<setting name="aggressiveLazyLoading" value="false"/>
然后在Mapper映射文件中整一个查询:
<!--咱们这里虚空查询,假设有这么一张User表,关联了另外一张仓库表warehouse-->
<select id="findUser" resultMap="UserLazyLoading" >
SELECT
*
FROM
User
</select>
然后是重头戏resultMap:
<resultMap id="UserLazyLoading" type="User">
<id column="u_id" property="u_id" />
<result column="u_name" property="u_name"/>
<!--这里用select关联了另外一条sql语句-->
<association property="warehouse" javaType="WareHouse"
select="findWareHouseByid" column="u_id"
</association>
</resultMap>
延迟加载要执行的SQL:
<select id="findWareHouseByid" parameterType="int" resultType="wareHouse">
SELECT
*
FROM
wareHouse
WHERE
u_id=#{id}
</select>
最后整个测试类测试一下:
emmm,表都没有怎么测
算了。。。。
最后我们总结一下延迟加载的实现步骤:
- 执行mapper方法,只进行单表查询(我们例子中只进行了user基本信息的查询);
- 当我们实际调用时,用到了仓库信息,这个时候去执行延迟加载;
- 进行延迟加载,把我们关联的SQL执行,获取仓库里面的玩意儿;
ok完事儿!最后强调:用好延迟加载可以大大优化MyBatis查询效率!!!