Hibernate框架之CRM查询优化

1、延迟加载

//懒加载|延迟加载
public class Demo {
	
	@Test
	// get方法 : 立即加载.执行方法时立即发送sql语句查询结果
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		Customer c = session.get(Customer.class, 2l);
		System.out.println(c);
		//----------------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	// load方法(默认):是在执行时,不发送任何sql语句.返回一个对象.使用该对象时,才执行查询.
	// 延迟加载: 仅仅获得没有使用.不会查询.在使用时才进行查询.
	// 是否对类进行延迟加载: 可以通过在class元素上配置lazy属性来控制.
		//lazy:true  加载时,不查询.使用时才查询b
		//lazy:false 加载时立即查询.
	public void fun2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		Customer c = session.load(Customer.class, 2l);
		//----------------------------------------------------
		tx.commit();
		session.close();
		System.out.println(c);
	}	
}

结论:为了提高效率.建议使用延迟加载(懒加载)。

注意:使用懒加载时要确保,调用属性加载数据时,session还是打开的.不然会抛出异常。

2、抓取策略

//关联级别 延迟加载 & 抓取策略
public class Demo {
	
	//集合级别的关联
	//fetch:select 单表查询
	//lazy:true 使用时才加载集合数据.
	@Test
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		Customer c = session.get(Customer.class, 2l);
		Set<LinkMan> linkMens = c.getLinkMens();//关联级别
		System.out.println(linkMens);
		//----------------------------------------------------
		tx.commit();
		session.close();
	}
	
	//集合级别的关联
		//fetch:select 单表查询
		//lazy:false 立即记载集合数据
		@Test
		public void fun2(){
			Session session = HibernateUtils.openSession();
			Transaction tx = session.beginTransaction();
			//----------------------------------------------------
			Customer c = session.get(Customer.class, 2l);
			Set<LinkMan> linkMens = c.getLinkMens();//关联级别
			System.out.println(linkMens);
			//----------------------------------------------------
			tx.commit();
			session.close();
		}

		//集合级别的关联
		//fetch:select 单表查询
		//lazy:extra 极其懒惰.与懒加载效果基本一致. 如果只获得集合的size.只查询集合的size(count语句)
		@Test
		public void fun3(){
			Session session = HibernateUtils.openSession();
			Transaction tx = session.beginTransaction();
			//----------------------------------------------------
			Customer c = session.get(Customer.class, 2l);
			Set<LinkMan> linkMens = c.getLinkMens();//关联级别
			System.out.println(linkMens.size());
			System.out.println(linkMens);
			//----------------------------------------------------
			tx.commit();
			session.close();
		}

		//集合级别的关联
		//fetch:join	多表查询
		//lazy:true|false|extra 失效.立即加载.
		@Test
		public void fun4(){
			Session session = HibernateUtils.openSession();
			Transaction tx = session.beginTransaction();
			//----------------------------------------------------
			Customer c = session.get(Customer.class, 2l);
			Set<LinkMan> linkMens = c.getLinkMens();//关联级别
			System.out.println(linkMens.size());
			System.out.println(linkMens);
			//----------------------------------------------------
			tx.commit();
			session.close();
		}
		
		@Test
		//fetch: subselect 子查询
		//lazy: true 懒加载
		public void fun5(){
			Session session = HibernateUtils.openSession();
			Transaction tx = session.beginTransaction();
			//----------------------------------------------------
			String  hql = "from Customer";
			Query query = session.createQuery(hql);
			List<Customer> list = query.list();
			for(Customer c:list){
				System.out.println(c);
				System.out.println(c.getLinkMens().size());
				System.out.println(c.getLinkMens());
			}
			//----------------------------------------------------
			tx.commit();
			session.close();
		}

		@Test
		//fetch: subselect 子查询
		//lazy: false 立即加载
		public void fun6(){
			Session session = HibernateUtils.openSession();
			Transaction tx = session.beginTransaction();
			//----------------------------------------------------
			String  hql = "from Customer";
			Query query = session.createQuery(hql);
			List<Customer> list = query.list();
			for(Customer c:list){
				System.out.println(c);
				System.out.println(c.getLinkMens().size());
				System.out.println(c.getLinkMens());
			}
			//----------------------------------------------------
			tx.commit();
			session.close();
		}

		@Test
		//fetch: subselect 子查询
		//lazy: extra 极其懒惰
		public void fun7(){
			Session session = HibernateUtils.openSession();
			Transaction tx = session.beginTransaction();
			//----------------------------------------------------
			String  hql = "from Customer";
			Query query = session.createQuery(hql);
			List<Customer> list = query.list();
			for(Customer c:list){
				System.out.println(c);
				System.out.println(c.getLinkMens().size());
				System.out.println(c.getLinkMens());
			}
			//----------------------------------------------------
			tx.commit();
			session.close();
		}
}
//关联级别 延迟加载 & 抓取策略
public class Demo2 {
	
	@Test
	//fetch:select	单表查询
	//lazy:proxy  
		//customer-true 懒加载
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		LinkMan lm = session.get(LinkMan.class, 3l);
		Customer customer = lm.getCustomer();
		System.out.println(customer);
		//----------------------------------------------------
		tx.commit();
		session.close();
	}

	@Test
	//fetch:join	多表
	//lazy: 失效  
	public void fun3(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		LinkMan lm = session.get(LinkMan.class, 3l);
		Customer customer = lm.getCustomer();
		System.out.println(customer);
		//----------------------------------------------------
		tx.commit();
		session.close();
	}

	@Test
	//fetch:select	单表查询
	//lazy:proxy  
		//customer-false 立即加载
	public void fun2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		LinkMan lm = session.get(LinkMan.class, 3l);
		Customer customer = lm.getCustomer();
		System.out.println(customer);
		//----------------------------------------------------
		tx.commit();
		session.close();
	}
}

结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值。

no-session问题解决: 扩大session的作用范围(使用Filter)。

 

3、批量抓取

public class Demo {
	
	@Test
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		String hql = "from Customer ";
		Query query = session.createQuery(hql);
		List<Customer> list = query.list();
		for(Customer c:list){
			System.out.println(c.getLinkMens());
		}
		//----------------------------------------------------
		tx.commit();
		session.close();
	}
}

猜你喜欢

转载自blog.csdn.net/aiyowei1106/article/details/81781559
今日推荐