Mybatis延迟加载

℡╲_俬逩灬. 提交于 2020-02-07 03:43:09

1、 mybaatis延迟加载

1.1、什么是延迟加载
延迟加载:先查询单表,需要时再从关联表查询,有利于提高性能,因为查询单表要比查询多表快。
resultMap可以实现高级映射(使用association和collection实现),association和collection具有延迟加载功能。mybatis高级映射及association和collection的用法
需求:
如果查询订单并关联查询用户信息,若个先查询订单信息即可满足需求,当我们需要查询用户信息时再查询用户信息。把对用户信息的查询按需去查询就是延迟加载。

1.2、使用assocication实现延迟加载

1.2.1、需求
查询订单并且关联查询用户信息。

1.2.2、mapper.xml
需要定义两个mapper的方法对应的statement。
(1)只查询订单信息
在查询订单的statement中使用association去延迟加载 下边的statement关联查询用户信息

<select id="selectOrdersLazyLoading" resultMap="selectOrdersMap">
	    select * from orders
	</select>

(2)只查询用户信息
通过上边查询到的订单信息中userId去关联查询用户信息

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

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

<select id="selectUserById" parameterType="int" resultType="user">
    select * from user where id=#{value}
</select>
	
	<!-- 实现延迟加载的resultMap -->
	<resultMap type="com.shuai.po.Orders" id="ordersMap">
	    <!-- 对订单信息映射配置 -->
	    <id column="id" property="id"/>
	    <!-- 实现对用户信息延迟加载 
	        select:指定延迟加载需要执行的statement的id(是根据userId查询用户信息的statement),
	        column:订单信息中关联用户信息的列,即userId
	    -->
	    <association property="user" javaType="com.shuai.po.User" select="selectUserById" column="">
	    </association>
	</resultMap>
	<!-- 查询订单关联查询用户,用户信息需要延迟加载  -->
	<select id="selectOrdersLazyLoading" resultMap="userId">
	    select * from orders
	</select>

1.2.3、mapperj接口

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

1.2.4、延迟加载配置
在mybatis全局配置xml中配置延迟加载的属性

<settings>
        <!-- 打开延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 设置按需加载 -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

1.2.5、测试
在执行selectOrdersLazyLoading获得订单信息时并不会执行查询用户信息的语句
当使用Orders中的user属性时将触发延迟加载,查询用户信息

@Test
	public void test() {
		 SqlSession sqlSession=sf.openSession();
		 //创建代理对象
		 OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
		 //调用接口的方法
		 try {
			 
			List<Orders> list = ordersMapperCustom.selectOrdersLazyLoading();
			//System.out.println(list);  //触发了延迟加载
			//通过getUser出发延迟
			for(Orders orders:list) {
				User user=orders.getUser();
				System.out.println(user);
			}
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 sqlSession.close();
	}

结果:
当注释掉遍历输出时,没有直接执行查询用户的sql,只执行了查询订单的信息
在这里插入图片描述
当运行掉遍历输出时,直接执行查询用户的sql获取了用户信息(需要时执行)
在这里插入图片描述
1.2.6、延迟 思考

不使用mybaits提供的association即collection的延迟加载功能,如何实现延迟加载

方法:
定义两个mapper方法:
1、查询订单列表
2、根据用户id查给用户信息
实现思路:
先查询一个mapper方法,获取订单信息列表
在程序中(service),按需去调用第二个mapper方法去查询用户信息

总结:
使用延迟加载方法,先查询简单的dql(最好单表),再去按需加载关联查询的其它信息。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!