Hibernate檢索策略及批量抓取
阿新 • • 發佈:2018-12-06
檢索策略的概念
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">