Hibernate的一种用法

废话不多说,上代码

import java.util.List;
import java.util.Map;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

import com.HomeFurnishing.common.Exceptions.MyRuntimeException;
import com.HomeFurnishing.common.entity.PageCond;

/***
 * @author zhukovasky
 * @version 1.0
 * @see 本接口用来做一般的增删改查适合于Hibernate框架,做单表操作可能会存在一些问题
 * */
public interface HibernateDAO {
	/***
	 * 保存,单表操作
	 * */
	public void saveEntity(String klass,Object obj);
	public void updateEntity(String klass,Object obj);
	public void insertEntity(String klass,Object obj);
	public void deleteEntity(String klass,Object obj);
	public void deleteEntityByCascade(String klass,Object[] obj);
	public List queryEntitiesByCriteria(Criterion criteria, String klass,List<Order> orders);
	public List queryEntitiesByTemplate(String klass,Object obj,Criterion criteria ,List<Order> orders);

	public Object[] queryEntitiesByCriteria(Criterion criteria, String klass,PageCond page,List<Order> orders);
	/***
	 * @author zhukovasky
	 * @see 模板查询
	 * */
	public Object[] queryEntitiesByTemplate(String klass,Object obj,Criterion criteria ,PageCond page,List<Order> orders);

	public <V> V expandEntity(String klass,V obj);
	/****
	 * @author zhukovasky
	 * @param sqlLocations 放置sql相应路径名
	 * @see i.e.String packagename="com.zhukovasky.common.utils";
	 * 			String xmlname="testxml.xml"
	 * 			String sqlname="queryMyBudget";
	 * 			那么它的值应该是
	 * 			"com.zhukovasky.common.utils.testxml.queryMyBudget"
	 * 			程序会自动计算相应的地址并生成实际的路径名
	 * @param Map<String,Object> parameterMap 查询参数
	 * @return List<Map> 返回结果为HashMap,对于单条记录
	 *
	 * */
	public List<Map> queryNameSqlByHibernate(String sqlLocations,Map<String,Object> parameterMap) throws MyRuntimeException;
	/**
	 * @author zhukovasky
	 * @param sqlLocations 放置sql相应路径名
	 * @see i.e.String packagename="com.zhukovasky.common.utils";
	 * 			String xmlname="testxml.xml"
	 * 			String sqlname="queryMyBudget";
	 * 			那么它的值应该是
	 * 			"com.zhukovasky.common.utils.testxml.queryMyBudget"
	 * 			程序会自动计算相应的地址并生成实际的路径名
	 * @param Map<String,Object> parameterMap 查询参数
	 * @return List<Map> 返回结果为HashMap,对于单条记录
	 *
	 * */
	public List<Map> queryNameSqlByHibernate(String sqlLocations,Map<String,Object> parameterMap,PageCond page) throws MyRuntimeException;
	/***
	 * @author zhukovasky
	 * @param sqlLocations 放置存储过程位置
	 * */
	public void callProcedures(String sqlLocations,Map<String,Object> parameterMap);
}
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;

import org.hibernate.Criteria;
import org.hibernate.EntityMode;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.transform.Transformers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

import com.HomeFurnishing.common.DataBaseUtil.basic.HibernateSessionFactory;
import com.HomeFurnishing.common.Exceptions.MyRuntimeException;
import com.HomeFurnishing.common.Pagination.Pagination;
import com.HomeFurnishing.common.XmlUtils.XmlUtils;
import com.HomeFurnishing.common.entity.PageCond;

public class HibernateDAOImpl implements HibernateDAO {
	private static final Logger log = LoggerFactory.getLogger(HibernateDAOImpl.class);
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * @see 该方法可能在实体没有sequence的情况下使用会有些问题
	 * */
	public void saveEntity(String klass, Object obj) {
		if(obj==null){
			log.error("saveEntity方法对象为空!");
		}
		Session session=HibernateSessionFactory.getSessionFactory().openSession();
		log.info("保存实体");
		session.save(klass, obj);
		session.flush();

	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public void updateEntity(String klass, Object obj) {
		Session session=HibernateSessionFactory.getSessionFactory().openSession();

		session.update(klass, obj);
		session.flush();
	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public void insertEntity1(String klass, Object obj) {
		Session session=HibernateSessionFactory.getSessionFactory().openSession();

		session.save(klass, obj);
		session.flush();
	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public void deleteEntity(String klass, Object obj) {
		// TODO Auto-generated method stub

	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public void deleteEntityByCascade(Class klass, Object[] obj) {
		// TODO Auto-generated method stub

	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public List queryEntitiesByCriteria(Criterion criteria, String klass,
			List<Order> orders) {
		// TODO Auto-generated method stub
		return null;
	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */
	@SuppressWarnings("unchecked")
	public <V> V expandEntity(String klass, V obj) {
		Session session=HibernateSessionFactory.getSessionFactory().openSession();
		ClassMetadata cl=HibernateSessionFactory.getSessionFactory().getClassMetadata(klass);
		Serializable id=cl.getIdentifier(obj, EntityMode.POJO);
		obj=(V) session.get(klass, id);
		return obj;
	}
	/**
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 */
	public List queryEntitiesByTemplate(String klass, Object obj,
			Criterion criteria, List<Order> orders) {
		Session session=HibernateSessionFactory.getSession();
		Criteria criterias=session.createCriteria(klass).add(Example.create(obj)).add(criteria);
		List list=null;
		if(orders==null){
			list=criterias.list();
		}else{
			for(Order iter:orders){
				criterias.addOrder(iter);
			}
		}
		list=criterias.list();
		return list;
	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * **/
	public void insertEntity(String klass, Object obj) {
		Session session=HibernateSessionFactory.getSessionFactory().openSession();
		session.save(klass, obj);
		session.flush();
	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public void deleteEntityByCascade(String klass, Object[] obj) {
		// TODO Auto-generated method stub

	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public Object[] queryEntitiesByCriteria(Criterion criteria, String klass,
			PageCond page, List<Order> orders) {
		Object[] result=Pagination.doQueryPageCond(klass, criteria, orders, page);
		return result;
	}
	/***
	 * @param klass 实体名称,类的名称
	 * @param Obj 实体对象
	 * */

	public Object[] queryEntitiesByTemplate(String klass, Object obj,
			Criterion criteria, PageCond page, List<Order> orders) {
		Object[] result=Pagination.doQueryPageCond(klass, criteria, orders, page);
		return result;
	}
	/****
	 * @author zhukovasky
	 * @param sqlLocations 放置sql相应路径名
	 * @see i.e.String packagename="com.zhukovasky.common.utils";
	 * 			String xmlname="testxml.xml"
	 * 			String sqlname="queryMyBudget";
	 * 			那么它的值应该是
	 * 			"com.zhukovasky.common.utils.testxml.queryMyBudget"
	 * 			程序会自动计算相应的地址并生成实际的路径名
	 * @param Map<String,Object> parameterMap 查询参数
	 * @return List<Map> 返回结果为HashMap,对于单条记录
	 *
	 * */
	public List<Map> queryNameSqlByHibernate(String sqlLocations,
			Map<String, Object> parameterMap) throws MyRuntimeException{
		String systempath=System.getProperty("user.dir");
		String realXmlPath=XmlUtils.getRealSqlName(sqlLocations);
		String querySqlname=XmlUtils.getRealSqlName(sqlLocations);
		realXmlPath=systempath+File.separator+"src"+File.separator+realXmlPath;
		String sql="";
		boolean hasExceptions=false;
		Throwable ee=null;
		Session session=null;
		List<Map> result=null;
		try {
			sql=XmlUtils.loadSqlFromXml(realXmlPath, querySqlname, parameterMap);
		} catch (ParserConfigurationException e) {
			log.error("编译XML错误");
			ee=e;
			hasExceptions=true;
		} catch (IOException e){
			log.error("文件读写异常");
			ee=e;
			hasExceptions=true;
		} catch (SAXException e) {
			log.error("解析XML错误");
			ee=e;
			hasExceptions=true;
		}finally{
			if(hasExceptions==true){
				throw new MyRuntimeException(ee);
			}else{
				session=HibernateSessionFactory.getSession();
				SQLQuery sqlquery=session.createSQLQuery(sql);
				String[] RealParameters=sqlquery.getNamedParameters();
				for(String iter:RealParameters){
					if(parameterMap.containsKey(iter)){
						sqlquery.setParameter(iter, parameterMap.get(iter));
					}
				}
				sqlquery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
				result=sqlquery.list();
			}
		}
		return result;
	}
	/****
	 * @author zhukovasky
	 * @param sqlLocations 放置sql相应路径名
	 * @see i.e.String packagename="com.zhukovasky.common.utils";
	 * 			String xmlname="testxml.xml"
	 * 			String sqlname="queryMyBudget";
	 * 			那么它的值应该是
	 * 			"com.zhukovasky.common.utils.testxml.queryMyBudget"
	 * 			程序会自动计算相应的地址并生成实际的路径名
	 * @param Map<String,Object> parameterMap 查询参数
	 * @return List<Map> 返回结果为HashMap,对于单条记录
	 *
	 * */
	public List<Map> queryNameSqlByHibernate(String sqlLocations,
			Map<String, Object> parameterMap, PageCond page)  throws MyRuntimeException{
		String systempath=System.getProperty("user.dir");
		String realXmlPath=XmlUtils.getRealSqlName(sqlLocations);
		String querySqlname=XmlUtils.getRealSqlName(sqlLocations);
		realXmlPath=systempath+File.separator+"src"+File.separator+realXmlPath;
		String sql="";
		boolean hasExceptions=false;
		Throwable ee=null;
		Session session=null;
		List<Map> result=null;
		try {
			sql=XmlUtils.loadSqlFromXml(realXmlPath, querySqlname, parameterMap);
		} catch (ParserConfigurationException e) {
			log.error("编译XML错误");
			ee=e;
			hasExceptions=true;
		} catch (IOException e){
			log.error("文件读写异常");
			ee=e;
			hasExceptions=true;
		} catch (SAXException e) {
			log.error("解析XML错误");
			ee=e;
			hasExceptions=true;
		}finally{
			if(hasExceptions==true){
				throw new MyRuntimeException(ee);
			}else{
				session=HibernateSessionFactory.getSession();
				SQLQuery sqlquery=session.createSQLQuery(sql);
				String[] RealParameters=sqlquery.getNamedParameters();
				for(String iter:RealParameters){
					if(parameterMap.containsKey(iter)){
						sqlquery.setParameter(iter, parameterMap.get(iter));
					}
				}
				sqlquery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
				result=Pagination.doQueryPageCond(sqlquery, page);
			}
		}
		return result;
	}

	public void callProcedures(String sqlLocations,
			Map<String, Object> parameterMap) {
		String systempath=System.getProperty("user.dir");
		String realXmlPath=XmlUtils.getRealSqlName(sqlLocations);
		String querySqlname=XmlUtils.getRealSqlName(sqlLocations);
		realXmlPath=systempath+File.separator+"src"+File.separator+realXmlPath;
		String sql="";
		boolean hasExceptions=false;
		Throwable ee=null;
		Session session=null;

		try {
			sql=XmlUtils.loadSqlFromXml(realXmlPath, querySqlname, parameterMap);
		} catch (ParserConfigurationException e) {
			log.error("编译XML错误");
			ee=e;
			hasExceptions=true;
		} catch (IOException e){
			log.error("文件读写异常");
			ee=e;
			hasExceptions=true;
		} catch (SAXException e) {
			log.error("解析XML错误");
			ee=e;
			hasExceptions=true;
		}finally{
			if(hasExceptions==true){
				throw new MyRuntimeException(ee);
			}else{
				session=HibernateSessionFactory.getSession();
				SQLQuery sqlquery=session.createSQLQuery(sql);
				String[] RealParameters=sqlquery.getNamedParameters();
				for(String iter:RealParameters){
					if(parameterMap.containsKey(iter)){
						sqlquery.setParameter(iter, parameterMap.get(iter));
					}
				}
				sqlquery.executeUpdate();
			}
		}

	}

}

时间: 2024-10-18 15:25:58

Hibernate的一种用法的相关文章

Hibernate中Criteria的用法

Hibernate中Criteria的用法 criteria英[kra??t??r??]美[kra??t?r??]标准 1,Criteria Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria . 2,DetachedCriteria Spring 的框架提供了getHibernateTemplate ().findByCriteria(detachedCriteria) 方法可

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

Linux内核中等待队列的几种用法

Linux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,下面简单总结了等待队列的四种用法,希望对读者有所帮助. 1. 睡眠等待某个条件发生(条件为假时睡眠): 睡眠方式:wait_event, wait_event_interruptible 唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真) 2. 手工休眠方式一: 1)建立并初始化一个等待队列项 DEFINE_WAIT(my_wait) <==> wait_queue

[java]static关键字的四种用法

在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下static关键字及其用法. static关键字 1.修饰成员变量 在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员,这句话挺起来都点奇怪,其实这是相对于对象的属性和方法来说的.请看下面的例子:(未避

深入hibernate的三种状态(转)

学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象.但是大家又是否对hibernate的session的那几个特殊方法一清二楚呢?或者说大家是否能够一眼就快速看出一个测试用例在反复的调用sess

深入hibernate的三种状态

学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象.但是大家又是否对hibernate的session的那几个特殊方法一清二楚呢?或者说大家是否能够一眼就快速看出一个测试用例在反复的调用sess

JSP中的include的两种用法

1.两种用法 <@inlcude file ="header.jsp"/> 此时引入的是静态的jsp文件,它将引入的jsp中的源代码原封不动地附加到当前文件中,所以在jsp程序中使用这个指令的时候file里面的值(即要导入的文件)不能带多余的标签或是与当前jsp文件重复的东西.例如里面不要包含<html><body>这样的标签,因为是把源代码原封不动的附加过来,所以会与当前的jsp中的这样的标签重复导致出错. <jsp:include page

Android---24---Spinner的两种用法

Spinner是一个列表选择框,它有两种用法: 一种是使用android:entries属性的,一种是不使用该属性,通过动态的添加Adapter来实现的. 第一种: MainActivity.java: import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import andr