一、批量处理操作

批量处理数据是指在一个事务场景中处理大量数据。在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据:

(1)使用HQL进行批量操作     数据库层面

(2)使用JDBC API进行批量操作  数据库层面

(3)使用Session进行批量操作   会进缓存

1.使用HQL进行批量操作

HQL可以查询数据,也可以批量插入、更新和删除数据。HQL批量操作实际上直接在数据库中完成,处理的数据不需要加载到Session缓存中。使用Query接口的executeUpdate()方法执行用于插入、更新和删除的HQL语句。

以Emp和Dept为例:

例:批量添加3个部门

        @Test
public void addTest(){
String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";
Query query=session.createQuery(hql);
int count=query.executeUpdate();
System.out.println("add ok!!");
}

输出结果:

2.使用JDBC  API进行批量操作

在Hibernate应用中使用JDBC API批量执行插入、修改和删除语句时,需要使用Session的doWork(Work work)方法执行Work对象指定的操作,即调用Work对象的execute()方法。Session把当前使用的数据库连接传给execute()方法,执行持久化操作。

例:实现批量修改部门名称

将部门编号大于3的修改为开发部

注意:该方式使用的连接依然是最初的连接对象,并且命令对象依然是根据连接创建的,注意这里是SQL语句,不是HQL语句

  @Test
public void updateTest(){
final String sql="update Dept set deptname=? where deptno>?";
Work work=new Work(){
public void execute(Connection con) throws SQLException{
PreparedStatement ps = con.prepareStatement(sql); ps.setString(1,"开发部");
ps.setInt(2, 3); int count=ps.executeUpdate();
//System.out.println(count);
}
};
session.doWork(work);
System.out.println("update ok!!!"); }
复制代码

实现效果:

3、实现session进行批量操作

使用Session对象处理大量持久化对象,需及时从缓存中清空已经处理完毕并且不会再访问的对象。可以在处理完成一个对象或小批量对象后,调用flush()方法强制同步缓存和数据库,然后调用clear()方法清空缓存。

例:批量添加15个员工

  /*
* session 实现批量添加15个员工
*/ @Test
public void addSessionTest(){
for(int i=0;i<=15;i++){
Emp emp=new Emp();
emp.setEmpName("呵呵"+i); Dept dept=new Dept();
dept.setDeptNo(1); emp.setDept(dept); session.save(emp); if(i%10==0){
session.flush();
session.clear();
}
}
System.out.println("add ok!!");
}
复制代码

输出结果:

二、HQL连接查询

HQL提供的连接方式如下表所示:

内连接:

语法:

from Entity inner join Entity.property

例:使用内连接查询员工隶属的部门

list集合中的每个元素都是一个Object数组,from后面紧接的是部门 则输出的先是部门的内存地址

    /*
* 内连接 员工隶属的部门
*/ @Test
public void innerTest(){ Query query=session.createQuery("from Dept d inner join d.emps");
List<Object[]> list = query.list();
for (Object[] item : list) {
//一个item就是一个数组
System.out.println(((Dept)item[0]).getDeptName()+"\t"+((Emp)item[1]).getEmpName());
} }

输出结果:

隐式内连接:

在HQL查询语句中,如果对Emp类赋别名为”e”,可以通过e.dept.deptName的形式访问dept对象的deptName属性。使用隐式内连接按部门查询员工信息。

例:按部门条件查询员工信息

  /*
* 隐式内连接 按部门条件查询员工信息
*/ @Test
public void hideTest(){ Query query=session.createQuery("from Emp e where e.dept.deptName='开发部'");
List<Emp> list = query.list();
for (Emp item : list) {
//一个item就是一个数组
System.out.println(item.getEmpName());
}
}

输出结果:

3、迫切内连接

例:查询所有的雇员名称和隶属部门名称  需使用关键字fetch

  /*
* 迫切内连接 查询所有的雇员名称和隶属部门名称
*/ @Test
public void FetchTest(){
Query query=session.createQuery("from Dept d inner join fetch d.emps");
List<Dept> list=query.list();
for (Dept item : list) {
System.out.println(item.getDeptName()+"\t"+item.getEmps().iterator().next().getEmpName());
}
}
复制代码

Hibernate 中批量处理数据的更多相关文章

  1. SQL Server中批量替换数据

    SQL Server数据库中批量替换数据的方法 SQL Server数据库操作中,我们可能会根据某写需要去批量替换数据,那么如何批量修改替换数据呢?本文我们就介绍这一部分内容,接下来就让我们一起来了解 ...

  2. C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据

    #region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// ...

  3. 向mysql中批量插入数据的性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...

  4. .Net中批量添加数据的几种实现方法比较

    在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...

  5. SharePoint自动化系列——通过PowerShell在SharePoint中批量做数据

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ PowerShell是基于.NET的一门脚本语言,对于SharePoint一些日常操作支持的很好. ...

  6. SQLSERVER数据库中批量导入数据的几种方法

    第一:使用Select Into 语句 如果企业数据库都是采用SQL Server数据库的话,则可以利用select into语句实现数据的导入. select into语句的作用是把数据从另外一个数 ...

  7. MyBatis向数据库中批量插入数据

    Foreach标签 foreach: collection:指定要遍历的集合; 表示传入过来的参数的数据类型.该参数为必选.要做 foreach 的对象,作为入参时,List 对象默认用 list 代 ...

  8. MyBatis中批量插入数据对插入记录数的限制

    <基于Mybatis框架的批量数据插入的性能问题的探讨>(作者:魏静敏 刘欢杰 来源:<计算机光盘软件与应用> 2013 年第 19 期)中提到批量插入的记录数不能超过1000 ...

  9. 从TXT文本文档向Sql Server中批量导入数据

    下面我们通过以下的简单的SQL语句即可实现数据的批量导入,代码如下: Bulk insert id From 'G:\文档\test.txt' With ( fieldterminator=',', ...

随机推荐

  1. CF888E Maximum Subsequence(meet in the middle)

    给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...

  2. [Xcode 实际操作]七、文件与数据-(22)使用OCR光学字符识别技术识别银行卡号码

    目录:[Swift]Xcode实际操作 本文将演示如何使用光学字符识别技术,识别信用卡上的卡号. OCR技术是光学字符识别的缩写(Optical Character Recognition), 是通过 ...

  3. [Xcode 实际操作]八、网络与多线程-(18)PerformSelector消息处理方法:由运行时系统,负责去调用对象的指定方法

    目录:[Swift]Xcode实际操作 本文将演示PerformSelector消息处理方法. 在项目文件夹上点击鼠标右键弹出文件菜单. [New File]->[Swift File]-> ...

  4. 最短路之SPFA(单源)HDU 2544

    #include <iostream> #include <queue> #include <algorithm> #define MAXLEN 1005 #def ...

  5. dzzoffice 任意文件下载漏洞分析

    dzzoffice 任意文件下载 \updload\dzz\system\save.php第72行开始:    elseif($_GET['do']=='move'){    $obz=trim($_ ...

  6. laravel-admin 自定义导出表单

    官方导出文档 laravel-admin自带的导出excel会导出与此模型关联的其他数据.所以参考官方文档调整代码 文章表:id,title,user_id 用户表:id,username //文章模 ...

  7. WebView使用遇到的坑

    1.为了防止内存泄漏,关闭界面的时候一定要记得 webView.distroy()  并且把webView置为null 2.尽量不要在代码中new控件 尽量不要在代码中new控件  尽量不要在代码中n ...

  8. Glide加载图片的事例

    //获取图片的url String url = resultsEntity.getUrl(); //判断获取的图片是否存在 if (resultsEntity.getItemHeight() > ...

  9. PHP 函数的参数

    函数的参数 通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表. PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数.也支持可变数量的参数:更多信息请参照可变长度参数列表和涉及 ...

  10. 如何写一个跨浏览器的事件处理程序 js

    如何 写一个合格的事件处理程序,看如下代码: EventUtil可以直接拿去用 不谢 <!DOCTYPE html> <html> <head> <title ...