Hibernate 中批量处理数据
一、批量处理操作
批量处理数据是指在一个事务场景中处理大量数据。在应用程序中难以避免进行批量操作,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 中批量处理数据的更多相关文章
- SQL Server中批量替换数据
SQL Server数据库中批量替换数据的方法 SQL Server数据库操作中,我们可能会根据某写需要去批量替换数据,那么如何批量修改替换数据呢?本文我们就介绍这一部分内容,接下来就让我们一起来了解 ...
- C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据
#region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// ...
- 向mysql中批量插入数据的性能分析
MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下 CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...
- .Net中批量添加数据的几种实现方法比较
在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...
- SharePoint自动化系列——通过PowerShell在SharePoint中批量做数据
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ PowerShell是基于.NET的一门脚本语言,对于SharePoint一些日常操作支持的很好. ...
- SQLSERVER数据库中批量导入数据的几种方法
第一:使用Select Into 语句 如果企业数据库都是采用SQL Server数据库的话,则可以利用select into语句实现数据的导入. select into语句的作用是把数据从另外一个数 ...
- MyBatis向数据库中批量插入数据
Foreach标签 foreach: collection:指定要遍历的集合; 表示传入过来的参数的数据类型.该参数为必选.要做 foreach 的对象,作为入参时,List 对象默认用 list 代 ...
- MyBatis中批量插入数据对插入记录数的限制
<基于Mybatis框架的批量数据插入的性能问题的探讨>(作者:魏静敏 刘欢杰 来源:<计算机光盘软件与应用> 2013 年第 19 期)中提到批量插入的记录数不能超过1000 ...
- 从TXT文本文档向Sql Server中批量导入数据
下面我们通过以下的简单的SQL语句即可实现数据的批量导入,代码如下: Bulk insert id From 'G:\文档\test.txt' With ( fieldterminator=',', ...
随机推荐
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
http://blog.csdn.net/xgx198831/article/details/6713651 MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法 或许还有其它更好的办法,但下 ...
- Codeforces 174B【模拟构造】
题意: 给你一个串只有小写字母和点,让你构造前缀是1-8,后缀是1-3长度的文件名: 思路: 那么以"."作为分割点,把字符串都拿出来,然后 首段长度<=8 OK; 中间&l ...
- HDU5908【模拟】
思路: 找到约数k,然后算一下1-k区间里的数的个数. 中间交换一下就好了,然后把后面每个区间里的数减减,然后再判断一下满足不满足= = #include <bits/stdc++.h> ...
- MyBatis嵌套Collection
站在巨人的肩膀上 https://blog.csdn.net/liaoxiaohua1981/article/details/6862466 聚集元素用来处理“一对多”的关系.需要指定映射的Java实 ...
- shell 截取字符串(转)
linux中对字符串的处理: 1.字符串分割例如 AAAAA-BBBBBB 按-分割去前后两部分 cut : [rich@localhost ~]$ str=AAAAA-BBBBBB[rich@l ...
- EasyUI Datagrid换页不清出勾选方法
在1.4版本后: 只要在datagrid中加入 idField:'id',给每条数据id属性,easyui就默认就会保留之前勾选的信息 如果没有id,才会出现换页后,之前勾选的信息没有的情况
- Flask (一) 简介
Flask简介 Flask是一个基于Python实现的Web开发‘微’框架 'MicroFramework' Django是一个重型框架 官方文档: http://flask.pocoo.org/do ...
- eclipse打开jsp的方式怎么设置成默认
https://jingyan.baidu.com/article/4ae03de34137be3eff9e6b93.html
- G. Of Zorcs and Axes 二分 + 贪心 —— STL的用法
http://codeforces.com/gym/101149/problem/G 一开始还以为要用二分图去做,但是复杂度也太高了,O(n * m)的话直接爆炸. 考虑贪心,考虑第i个东西优先选一个 ...
- VMware下OSSIM 4.1.0的下载、安装和初步使用(图文详解)
不多说,直接上干货! 为什么,我写了一篇OSSIM 5.2.0的,还要再来写OSSIM 4.1.0呢,是因为,OSSIM 5.2.0所需内存较大,8G甚至16G,但是,肯定性能和里面集成组件越高级.也 ...