检索策略的概念
1 hibernate检索策略分为两类:
(1)立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库
//根据cid=1客户 //执行get方法之后,是否发送sql语句 //调用get方法马上发送sql语句查询数据库 Customer customer = session.get(Customer.class, 1);
(2)延迟查询:根据id查询,还有load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库
/* * 1 调用load方法之后,不会马上发送sql语句 * (1)返回对象里面只有 id值 * * 2 得到对象里面不是id的其他值时候才会发送语句 * */ Customer customer = session.load(Customer.class, 2);//不会发送 System.out.println(customer.getCid());//不会发送 System.out.println(customer.getCustName());//会发送
2 延迟查询分成两类:
(1)类级别延迟:根据id查询返回实体类对象,调用load方法不会马上发送语句
//上面的代码
(2)关联级别延迟:
- 查询某个客户,再查询这个客户的所有联系人,查询客户的所有联系人的过程是否需要延迟,这个过程称为关联级别延迟
//根据cid=1客户,再查询这个客户里面所有联系人 Customer customer = session.get(Customer.class, 1); //再查询这个客户里面所有联系人 //直接得到客户里面联系人的set集合 //得到set集合,没有发送语句 Set<LinkMan> linkman = customer.getSetLinkMan(); // 发送语句 System.out.println(linkman.size());
关联级别延迟操作
1 在映射文件中进行配置实现
(1)根据客户得到所有的联系人,在客户映射文件中配置
2 在set标签上使用属性
(1)fetch:值select(默认)
(2)lazy:值
- true:延迟(默认)
- false:不延迟
- extra:极其延迟
<set name="setLinkMan" batch-size="10" fetch="select" lazy="false">
(1)调用get之后,发送两条sql语句
<set name="setLinkMan" batch-size="10" fetch="select" lazy="extra">
(1)极其懒惰,要什么值给什么值
批量抓取
1 查询所有的客户,返回list集合,遍历list集合,得到每个客户,得到每个客户的所有联系人
(1)上面操作代码,发送多条sql语句
//查询所有客户 Criteria criteria = session.createCriteria(Customer.class); List<Customer> list = criteria.list(); //得到每个客户里面所有的联系人 for (Customer customer : list) { System.out.println(customer.getCid()+"::"+customer.getCustName()); //每个客户里面所有的联系人 Set<LinkMan> setLinkMan = customer.getSetLinkMan(); for (LinkMan linkMan : setLinkMan) { System.out.println(linkMan.getLkm_id()+"::"+linkMan.getLkm_name()); } }
2 在客户的映射文件中,set标签配置
(1)batch-size值,值越大发送语句越少
<set name="setLinkMan" batch-size="10">