您的位置:首页 > 其它

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

2017-09-23 00:40 351 查看
SSH与SSM学习之hibernate25批量抓取
一添加数据

二测试代码

三分析

三默认情况下的查询

四Companyhbmxml添加batch-size

五批量抓取

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

一、添加数据

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

/**
* 添加测试数据
*/
@Test
public 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个员工。

二、测试代码

/**
* 批量抓取
*/
@Test
public 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'}]
---------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: