標籤:調用 date() ges 批量 個數 add object exce rest
一、批量處理操作
批量處理資料是指在一個事務情境中處理大量資料。在應用程式中難以避免進行大量操作,Hibernate提供了以下方式進行批量處理資料:
(1)使用HQL進行大量操作 資料庫層面
(2)使用JDBC API進行大量操作 資料庫層面
(3)使用Session進行大量操作 會進緩衝
1.使用HQL進行大量操作
HQL可以查詢資料,也可以批量插入、更新和刪除資料。HQL大量操作實際上直接在資料庫中完成,處理的資料不需要載入到Session緩衝中。使用Query介面的executeUpdate()方法執行用於插入、更新和刪除的HQL語句。
以Emp和Dept為例:
例:大量新增3個部門
@Test public void addTest(){ String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0"; Query query=session.createQuery(hql); int count=query.executeUpdate(); System.out.println("add ok!!"); }
輸出結果:
2.使用JDBC API進行大量操作
在Hibernate應用中使用JDBC API批量執行插入、修改和刪除語句時,需要使用Session的doWork(Work work)方法執行Work對象指定的操作,即調用Work對象的execute()方法。Session把當前使用的資料庫連接傳給execute()方法,執行持久化操作。
例:實現批量修改部門名稱
將部門編號大於3的修改為開發部
注意:該方式使用的串連依然是最初的連線物件,並且命令對象依然是根據串連建立的,注意這裡是SQL語句,不是HQL語句
@Test public void updateTest(){ final String sql="update Dept set deptname=? where deptno>?"; Work work=new Work(){ public void execute(Connection con) throws SQLException{ PreparedStatement ps = con.prepareStatement(sql); ps.setString(1,"開發部"); ps.setInt(2, 3); int count=ps.executeUpdate(); //System.out.println(count); } }; session.doWork(work); System.out.println("update ok!!!"); }複製代碼
實現效果:
3、實現session進行大量操作
使用Session對象處理大量持久化對象,需及時從緩衝中清空已經處理完畢並且不會再訪問的對象。可以在處理完成一個對象或小批量對象後,調用flush()方法強制同步緩衝和資料庫,然後調用clear()方法清空緩衝。
例:大量新增15個員工
/* * session 實現大量新增15個員工 */ @Test public void addSessionTest(){ for(int i=0;i<=15;i++){ Emp emp=new Emp(); emp.setEmpName("呵呵"+i); Dept dept=new Dept(); dept.setDeptNo(1); emp.setDept(dept); session.save(emp); if(i%10==0){ session.flush(); session.clear(); } } System.out.println("add ok!!"); }複製代碼
輸出結果:
二、HQL串連查詢
HQL提供的串連方式如下表所示:
內串連:
文法:
from Entity inner join Entity.property
例:使用內串連查詢員工隸屬的部門
list集合中的每個元素都是一個Object數組,from後面緊接的是部門 則輸出的先是部門的記憶體位址
/* * 內串連 員工隸屬的部門 */ @Test public void innerTest(){ Query query=session.createQuery("from Dept d inner join d.emps"); List<Object[]> list = query.list(); for (Object[] item : list) { //一個item就是一個數組 System.out.println(((Dept)item[0]).getDeptName()+"\t"+((Emp)item[1]).getEmpName()); } }
輸出結果:
隱式內串連:
在HQL查詢語句中,如果對Emp類賦別名為”e”,可以通過e.dept.deptName的形式訪問dept對象的deptName屬性。使用隱式內串連按部門查詢員工資訊。
例:按部門條件查詢員工資訊
/* * 隱式內串連 按部門條件查詢員工資訊 */ @Test public void hideTest(){ Query query=session.createQuery("from Emp e where e.dept.deptName=‘開發部‘"); List<Emp> list = query.list(); for (Emp item : list) { //一個item就是一個數組 System.out.println(item.getEmpName()); } }
輸出結果:
3、迫切內串連
例:查詢所有的僱員名稱和隸屬部門名稱 需使用關鍵字fetch
/* * 迫切內串連 查詢所有的僱員名稱和隸屬部門名稱 */ @Test public void FetchTest(){ Query query=session.createQuery("from Dept d inner join fetch d.emps"); List<Dept> list=query.list(); for (Dept item : list) { System.out.println(item.getDeptName()+"\t"+item.getEmps().iterator().next().getEmpName()); } }複製代碼
Hibernate 中批量處理資料