zoukankan      html  css  js  c++  java
  • 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">
  • 相关阅读:
    特征归一化
    什么是端到端(end2end)学习?
    RSA加密原理及其证明
    python脚本中__all__变量的用法
    洛谷 1108 低价购买
    洛谷 3029 [USACO11NOV]牛的阵容Cow Lineup
    洛谷 1365 WJMZBMR打osu! / Easy
    洛谷 2759 奇怪的函数
    洛谷 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
  • 原文地址:https://www.cnblogs.com/kpsmile/p/10074688.html
Copyright © 2011-2022 走看看