文章出處

一、批量處理操作

批量處理數據是指在一個事務場景中處理大量數據。在應用程序中難以避免進行批量操作,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批量執行插入、修改和刪除語句時,需要使用SessiondoWork(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());
            }
        }

輸出結果:

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()