NHibernateHelper
来源:互联网 发布:java生命周期包括 编辑:程序博客网 时间:2024/04/28 14:31
个人的NHibernateHelper工具类。支持泛型操作,使用session-per-request模式,绑定session到web上下文。
注意点是,无需在Application_BeginRequest加入session开启代码,session的开启是在第一次需要调用时,Application_EndRequest事件加入NhibernateHelper.CloseSession();关闭session。
public class NhibernateHelper { private const string CurrentSessionKey = "nhibernate.current_session"; private static readonly ISessionFactory sessionFactory; private static readonly NhibernateHelper nhelper = new NhibernateHelper(); static NhibernateHelper() { sessionFactory = new Configuration().Configure().BuildSessionFactory(); } private NhibernateHelper() { } public static NhibernateHelper getInstance() { return nhelper; } //返回新开启的session,未绑定到上下文,需显式关闭 public static ISession GetNewSession() { return sessionFactory.OpenSession(); } public static IStatelessSession getStatelessSession() { return sessionFactory.OpenStatelessSession(); } //返回绑定在当前上下文的session,如果上下文还没有session新开启并绑定 public static ISession GetCurrentSession() { ISession session; try { if (CurrentSessionContext.HasBind(sessionFactory)) { session = sessionFactory.GetCurrentSession(); } else { session = sessionFactory.OpenSession(); CurrentSessionContext.Bind(session); } return session; } catch { throw; } } public static void CloseSession() { if (CurrentSessionContext.HasBind(sessionFactory)) { ISession session = CurrentSessionContext.Unbind(sessionFactory); //session.Flush(); session.Close(); } } public static void CloseSessionFactory() { if (sessionFactory != null) { sessionFactory.Close(); } } /// <summary> /// 根据主键查询一个实体对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="id"></param> /// <returns></returns> public T get<T>(object id) { ISession session = GetCurrentSession(); return (T)session.Get(typeof(T), id); } /// <summary> /// 保存 /// </summary> /// <param name="entity"></param> /// <returns>主键</returns> public object save(object entity) { ISession session = GetCurrentSession(); object id = session.Save(entity); session.Flush(); return id; } /// <summary> /// 更新 /// </summary> /// <param name="entity"></param> public void update(object entity) { ISession session = GetCurrentSession(); session.Update(entity); session.Flush(); } /// <summary> /// 删除 /// </summary> /// <param name="entity"></param> public void delete(object entity) { ISession session = GetCurrentSession(); using (ITransaction tx = session.BeginTransaction()) { try { session.Delete(entity); tx.Commit(); } catch (HibernateException) { tx.Rollback(); throw; } } } /// <summary> /// 根据条件查询一个对象 /// </summary> /// <param name="where">查询条件</param> /// <param name="paramValues">查询条件里的参数值数组</param> /// <returns>一个对象T</returns> public T get<T>(String where, Object[] paramValues) { IList<T> list = find<T>(where, paramValues, null); if (list.Count >= 1) return list[0]; else return default(T); } /// <summary> /// 查询对象 /// </summary> /// <typeparam name="T">ilist</typeparam> /// <returns></returns> public virtual IList<T> find<T>() { ISession session = GetCurrentSession(); return session.CreateCriteria(typeof(T)).List<T>(); } /// <summary> /// 根据条件查询,排序方式查询 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="where">查询条件</param> /// <param name="paramValues">参数值</param> /// <param name="orderBy">排序字段加排序方式</param> /// <returns></returns> public IList<T> find<T>(String where, Object[] paramValues, String orderBy) { String hql = "from " + typeof(T).FullName; if (!string.IsNullOrEmpty(where)) hql = hql + " where " + where; if (!string.IsNullOrEmpty(orderBy)) hql = hql + " order by " + orderBy; return executeQuery<T>(hql, paramValues); } public IList<T> findWithPage<T>(String hql, int rowPage, int curPage) { ISession session = GetCurrentSession(); IQuery query = session.CreateQuery(hql); return query.SetFirstResult(rowPage * (curPage - 1)).SetMaxResults(rowPage).List<T>(); } /// <summary> /// 运行hql语句查询,返回list /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="hql">hql语句</param> /// <param name="values">参数值</param> /// <returns>IList</returns> public virtual IList<T> executeQuery<T>(String hql, Object[] values) { if (values != null && values.Length > 0 && StringUtils.getCountCharInString(hql, '?') != values.Length) throw new ArgumentException("hql语句需要的参数个数与数组参数内的元素个数不一致"); ISession session = GetCurrentSession(); IQuery query = session.CreateQuery(hql); if (values != null && values.Length > 0) { for (int i = 0; i < values.Length; i++) { query.SetParameter(i, values[i]); } } return query.List<T>(); } /// <summary> /// 运行hql查询返回一个对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="hql"></param> /// <param name="values"></param> /// <returns></returns> public virtual T executeQueryForObj<T>(String hql, Object[] values) { if (values != null && values.Length > 0 && StringUtils.getCountCharInString(hql, '?') != values.Length) throw new ArgumentException("hql语句需要的参数个数与数组参数内的元素个数不一致"); ISession session = GetCurrentSession(); IQuery query = session.CreateQuery(hql); if (values != null && values.Length > 0) { for (int i = 0; i < values.Length; i++) { query.SetParameter(i, values[i]); } } IList<T> l = query.List<T>(); if (l != null && l.Count > 0) { return l[0]; } else { return default(T); } } public virtual IList<Object> executeSqlQuery(String sql) { ISession session = GetCurrentSession(); return session.CreateSQLQuery(sql).List<Object>(); } public int execute(String hql) { ISession session = GetCurrentSession(); using (ITransaction tx = session.BeginTransaction()) { try { IQuery query = session.CreateQuery(hql); int count = query.ExecuteUpdate(); tx.Commit(); return count; } catch (HibernateException) { tx.Rollback(); throw; } } } public void batchExecuteSql(List<String> hqlList) { if (hqlList.Count == 0) throw new ArgumentException(); ISession session = GetCurrentSession(); using (ITransaction tx = session.BeginTransaction()) { try { for (int i = 0; i < hqlList.Count; i++) { IQuery query = session.CreateSQLQuery(hqlList[i]); int count = query.ExecuteUpdate(); if (i % 30 == 0) { session.Flush(); session.Clear(); } } tx.Commit(); } catch (HibernateException) { tx.Rollback(); throw; } } } public virtual int executeSql(String sql) { ISession session = GetCurrentSession(); using (ITransaction tx = session.BeginTransaction()) { try { ISQLQuery q = session.CreateSQLQuery(sql); int count = q.ExecuteUpdate(); tx.Commit(); return count; } catch (HibernateException) { tx.Rollback(); throw; } } }}
nhibernate配置选项<property name="current_session_context_class">web</property>
- NHibernateHelper
- TaidouDatebase-NHibernateHelper
- NHibernate扩展方法(-) --NHibernateHelper
- shell脚本----------路由和数据库的同步
- java工具类11.1之Gson,Jsonobject,中文乱码,接口
- 数组
- RAII惯用法:C++资源管理的利器
- 请求WCF时:HTTP 请求已超过分配的超时。为此操作分配的时间可能是较长超时的一部分
- NHibernateHelper
- VMware Player 虚拟机中音乐播放无声音 问题
- Java开发中使用Oracle数据库的一点注意事项
- 说说哪本书是对程序员最有影响、每个程序员都该阅读的书?
- zoj 1406 poj 1251 Jungle Roads
- 制作可独立发布的android模拟器
- Delphi XE5 FireMonkey移动开发示例:Tree Fractal
- 简单实现Java中的ArrayList
- JSP项目部署到本地tomcat