Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载

发布时间:2017-7-9 7:22:09编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载 ",主要涉及到Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载 方面的内容,对于Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载 感兴趣的同学可以参考一下。

1.什么是延迟加载

resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

需求:

如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查下用户信息。把对用户信息的按需去查询就是延迟加载。

延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

2.使用association实现延迟加载

2.1需求

查询订单并且关联查询用户信息

2.2mapper.xml

需要定义两个mapper的方法对应的statement。

(1)只查询订单信息

SELECT * FROM orders

在查询订单的statement中使用association去延迟加载(执行)下边的statement(关联查询用户信息)。

  <!-- 查询订单关联查询用户  -->    <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">        SELECT * FROM orders    </select>

(2)关联查询用户信息

通过上边查询到的订单信息中user_id去关联查询用户信息

使用UserMapper.xml中的findUserById

   <select id="findUserById" parameterType="int" resultType="user">        select * from user where id=#{value}    </select>

上边先去执行findOrdersUserLazyLoading,当需要去查询用户的时候再去执行fingUserById,通过resultMap的定义将延迟加载执行配置起来。

2.3 延迟加载resultMap

使用association中的select指定延迟加载去执行的statement的id。

<!-- 延迟加载的resultMap  -->    <resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersUserLazyLoadingResultMap">        <!-- 1.对订单信息进行映射配置 -->        <id column="id" property="id"/>        <result column="user_id" property="userId"/>        <result column="number" property="number"/>        <result column="createtime" property="createtime"/>        <result column="note" property="note"/>        <!-- 2.实现对用户信息进行延迟加载 -->        <!-- select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)                要使用UserMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,               如果findUserById不在本mapper中需要前边加namespace。             column:订单信息中关联用户信息查询的列,是user_id              关联查询的sql理解为:             SELECT 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="joanna.yan.mybatis.entity.User"            select="joanna.yan.mybatis.mapper.UserMapper.findUserById" column="user_id">        </association>    </resultMap>

2.4mapper.java

    //查询订单关联查询用户,用户信息时延迟加载    public List<Orders> findOrdersUserLazyLoading() throws Exception;

2.5测试

2.5.1测试思路

(1)执行上边mapper方法(findOrdersUserLazyLoading),内部去调用joanna.yan.mybatis.mapper.OrdersCustomMapper中findOrdersUserLazyLoading只查询orders信息(单表)。

(2)在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser()时,开始进行延迟加载。

(3)延迟加载,去调用UserMapper.xml中findUserById这个方法获取用户信息。

2.5.2延迟加载配置

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

在mybatis核心配置文件中配置:

lazyLoadingEnabled、aggressiveLazyLoading


上一篇:include require的区别
下一篇:java:RandomAccessFile随机读取文件内容

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款