SSH与SSM学习之hibernate25——批量抓取

来源:互联网 发布:淘宝网四海认证钓具 编辑:程序博客网 时间:2024/05/30 07:13

  • SSH与SSM学习之hibernate25批量抓取
    • 一添加数据
    • 二测试代码
    • 三分析
    • 三默认情况下的查询
    • 四Companyhbmxml添加batch-size
    • 五批量抓取

SSH与SSM学习之hibernate25——批量抓取

一、添加数据

我们现在需要添加数据,所以的配置使用默认的配置。

/** * 添加测试数据 */@Testpublic void addData(){    Session session = HibernateUtils.openSession();    Transaction t = session.beginTransaction();    //-------------------------------------------    for (int i = 0; i < 5; i++) {        Company c = new Company();        c.setName("新公司_"+i);        Employee emp = new Employee();        emp.setName("wiming_"+i);        emp.setCompany(c);        session.save(c);        session.save(emp);    }    //-------------------------------------------    t.commit();    session.close();}

现在我们的有5个公司,每个公司有1个员工。


二、测试代码

/** * 批量抓取 */@Testpublic void test(){    Session session = HibernateUtils.openSession();    Transaction t = session.beginTransaction();    //-------------------------------------------    Query query = session.createQuery("from Company");    List<Company> list = query.list();    System.out.println("---------one--------");    for (Company c : list) {        System.out.println(c.getEmps());        System.out.println("---------------");    }    //-------------------------------------------    t.commit();    session.close();}

三、分析

我们知道我们的表中有5个公司。上面的测试代码,在默认情况下,除了查询到公司的数据以外,还会查询5次。这是因为我们的员工的数据是使用懒加载的(默认的)。也就是说每循环一次,就会去查询一次数据。这样感觉效率很低下。
因此有一个属性 batch-size,它的意思就是,一次抓取多少条数据。那上面的例子举例,如果batch-size=3,那么意思就是说第一次循环的时候,查询了Company的3个对象的集合数据,第一次循环以后,第一、二、三的集合数据就查询出来,不用再去查了。到了第四的时候,再去查询3条,由于数据只有两条了,所以最后只查询2个对象的集合。这样我查询集合其实只是2次而已。


三、默认情况下的查询

Hibernate:     select        company0_.id as id1_0_,        company0_.name as name2_0_     from        tb_company company0_---------one--------Hibernate:     select        emps0_.com_id as com_id3_1_0_,        emps0_.em_id as em_id1_1_0_,        emps0_.em_id as em_id1_1_1_,        emps0_.name as name2_1_1_,        emps0_.com_id as com_id3_1_1_     from        tb_employee emps0_     where        emps0_.com_id=?[Employee{em_id=1, name='wiming_0'}]---------------Hibernate:     select        emps0_.com_id as com_id3_1_0_,        emps0_.em_id as em_id1_1_0_,        emps0_.em_id as em_id1_1_1_,        emps0_.name as name2_1_1_,        emps0_.com_id as com_id3_1_1_     from        tb_employee emps0_     where        emps0_.com_id=?[Employee{em_id=2, name='wiming_1'}]---------------Hibernate:     select        emps0_.com_id as com_id3_1_0_,        emps0_.em_id as em_id1_1_0_,        emps0_.em_id as em_id1_1_1_,        emps0_.name as name2_1_1_,        emps0_.com_id as com_id3_1_1_     from        tb_employee emps0_     where        emps0_.com_id=?[Employee{em_id=3, name='wiming_2'}]---------------Hibernate:     select        emps0_.com_id as com_id3_1_0_,        emps0_.em_id as em_id1_1_0_,        emps0_.em_id as em_id1_1_1_,        emps0_.name as name2_1_1_,        emps0_.com_id as com_id3_1_1_     from        tb_employee emps0_     where        emps0_.com_id=?[Employee{em_id=4, name='wiming_3'}]---------------Hibernate:     select        emps0_.com_id as com_id3_1_0_,        emps0_.em_id as em_id1_1_0_,        emps0_.em_id as em_id1_1_1_,        emps0_.name as name2_1_1_,        emps0_.com_id as com_id3_1_1_     from        tb_employee emps0_     where        emps0_.com_id=?[Employee{em_id=5, name='wiming_4'}]---------------

四、Company.hbm.xml添加batch-size

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.qwm.hibernate03.domain" >    <class name="Company" table="tb_company">        <id name="id">            <generator class="native"></generator>        </id>        <property name="name" ></property>        <!-- batch-size: 抓取集合的数量为3.            抓取客户的集合时,一次抓取几个公司的员工集合.         -->        <set name="emps" batch-size="3">            <key column="com_id"></key>            <one-to-many class="Employee"></one-to-many>        </set>    </class></hibernate-mapping>

五、批量抓取

Hibernate:     select        company0_.id as id1_0_,        company0_.name as name2_0_     from        tb_company company0_---------one--------Hibernate:     select        emps0_.com_id as com_id3_1_1_,        emps0_.em_id as em_id1_1_1_,        emps0_.em_id as em_id1_1_0_,        emps0_.name as name2_1_0_,        emps0_.com_id as com_id3_1_0_     from        tb_employee emps0_     where        emps0_.com_id in (            ?, ?, ?        )[Employee{em_id=1, name='wiming_0'}]---------------[Employee{em_id=2, name='wiming_1'}]---------------[Employee{em_id=3, name='wiming_2'}]---------------Hibernate:     select        emps0_.com_id as com_id3_1_1_,        emps0_.em_id as em_id1_1_1_,        emps0_.em_id as em_id1_1_0_,        emps0_.name as name2_1_0_,        emps0_.com_id as com_id3_1_0_     from        tb_employee emps0_     where        emps0_.com_id in (            ?, ?        )[Employee{em_id=4, name='wiming_3'}]---------------[Employee{em_id=5, name='wiming_4'}]---------------
阅读全文
0 0
原创粉丝点击