Mybatis延迟加载(懒加载)

一、什么是延迟加载

将采用高级映射实现多表联查时向数据库发出的SQL语句拆分成若干条单表查询的SQL语句,当需要返回数据时才会向数据库发出只针对当前数据的SQL语句。

    1、延迟加载的条件

            使用resultMap高级映射(主要体现在与元素association、collection实现一对一及一对多映射上),association、collection具备分层查询的功能,间接具备了实现延迟加载的属性。

    2、延迟加载的好处:

            先从单表查询、需要时再从关联表去关联查询,提升数据库性能,因为查询单表要比关联查询多张表速度要快,内存资源占用更少。但是很少使用,内存不够就加内存,毕竟能用钱解决的事情就别烧脑。

二、延迟加载的实例:

          需求:根据订单编号,查询订单,并返回订单详情描述信息

            将需求拆分成三部分,查询订单并且关联查询用户信息及订单详情。如果值查询订单信息即可满足要求,那么只发送查询订单信息的SQL语句;当我们需要查询用户信息,且需要查看用户信息时,只需要再分别发送查询订单信息和用户信息的SQL语句;当用户需要查看所有信息时,在之前的查询结果基础上,追加发出一条查询订单详情的SQL语句,在这里用户信息的按需查询就是延迟加载。

实现延迟加载的前提条件

在settings中配置与延迟加载有关的属性.


	
	
	

Mybatis延迟加载(懒加载)_第1张图片

下面是XML的映射文件LazyLoadingMapper.xml




	
	
		
		
		
		
		
		
		
		
	
	
	
	
	
	
	
	
	

注意两点:

            1、元素association、collection中的colunm属性,如果传递的参数只有一个,直接使用user_id即可,如果是多个可以使用{user_id=id,user_nam=userName}来传递。

            2、resultType属性:若查询结果是集合,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。

采用动态代理的方式完成查询
public interface OrderMapper {

	Order queryOrderUserLazy(@Param("orderNumber") String orderNumber);

}
测试代码

public class OrderMapperTest {

	private OrderMapper orderMapper;

	@Before
	public void setUp() throws Exception {
		InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
		SqlSession openSession = build.openSession(true);
		orderMapper = openSession.getMapper(OrderMapper.class);
	}
	
	// 
		@Test
		public void testQueryOrderUserLazy() {
			Order order = orderMapper.queryOrderUserLazy("20140921001");
			System.out.println(order.getOrderNumber());
			System.out.println(order.getUser());
			System.out.println(order.getOrderdetail());
		}
}
测试结果
Mybatis延迟加载(懒加载)_第2张图片

另外附上表关系图及全局配置文件

Mybatis延迟加载(懒加载)_第3张图片

Mybatis-config.xml配置




	
	
		
		
		
		
		
		
		
		
		
	
	
		
	
	
		
			
			
				
				
				
				
			
		
	
	
		
		
		
		
		
	



你可能感兴趣的:(Mybtatis)