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

猜你喜欢

转载自www.cnblogs.com/kpsmile/p/10074688.html