SSH与SSM学习之hibernate25——批量抓取
2017-09-23 00:40
351 查看
SSH与SSM学习之hibernate25批量抓取
一添加数据
二测试代码
三分析
三默认情况下的查询
四Companyhbmxml添加batch-size
五批量抓取
现在我们的有5个公司,每个公司有1个员工。
因此有一个属性 batch-size,它的意思就是,一次抓取多少条数据。那上面的例子举例,如果batch-size=3,那么意思就是说第一次循环的时候,查询了Company的3个对象的集合数据,第一次循环以后,第一、二、三的集合数据就查询出来,不用再去查了。到了第四的时候,再去查询3条,由于数据只有两条了,所以最后只查询2个对象的集合。这样我查询集合其实只是2次而已。
一添加数据
二测试代码
三分析
三默认情况下的查询
四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'}] ---------------
相关文章推荐
- SSH与SSM学习之hibernate19——多对一一对多关系维护
- SSH与SSM学习之SSH整合08——Spring整合Hibernate环境操作数据库
- SSH与SSM学习之hibernate02——ORM配置详解
- SSH与SSM学习之hibernate06——Session
- SSH与SSM学习之hibernate14——Criteria查询
- Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取
- Hibernate学习44 -- 抓取策略4 -- 批量抓取(Batch fetching)
- SSH与SSM学习之hibernate20——多对多操作
- SSH与SSM学习之hibernate05——SessionFactory
- SSH与SSM学习之hibernate07——Transaction
- SSH与SSM学习之hibernate12——hibernate中的事务
- SSH与SSM学习之hibernate16——表与表的三种关系
- SSH与SSM学习之hibernate17——多对一一对多简单操作
- SSH与SSM学习之hibernate22——类级别加载策略
- SSH与SSM学习之hibernate03——主配置详解
- SSH与SSM学习之hibernate15——SQL原生查询
- SSH与SSM学习之hibernate23——关联级别加载策略之集合关联加载策略
- SSH与SSM学习之hibernate24——关联级别加载策略之属性关联加载策略
- SSH与SSM学习之hibernate01——介绍与环境搭建
- Hibernate学习---第十二节:Hibernate之数据抓取策略&批量抓取