批量抓取理解:如果我们需要查找到客户的所有联系人的话,按照正常的思路,一般是首先查询所有的客户,得到返回的客户的List集合。然后遍历List集合,得到集合中的每一个客户,在取出客户中的联系人(客户表和联系人表是一个一对多的关系,一个客户有多个联系人),对于这种情况,我们就可以使用Hibernate的批量抓取,因为批量抓取进行了优化,比上面的先得到客户,在查询客户的联系人的效率更加的高效。

  

原始方法实现:

 // 批量抓取的原始做法
@Test
public void fun2() {
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction();
// 通过id找到对应的数据记录
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> customers = criteria.list();
for(Customer customer : customers) {
System.out.println(customer.getCid() + " -- " + customer.getCustName());
Set<LinkMan> sets = customer.getMans();
for (LinkMan set : sets) {
System.out.println("\t"+set.getLid()+"::"+set.getLinkName());
}
}
ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

运行截图:

  对于原始的方式进行查询,每次查询一个联系人均会向数据库发送一条查询语句,这样的话,效率就低了。

控制台输出:

九月 12, 2017 9:33:49 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
Tue Sep 12 21:33:49 PDT 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Hibernate:
select
this_.cid as cid1_0_0_,
this_.custLevel as custLeve2_0_0_,
this_.custName as custName3_0_0_,
this_.custSource as custSour4_0_0_,
this_.custMobile as custMobi5_0_0_
from
t_customer this_
4028db335e71d615015e71d61bb60000 -- Geore
Hibernate:
select
mans0_.clid as clid5_1_0_,
mans0_.lid as lid1_1_0_,
mans0_.lid as lid1_1_1_,
mans0_.linkName as linkName2_1_1_,
mans0_.linkGender as linkGend3_1_1_,
mans0_.linkPhone as linkPhon4_1_1_,
mans0_.clid as clid5_1_1_
from
t_linkman mans0_
where
mans0_.clid=?
4028db335e71d615015e71d61bf30001::Mr.Li 4028db335e71d646015e71d64c8e0000 -- Alley
Hibernate:
select
mans0_.clid as clid5_1_0_,
mans0_.lid as lid1_1_0_,
mans0_.lid as lid1_1_1_,
mans0_.linkName as linkName2_1_1_,
mans0_.linkGender as linkGend3_1_1_,
mans0_.linkPhone as linkPhon4_1_1_,
mans0_.clid as clid5_1_1_
from
t_linkman mans0_
where
mans0_.clid=?
4028db335e71d6ff015e71d705ad0001::Mr.Zhang
4028db335e71d753015e71d759930001::Mr.Xie
4028db335e71d646015e71d64ccc0001::Mr.Wang 4028db335e721e35015e721e3b030000 -- Mary
Hibernate:
select
mans0_.clid as clid5_1_0_,
mans0_.lid as lid1_1_0_,
mans0_.lid as lid1_1_1_,
mans0_.linkName as linkName2_1_1_,
mans0_.linkGender as linkGend3_1_1_,
mans0_.linkPhone as linkPhon4_1_1_,
mans0_.clid as clid5_1_1_
from
t_linkman mans0_
where
mans0_.clid=?
4028db335e721e35015e721e3b410001::Mr.Zhao

Hibernate批量抓取实现:

  对于Hibernate的批量抓取的实现,其实在代码上并不需要进行改变,而只要修改配置文件的set标签,在set标签中添加属性batch-size,对于batch-size的值是一个整形的数据,整形的数据越大越好,越大发送的sql语句越少

配置代码:

 <set name="mans" cascade="save-update,delete" fetch="select" lazy="extra" batch-size="20">

控制台输出:

 INFO: HHH000228: Running hbm2ddl schema update
Tue Sep 12 21:38:34 PDT 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Hibernate:
select
this_.cid as cid1_0_0_,
this_.custLevel as custLeve2_0_0_,
this_.custName as custName3_0_0_,
this_.custSource as custSour4_0_0_,
this_.custMobile as custMobi5_0_0_
from
t_customer this_
4028db335e71d615015e71d61bb60000 -- Geore
Hibernate:
select
mans0_.clid as clid5_1_1_,
mans0_.lid as lid1_1_1_,
mans0_.lid as lid1_1_0_,
mans0_.linkName as linkName2_1_0_,
mans0_.linkGender as linkGend3_1_0_,
mans0_.linkPhone as linkPhon4_1_0_,
mans0_.clid as clid5_1_0_
from
t_linkman mans0_
where
mans0_.clid in (
?, ?, ?
)
4028db335e71d615015e71d61bf30001::Mr.Li
4028db335e71d646015e71d64c8e0000 -- Alley
4028db335e71d753015e71d759930001::Mr.Xie
4028db335e71d646015e71d64ccc0001::Mr.Wang
4028db335e71d6ff015e71d705ad0001::Mr.Zhang
4028db335e721e35015e721e3b030000 -- Mary
4028db335e721e35015e721e3b410001::Mr.Zhao

Hibernate的批量抓取的更多相关文章

  1. Hibernate批量抓取

    ------------------siwuxie095 Hibernate 批量抓取 以客户和联系人为例(一对多) 1.批量抓取 同时查询多个对象的关联对象,是 Hibernate 抓取策略的一种 ...

  2. Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取

    1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // ...

  3. day36 08-Hibernate抓取策略:批量抓取

    package cn.itcast.test; import java.util.List; import org.hibernate.Hibernate; import org.hibernate. ...

  4. Python3利用BeautifulSoup4批量抓取站点图片的代码

    边学边写代码,记录下来.这段代码用于批量抓取主站下所有子网页中符合特定尺寸要求的的图片文件,支持中断. 原理很简单:使用BeautifulSoup4分析网页,获取网页<a/>和<im ...

  5. 使用HtmlAgilityPack批量抓取网页数据

    原文:使用HtmlAgilityPack批量抓取网页数据 相关软件点击下载登录的处理.因为有些网页数据需要登陆后才能提取.这里要使用ieHTTPHeaders来提取登录时的提交信息.抓取网页  Htm ...

  6. Web自动化框架LazyUI使用手册(4)--控件抓取工具Elements Extractor详解(批量抓取)

    概述 前面的一篇博文详细介绍了单个控件抓取的设计思路&逻辑以及使用方法,本文将详述批量控件抓取功能. 批量抓取:打开一个web页面,遍历页面上所有能被抓取的元素,获得每个元素的iframe.和 ...

  7. 如何上传Packages到PyPI并批量抓取

    1.如何上传包到PyPI ? 更新中... 2.批量抓取simple网站第三方模块 https://pypi.python.org/simple/ 3. 第三方模块的安装和使用 python  set ...

  8. python实现列表页数据的批量抓取练手练手的

    python实现列表页数据的批量抓取,练手的,下回带分页的 #!/usr/bin/env python # coding=utf-8 import requests from bs4 import B ...

  9. 使用IDM批量抓取音效素材下载

    IDM下载器的站点抓取功能,能够抓取网站上的图片.音频.视频.PDF.压缩包等等文件.更重要的是,能够实现批量抓取操作,省时省力.今天就来看一下,如何用IDM巧妙的批量抓取音效素材. 1.进入音效合辑 ...

随机推荐

  1. rev 反向输出文件内容

    1.命令功能 rev 按行反向输出文件内容 2.语法格式 rev  file 3.使用范例 [root@localhost ~]# echo {a..k} >> test [root@lo ...

  2. web框架-(二)Django基础

    上面我们已经知道Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sessi ...

  3. java并发学习--第八章 JDK 8 中线程优化的新特性

    一.新增原子类LongAdder LongAdder是JDK8中AtomicLong的增强工具类,它与AtomicLong最大的不同就是:在多线程场景下,LongAdder中对单一的变量进行拆分成多个 ...

  4. python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  5. Git 回滚操作之 revert

    https://blog.csdn.net/HobHunter/article/details/79462899 https://blog.csdn.net/secretx/article/detai ...

  6. python-*args、**kargs用法

    可变位置参数: *args:是一个元组,传入的参数会被放进元组里.可变关键字参数: **kwargs:是一个字典,传入的参数以键值对的形式存放到字典里. def test1(*args): print ...

  7. java如何实现多继承

    在java中,原则上是不允许多继承的,也就是类与类之间只可以单继承.那么,有没有办法,可以在不使用接口的情况下实现多继承呢?  答案是可以.使用内部类就可以多继承,严格来说,还不是实现多继承,但是这种 ...

  8. ASP.NET实现大文件上传和下载

    总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件 ...

  9. OpenCV Mat&Operations

    /*M/////////////////////////////////////////////////////////////////////////////////////////// IMPOR ...

  10. [CSP-S模拟测试]:序列(构造)

    题目描述 给定$N,A,B$,构造一个长度为$N$的排列,使得:$\bullet$排列长度为$N$:$\bullet$最长上升子序列长度为$A$:$\bullet$最长下降子序列长度为$B$.我们有$ ...