1. 程式人生 > >Hibernate檢索策略及批量抓取

Hibernate檢索策略及批量抓取

檢索策略的概念

  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">