概念:
批量處理數據是指在一個事務場景中處理大量數據。
在應用程序中難以避免進行批量操作,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();}};//sessionsession.doWork(work);}
操作前:?????????????????????????????????操作后:
注意:該方式使用的連接依然是最初的連接對象,并且命令對象依然是根據連接創建的,注意這里是SQL語句,不是HQL語句
3.使用Session進行批量操作
??? 使用Session對象也可以進行批量操作。使用Session對象處理大量持久化對象,需及時從緩存中清空已經處理完畢并且不會再訪問的對象。可以在處理完成一個對象或小批量對象后,調用flush()方法強制同步緩存和數據庫,然后調用clear()方法清空緩存。
@Testpublic 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();}} }