hibernate执行批量操作

一、使用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();
		}
		
	}


}


猜你喜欢

转载自tydldd.iteye.com/blog/1720159
今日推荐