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