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