mybatis延迟加载

 

       在Mybatis中,通常会进行多表联合查询,但是有的时候并不会立即用到所有的联合查询结果,此时需要一种机制,当需要的时候再查询,这种“按需查询”的机制,就可以使用延迟加载来实现。

       延迟加载可以做到,先从单表查询,需要时再从关联表关联查询,这样可以大大提高数据库的性能,因为查询单表要比关联查询多张表速度快。

首先给出javaBean,然后在Mapper映射文件定义查询操作

public class BatchItem {

	private int batch_id;
	private int cus_id;
	private String number;
	private Date createtime;
	private String note;
	private Customer customer;
   //set,get
}
public class Customer {

	private int cus_id;
	private String username;
	private String acno;
	private String gender;
	private String phone;
    //set,get
}

在mapper.xml中定义select操作 

编写resultMap


		
		
		
		
		
		
		
		

这里使用association进行关联,其中使用select及column实现延迟加载用户信息。select用来指定延迟加载所需要执行的SQL语句,也就是指定Mapper.xml配置文件中的某个select标签的id,而column是指订单信息中关联用户信息查询的列,这里关联的是用户的主键,即cus_id。最后给出select语句

上面的配置会被用来延迟加载的resultMap中的association调用,输入参数就是association中column中定义的字段信息。

 

在编写测试方法之前,首先开启延迟加载功能,在sqlConfig.xml中配置setting属性


		
		
		
		
	

说明:

       lazyLoadingEnabled设置全局性懒加载,可设置的值为“false”和”true“。若为false,则所有相关联的数据都会被初始化加载,否则会延迟加载相关的数据

      aggressiveLazyLoading设置积极加载,可设置的值为false和true,当设置为true时,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

测试方法:

@Test
	public void TestLazyLoad() throws IOException{
		SqlSession sqlSession = dataCon.getSqlSession();
		List list = sqlSession.selectList("bank.lazyLoadTest");
		for (BatchItem batchItem : list) {
			System.out.println("订单编号:"+batchItem.getNumber());
			System.out.println("订购用户姓名:"+batchItem.getCustomer().getUsername());
		}
		//关闭sqlSession会话
		sqlSession.close();
	}

只有用到customer这个对象时才会加载它

你可能感兴趣的:(mybatis)