一、使用HQL执行批量操作
注意:插入数据时:只支持INSERT INTO ... SELECT ...形式,不支持INSERT INTO ... VALUES ...形式.
下面是一个增删改的批量操作实例:
package com.ru.service; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.ru.domain.Classes; import com.ru.utils.HqlUtil; public class hqlBatch { HqlUtil hu=new HqlUtil(); Session session=null; Transaction tx=null; //增删改都要执行session.createQuery(hql).executeUpdate() //hql批量更新数据库,执行时值执行一跳语句 @Test public void update(){ try { session=hu.currentSession(); tx=session.beginTransaction(); String hql="update Classes c set c.name=? where c.id<?"; String[] parameters={"如123",10000+""}; session.createQuery(hql).setString(0, parameters[0]).setString(1, parameters[1]).executeUpdate(); tx.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ hu.closeSession(); } } //hql批量删除数据库,执行时值执行一跳语句 @Test public void delete(){ try { session=hu.currentSession(); tx=session.beginTransaction(); String hql="delete from Classes c where c.id<?"; String[] parameters={10000+""}; session.createQuery(hql).setString(0, parameters[0]).executeUpdate(); tx.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ hu.closeSession(); } } //hql批量添加数据库数据,执行时值执行一跳语句 //hql批量添加数据必须使用insert into tablenaem(字段名) select 。。。。后面是子查询语句 @Test public void save(){ try { session=hu.currentSession(); tx=session.beginTransaction(); String hql="insert into Student(name) select name from Classes where name='如123' "; session.createQuery(hql).executeUpdate(); tx.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ hu.closeSession(); } } }
二、通过session进行批量操作
package com.ru.service; import static org.junit.Assert.*; import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.ru.domain.Classes; import com.ru.domain.Student; import com.ru.utils.HqlUtil; public class hql_session { HqlUtil hu=new HqlUtil(); Session session=null; Transaction tx=null; //批量添加数据 @Test public void save() { try { session=hu.currentSession(); tx=session.beginTransaction(); for(int i=0; i<1000;i++){ Classes clazz=new Classes(); clazz.setName("如"); session.save(clazz); if(i%20==0){//每加20条数据运行一次 System.out.println("清理缓存"); session.flush();//清理缓存 System.out.println("清理缓存中的sru对象"); session.clear();//清理缓存中的sru对象。 } } tx.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ hu.closeSession(); } } //批量更新数据 @Test public void update() { try { session=hu.currentSession(); tx=session.beginTransaction(); //使用滚动结果集接收数据信息 ScrollableResults clazzs=session.createQuery("from Classes").scroll(ScrollMode.FORWARD_ONLY); // int count=0; while(clazzs.next()){ //每次只去一条记录 Classes clazz=(Classes)clazzs.get(0); clazz.setName("如哥"); if(++count%20==0){ //清除缓存 session.flush(); session.clear();//清楚clazz对象 } } tx.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ hu.closeSession(); } } }