概念:批量處理數據是指在一個事務場景中處理大量數據。
在應用程序中難以避免進行批量操作,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(); } } }

