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有详细的说明。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值