天天看点

Hibernate 5.3 (六)

文章目录

      • Hibernate 批量处理
        • Hibernate 批量插入
        • Hibernate 批量更新
        • DML 风格 批量更新、删除

Hibernate 批量处理

如果我们需要通过Hihernate 去处理大量的数据,就需要使用Hibernate 批量处理,提高性能。

Hibernate 批量插入

String[] names = new String[1000];
		   String[] genders = new String[1000];
		   for(int i = 0;i<1000;i++){
			   Person p = new Person();
			   p.setName(names[i]);
			   p.setGender(genders[i]);
			   if(i%20==0){
				   ss.flush();//将session 的数据保存到数据库中
				   ss.clear();//清空session
			   }
		   }
           

上述例子,比较简单,映射文件就不给出了。这里我无法找1000个数据,一般把大量的数据放到数组中循环操作。同时在一定时候,将session中的数据保存的数据库中,而不是等1000个数据,一下子全部存到数据库中。

<property name="hibernate.cache.use_second_level_cache">false</property>

           

使用手动清除session 缓存,还应该配置上面的,关闭二级缓存。

Hibernate 批量更新

在批量更新的时候,面临的问题就是如何先批量查询出来,然后在查询出来的结果上,进行批量的更新。

String[] names = new String[1000];
		  org.hibernate.ScrollableResults persons = ss.createQuery("select person_name from person")
				  .setCacheMode(org.hibernate.CacheMode.IGNORE).scroll(org.hibernate.ScrollMode.FORWARD_ONLY);
		  //ScrollableResults 这个对象,查询出来的数据,它有点滚动的效果,next一次之后,它就会指向接下来的一条数据
		  //所以每次get(0),就可以获取新的对象		  
		  int count = 0;
		  while(persons.next()){
			  Person p = (Person) persons.get(0);
			  p.setName(names[count++]);
			  if(count%20==0){
				  ss.flush();
				  ss.clear();
			  }
		  }
           

开启手动清理session 缓存,同样要配置上述例子的关闭二级缓存。

通过这种方式,虽然可以执行批量更新,但效果非常不好。执行效率不高,需要先执行数据查询,然后再执行数据更新,而且这种更新将是逐行更新,即每更新一行记录,都需要执行一条update语句,性能也非常低下。为了避免这种情况,Hibernate 提供了一种类似于DML语句的批量更新、批量删除的HQL语法。

DML 风格 批量更新、删除

String hqlsql = "update Person set name = : newName";
		  int updaterow = ss.createQuery(hqlsql).setString("newName", "laohe").executeUpdate();//这里将满足条件的Person 实例,都会修改名字
		  
           

这个后台打印的sql ,只有一条update 语句,所以性能是nice的。

从上面的代码中可以看出, 这种语法非常类似于PreparedStatement的executeUpdate语法(就是那个占位符),实际HQL的这种批量更新就是直接借鉴了SQL语法的UPDATE语句。

批量删除:

String hqlsql = "delete Person";
          int deleterow = ss.createQuery(hqlsql).executeUpdate();
           

这里因为涉及hql ,在这不多说,了解hql 请到下一节查看相关知识点。

继续阅读