一 检索策略概念
1 hibernate检索策略分为两类
(1)立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库
//根据cid=1客户
//执行get方法之后,是否发送sql语句
//调用get方法马上发送sql语句查询数据库
Customer customer = session.get(Customer.class,1);
System.out.println(customer.getCid());
(2)延迟查询:根据id查询,调用load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库
/*
* 1 调用load方法之后,不会马上发送sql语句
* 返回对象里面只有id值
* 2 得到对象里面不是id的而是其他值时候才会发送语句
* */
Customer customer = session.load(Customer.class,1);
System.out.println(customer.getCid());
System.out.println(customer.getCustName());
2 延迟查询分为两类
(1)类级别延迟
根据id查询返回实体类对象,调用load方法不会马上发送语句
(2)关联级别延迟
查询某个客户,在查询这个客户的所有联系人,查询客户的所有联系人的过程是否需要延迟,这个过程称为关联级别延迟
二 关联级别延迟操作(在映射文件中进行配置实现)
1 根据客户得到所有联系人,在客户映射文件中配置
2 在set标签上使用属性
(1)fetch:值 select (默认)
(2) lazy:值
- true:延迟 (默认)
- false:不延迟
调用get之后,发送两条sql语句,分别查询客户和联系人
extra:及其延迟
- 要什么值发送什么查询语句
三 批量抓取
1 查询所有客户,返回list集合,遍历list集合,得到每个客户,得到每个客户的所有联系人
@Test
public void testSelect6(){
Transaction tx = null;
try {
Session session= HibernateUtils.getSessionObject();
tx = session.beginTransaction();
//查询客户
Criteria criteria= session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
//得到每个客户里面所有联系人
for(Customer customer:list){
System.out.println(customer.getCid()+":"+customer.getCustName());
//每个客户里面的联系人
Set<LinkMan> linkMEN= customer.getSetlinkMan();
for (LinkMan linkMan:linkMEN){
System.out.println(linkMan.getLkm_id()+":"+linkMan.getLkm_name());
}
}
tx.commit();
}catch (Exception e){
e.printStackTrace();
tx.rollback();
}
}
2 上面操作代码,发送多条查询语句,优化
- batch-size值,值越大发送语句越少