Hibernate用法:查詢,更新,刪除

一、基本數據查詢

使用Hibernate進行數據查詢是一件簡單的事,Java程序設計人員可以使用對象操作的方式來進行數據查詢,查詢時使用一種類似SQL的HQL(Hibernate Query Language)來設定查詢的條件,與SQL不同的是,HQL是具備對象導向的繼承、多型等特性的語言。

 

直接使用範例來看看如何使用Hibernate進行數據庫查詢,在這之前,請先照之前介紹過的主題在數據庫中新增幾筆數據:

在Hibernate中新增資料

 

查詢數據時,我們所使用的是Session的find()方法,並在當中指定HQL設定查詢條件,查詢的結果會裝載在List對象中傳回,您所需要的是將它們一一取出,一個最簡單的例子如下:

AbstractDao.java


import java.util.List;

import org.eimhe.HibernateSessionFactory;
import org.eimhe.util.DataAccessLayerException;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public abstract class AbstractDao {
 private Session session;
 private Transaction tx;
 
 protected void saveOrUpdate(Object obj){
  try{
   startOperation();
   session.saveOrUpdate(obj);
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
 }
 protected void delete(Object obj){
  try{
   startOperation();
   session.delete(obj);
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
 }
 
 protected Object find(Class clazz,Long id){
  Object obj=null;
  try{
   startOperation();
   obj=session.get(clazz, id);
   if(!Hibernate.isInitialized(clazz)){
    Hibernate.initialize(clazz);
   }
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return obj;
 }
 protected List findById(Class clazz){
  return null;
 }
 protected List findAll(Class clazz){
  List objects=null;
  try{
   startOperation();
   Query query=session.createQuery("from "+clazz.getName());
   objects=query.list();
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return objects;
 }
 protected void handleException(HibernateException e) throws DataAccessLayerException{
  if(tx!=null){
   tx.rollback();
  }
  throw new DataAccessLayerException(e);
 }
 protected void startOperation() throws HibernateException{
  session=HibernateSessionFactory.getSession();
  tx=session.beginTransaction();
 }
}

2.操作封裝成Dao,DayMachineInfoDao.java

package org.eimhe.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

 

import org.eimhe.HibernateSessionFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class DayMachineInfoDao extends AbstractDao {
 private Session session;
 private Transaction tx;
 
 public List findByYearAndMonthAndDayAndPowerPlantIdAndMachineNo(String year,String month,String day,long powerPlantId,long machineNo){
  List objects=null;
  try{
   startOperation();
   Query query=session.createQuery("from DayMachineInfo d where d.id.year="+year+" and d.id.month="+month+" and d.id.day="+day+
     " and d.id.powerPlantId="+powerPlantId+" and d.id.machineNo="+machineNo);
   objects=query.list();
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return objects;
 }
 public List findReturnPeriodIdAndTotalContractAndAdjustAndRealTotalContract(String year,String month,String day,long powerPlantId,long machineNo){
  List objects=null;
  try{
   startOperation();
   Query query=session.createQuery("select d.id.periodId,d.dayMachineContractQuantity,d.dayMachineRealtimeAdjustCapacity,"+
     " d.dayMachineContractQuantity+d.dayMachineRealtimeAdjustCapacity as realTotalContract" +
     " from DayMachineInfo d where d.id.year=:year and d.id.month=:month and d.id.day=:day"+
     " and d.id.powerPlantId=:powerPlantId and d.id.machineNo=:machineNo");
   query.setString("year", year);
   query.setString("month", month);
   query.setString("day", day);
   query.setString("powerPlantId", String.valueOf(powerPlantId));
   query.setString("machineNo", String.valueOf(machineNo));
   objects=query.list();
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return objects;
 }
 public List findReturnDayAndMonthContract(String year,String month,long powerPlantId,long machineNo){
  List objects=null;
  try{
   startOperation();
   Query query=session.createQuery("select d.id.day,sum(d.dayMachineDecomposeMonthBidQuantity) as monthContract"+     
     " from DayMachineInfo d where d.id.year=:year and d.id.month=:month"+
     " and d.id.powerPlantId=:powerPlantId and d.id.machineNo=:machineNo"+
     " group by d.id.day");
   query.setString("year", year);
   query.setString("month", month);
   query.setString("powerPlantId", String.valueOf(powerPlantId));
   query.setString("machineNo", String.valueOf(machineNo));
   objects=query.list();
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return objects;
 }
 public List findReturnDayAndYearContractAndAdjustAndRealContract(String year,String month,long powerPlantId,long machineNo){
  List objects=null;
  try{
   startOperation();
   Query query=session.createQuery("select d.id.day,sum(d.dayMachineDecomposeYearContractQuantity) as yearContract,"+ 
     " sum(d.dayMachineRealtimeAdjustCapacity) as adjust,"+
     " sum(d.dayMachineDecomposeYearContractQuantity)+sum(d.dayMachineRealtimeAdjustCapacity) as realContract"+
     " from DayMachineInfo d where d.id.year=:year and d.id.month=:month"+
     " and d.id.powerPlantId=:powerPlantId and d.id.machineNo=:machineNo"+
     " group by d.id.day");
   query.setString("year", year);
   query.setString("month", month);
   query.setString("powerPlantId", String.valueOf(powerPlantId));
   query.setString("machineNo", String.valueOf(machineNo));
   objects=query.list();
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return objects;
 }
 public List findDayMachineInfoAndYearMachineInfoReturnMonthAndDayAndYearContractAndAdjustAndRealContract(String year,String month,long powerPlantId,long machineNo){
  List objects=null;
  try{
   startOperation();
   Query query=session.createQuery("select d.id.month,d.id.day,sum(d.dayMachineDecomposeYearContractQuantity) as yearContract,"+ 
     " sum(d.dayMachineRealtimeAdjustCapacity) as adjust,"+
     " sum(d.dayMachineDecomposeYearContractQuantity)+sum(d.dayMachineRealtimeAdjustCapacity) as realContract"+
     " from DayMachineInfo d where d.id.year=:year and d.id.month<=:month"+
     " and d.id.powerPlantId=:powerPlantId and d.id.machineNo=:machineNo"+
     " group by d.id.month,d.id.day");
   query.setString("year", year);
   query.setString("month", month);
   query.setString("powerPlantId", String.valueOf(powerPlantId));
   query.setString("machineNo", String.valueOf(machineNo));
   objects=query.list();
//   tx.commit();
   
   query=session.createQuery("select '9999', '-1000',-10L,-10L,y.yearMachineBaseContractQuantity "+
     " from YearMachineInfo y "+
     " where y.id.year=:year and y.id.powerPlantId=:powerPlantId and y.id.machineNo=:machineNo");
   query.setString("year", year);
   query.setString("powerPlantId", String.valueOf(powerPlantId));
   query.setString("machineNo", String.valueOf(machineNo));
   objects.add(query.list().iterator().next());
   tx.commit();
   
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return objects;
 }
 public List findYearMachineInfoByYearAndPowerPlantIdAndMachineNo(String year,long powerPlantId,long machineNo){
  List objects=new ArrayList();
  try{
   startOperation();
   Query query=session.createQuery("select '9999', '-1000',-10L,-10L,y.yearMachineBaseContractQuantity "+
     " from YearMachineInfo y "+
     " where y.id.year=:year and y.id.powerPlantId=:powerPlantId and y.id.machineNo=:machineNo");
   query.setString("year", year);
   query.setString("powerPlantId", String.valueOf(powerPlantId));
   query.setString("machineNo", String.valueOf(machineNo));
   objects.add(query.list().iterator().next());
   tx.commit();
  }catch(HibernateException e){
   handleException(e);
  }finally{
   session.close();
  }
  return objects;
 }
  protected void startOperation() throws HibernateException{
   session=HibernateSessionFactory.getSession();
   tx=session.beginTransaction();
 }
}

3.對上面Dao的測試,DayMachineInfoDaoTest.java:


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

 
import org.eimhe.bean.DayMachineInfo;
import org.eimhe.dao.DayMachineInfoDao;

import junit.framework.TestCase;

public class DayMachineInfoDaoTest extends TestCase {
 private DayMachineInfoDao dDao=new DayMachineInfoDao();
 private DayMachineInfo dmi=new DayMachineInfo();
 protected void setUp() throws Exception {
  super.setUp();
 }

 protected void tearDown() throws Exception {
  super.tearDown();
 }
 public void testFindByYearAndMonthAndDayAndPowerPlantIdAndMachineNo() {
  List list=new ArrayList();
  list=dDao.findByYearAndMonthAndDayAndPowerPlantIdAndMachineNo("2006", "12", "23", (long)32, (long)1);
  Iterator it=list.iterator();
  while(it.hasNext()){
   dmi=(DayMachineInfo) it.next();
   System.out.print(dmi.getDayMachineContractQuantity());
   System.out.println(it.next().toString());
  }
 }
 public void testFindReturnPeriodIdAndTotalContractAndAdjustAndRealTotalContract(){
  List list=new ArrayList();
  list=dDao.findReturnPeriodIdAndTotalContractAndAdjustAndRealTotalContract("2004", "10", "1", 32, 1);
  Iterator it=list.iterator();
  Double subtotalContract=0d;
  Long subtotalAdjust=0L;
  Double subtotalRealContract=0d;
  while(it.hasNext()){
   Object[] pair= (Object[]) it.next();
   Long periodId=(Long) pair[0];
   Double totalContract=(Double) pair[1];
   Long adjust=(Long) pair[2];
   Double realTotalContract=(Double) pair[3];
   subtotalContract+=totalContract;
   subtotalAdjust+=adjust;
   subtotalRealContract+=realTotalContract;
   System.out.print("|  "+periodId+"\t|  ");
   System.out.print(totalContract+"\t|  ");
   System.out.print(adjust+"\t|  ");
   System.out.print(realTotalContract+"\t|  ");
   System.out.println("");
  }
  System.out.print("|  "+1000+"\t|  ");
  System.out.print(subtotalContract+"\t|  ");
  System.out.print(subtotalAdjust+"\t|  ");
  System.out.print(subtotalRealContract+"\t|  ");
  System.out.println("");
 }
 public void testFindReturnDayAndMonthContract(){
  List list=new ArrayList();
  list=dDao.findReturnDayAndMonthContract("2004", "10",32, 1);
  Iterator it=list.iterator();
  Double subtotalMonthContract=0D;
  while(it.hasNext()){
   Object[] pair=(Object[]) it.next();
   String day=(String) pair[0];
   Double monthContract=(Double) pair[1];
   subtotalMonthContract+=monthContract;
   System.out.print("|  "+day+"\t|  ");
   System.out.print(monthContract+"\t|  ");
   System.out.println("");
  }
  System.out.print("|  "+1000+"\t|  ");
  System.out.print(subtotalMonthContract+"\t|  ");
  System.out.println("");
  
 }
 public void testFindReturnDayAndYearContractAndAdjustAndRealContract(){
  List list=new ArrayList();
  list=dDao.findReturnDayAndYearContractAndAdjustAndRealContract("2004", "10", 32, 1);
  Iterator it=list.iterator();
  long subYearContract=0L;
  long subAdjust=0L;
  long subRealContract=0L;
  while(it.hasNext()){
   Object[] pair=(Object[]) it.next();
   String day=(String) pair[0];
   Long yearContract=(Long)pair[1];
   Long adjust=(Long)pair[2];
   Long realContract=(Long)pair[3];
   if(yearContract==null)yearContract=0L;
   if(adjust==null)adjust=0L;
   if(realContract==null)realContract=0L;
   subYearContract+=yearContract;
   subAdjust+=adjust;
   subRealContract+=realContract;
   System.out.print("|  "+day+"\t|  ");
   System.out.print(yearContract+"\t|  ");
   System.out.print(adjust+"\t|  ");
   System.out.print(realContract+"\t|  ");
   System.out.println("");
  }
  System.out.print("|  "+1000+"\t|  ");
  System.out.print(subYearContract+"\t|  ");
  System.out.print(subAdjust+"\t|  ");
  System.out.print(subRealContract+"\t|  ");
  System.out.println("");
 }
 public void testFindDayMachineInfoAndYearMachineInfoReturnMonthAndDayAndYearContractAndAdjustAndRealContract(){
  List list=new ArrayList();
  list=dDao.findDayMachineInfoAndYearMachineInfoReturnMonthAndDayAndYearContractAndAdjustAndRealContract("2006", "12", 32, 1);
  Iterator it=list.iterator();
  while(it.hasNext()){
   Object[] pair=(Object[]) it.next();
    String month=(String) pair[0];
    String day=(String) pair[1];
    Long yearContract=(Long) pair[2];
    Long adjust=(Long) pair[3];
    Double realContract=(Double) pair[4];
    System.out.print("|  "+month+"\t|  ");
    System.out.print(day+"\t|  ");
    System.out.print(yearContract+"\t|  ");
    System.out.print(adjust+"\t|  ");
    System.out.print(realContract+"\t|  ");
    System.out.println("");
  }
 }
 public void testFindYearMachineInfoByYearAndPowerPlantIdAndMachineNo(){
  List list=new ArrayList();
  list=dDao.findYearMachineInfoByYearAndPowerPlantIdAndMachineNo("2005", 32,1);
  Iterator it=list.iterator();
//  while(it.hasNext()){
//   
//   Double yyy=(Double) it.next();
//   System.out.print(yyy);
//  }
  while(it.hasNext()){
   Object[] pair=(Object[]) it.next();
    String month=(String) pair[0];
    String day=(String) pair[1];
    Long yearContract=(Long) pair[2];
    Long adjust=(Long) pair[3];
    Double realContract=(Double) pair[4];
    System.out.print("|  "+month+"\t|  ");
    System.out.print(day+"\t|  ");
    System.out.print(yearContract+"\t|  ");
    System.out.print(adjust+"\t|  ");
    System.out.print(realContract+"\t|  ");
    System.out.println("");
  }
 }
}

二、更新和刪除數據

如果您是在同一個Session中取出數據並想要馬上進行更新,則只要先查詢並取出對象,透過setXXX()方法設定好新的值,然後呼叫session.flush()即可在同一個Session中更新指定的數據,例如:

HibernateTest.java

 

這個程序會顯示數據表中的所有數據,並將數據表中的第一筆數據更新,一個執行的結果如下:

 

如果您開啓了一個Session,從數據表中取出數據顯示到使用者接口上,之後關閉Session,當使用者在接口上操作完畢並按下儲存時,這時您要重新開啓一個Session,使用update()方法將對象中的數據更新至對應的數據表中,一個例子如下:

HibernateTest.java

 

這個程序執行的結果範例如下,您可以看看實際上執行了哪些SQL:

 

 

 

一個執行的結果範例如下:

log4j

Hibernate對於數據的更新、刪除等動作,是依賴id值來判定,如果您已知id值,則可以使用load()方法來加載資料。這邊我們先介紹的是一些簡單的查詢動作,將來有機會的話,再介紹一些進階的查詢,如果您想要先認識一些HQL,可以看看參考手冊的第11章,當中對於HQL有詳細的說明。


 

發佈了0 篇原創文章 · 獲贊 2 · 訪問量 9872
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章