概念:批量处理数据是指在一个事务场景中处理大量数据。

在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据:

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

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

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

1.使用HQL进行批量操作

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

01.批量插入数据

    @Test
//03.HQL 批量添加
public void multiInsertTest(){
String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";
session.createQuery(hql).executeUpdate();
}

02.批量修改

 @Test
//03.HQL 批量修改
public void multiUpdateTest(){
String hql="update Dept set deptName=:name where deptNo>2";
session.createQuery(hql).setParameter("name","财务部").executeUpdate();
}

03.批量删除

 @Test
//03.HQL 批量删除
public void multiDeleteTest(){
String hql="delete from Dept d where d.deptNo>:deptNo";
session.createQuery(hql).setParameter("deptNo",20).executeUpdate();
}

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

 @Test
//04.JDBC API 批量修改
public void insertTest(){
Work work=new Work() {
public void execute(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("update DEPT set deptName='业务部'where DEPTNO>?");
ps.setInt(1,1);
ps.executeUpdate();
}
};
//session
session.doWork(work);
}

操作前:                                 操作后:

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

3.使用Session进行批量操作

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

 @Test
public void testAdd(){
Emp emp=null;
for (int i = 0; i < 10000; i++) {
emp=new Emp(i, "emp"+i);
session.save(emp);
if (i%30==0) {
session.flush();
session.clear();
}
}
}

最新文章

  1. Android Gradle Build Error:Some file crunching failed, see logs for details解决办法
  2. Java进行post和get传参数
  3. ORACLE常见错误代码的分析与解决
  4. Android/iOS微信6.3.5同时发布更新 支持群视频聊天、群公告
  5. cocos2dx lua bug之module &#39;lsqlite3&#39; not found
  6. ContentProvider官方教程(5)ContentResolver插入、更新、删除 示例
  7. 如何实现Magento产品批量导入?
  8. Client Dependency学习
  9. POJ3250Bad Hair Day
  10. ExpressionTree——让反射性能向硬编码看齐
  11. iOS开发之网络请求(基于AFNetworking的再封装)
  12. 在Android手机上获取其它应用的包名及版本
  13. windbg检查常用命令
  14. 矢量切片(Vector tile)番外一:Proj4js
  15. 【渗透课程】第二篇下-HTTP协议的请求与响应深度剖析
  16. 201521123040《Java程序设计》第13周学习总结
  17. LVS-NAT模式的配置详解
  18. Linux 小知识翻译 - 「如何成为 Linux 内核开发者」
  19. gitlab之一: gitlab安装配置使用
  20. Java中一些jar包的作用

热门文章

  1. bzoj3836
  2. python_学习笔记
  3. 使用Bootstrap模态框实现增删改查功能
  4. error:对‘vtable for new_sequence’未定义的引用 对‘typeinfo for num_sequence’未定义的引用
  5. linux内核中ip,tcp等头的定义(转)
  6. java集合框架之比较器Comparator、Comparable
  7. java集合框架之HashSet
  8. HDU - 1016 Prime Ring Problem 经典素数环
  9. HTTP客户端代码片段
  10. GIL 已经被杀死了么?