跟我学 NHibernate (二)

1. 在 NHibernate 中使用事务, 主要代码如下:

        #region 事务

        public IList<Customer> GetAll()
        {
            // 开启事物
            using (ITransaction tx = _session.BeginTransaction())
            {
                try
                {
                    //提交事务
                    tx.Commit();
                    return null;

                }
                catch (HibernateException ex)
                {
                  // 回滚事务
                    tx.Rollback();
                   throw ex ;
                }

            }
        }

        #endregion

2. 使用N NHibernate 进行CRUD 操作

      #region  添加、 删除、更新对象

        public int Add(Customer model)
        {

         int id =(int) _session.Save(model);
         _session.Flush();

         return id;
        }

        public void Delete ( Customer model)
        {

             _session.Delete(model);

             _session.Flush();

        }

        public void Update( Customer model)
        {
          // 更新
           _session.Update(model);

           // 更新或保存 •检查这个对象是否已经存在Session中。如果对象不在,调用Save(object)来保存。如果对象存在,检查这个对象是否改变了。 如果对象改变,调用Update(object)来更新。

           //_session.SaveOrUpdate(model);

           _session.Flush();

        }

        #endregion

3. 带条件的查询

     #region 条件查询 (Criteria Query)

        // 创建 Criteria 实例 使用ISession接口的CreateCriteria方法创建了NHibernate.ICriteria接口一个特定的持久化类的查询实例,也可以说ISession是用来制造Criteria实例的工厂
        public IList<Customer> Creater()
        {

           ICriteria cria = _session.CreateCriteria(typeof(Customer));

           cria.SetMaxResults(50);

           IList<Customer> list = cria.List<Customer>();

           return list;

        }

        // 结果集限制数据
        //使用ICriteria接口提供的Add方法添加Restrictions类中约束表达式可以限制一些结果集的作用。
        public IList<Customer> Norrawing()
        {

         IList<Customer> customers = _session.CreateCriteria(typeof(Customer))
                                       .Add(Restrictions.Like("FirstName","y%"))// 查询 FirstName like  y%
                                       .Add(Restrictions.Eq("FirstName", "yang "))  // 查询 FirstName=Yang
                                       .Add(Restrictions.Between("LastName","%m","_n")) // 查询 LastName between %m _n
                                       .List<Customer>();

           return customers;

        }

        // 结果集排序
        // 使用ICriteria.Order对结果集排序,第二个参数true代表asc,false代表desc。例如下面例子查询Customer对象按FirstName降序、Lastname升序。
         public IList<Customer> Orderss()
        {

           IList<Customer> customers = _session.CreateCriteria(typeof(Customer))
                                       .Add(Restrictions.Like("FristName","yangming"))
                                       .AddOrder(new Order("FirstName",false))  /// FirstName  降序排序
                                       .AddOrder(new Order("LastName",true))  // LastName 升序排序
                                       .List<Customer>();

          return customers;

        }

        /*
         * 条件查询同样支持关联查询、动态关联抓取(在介绍一对多,多对多关系中阐述),投影、聚合和分组,离线(detached)查询和子查询是2.0版新增加的内容
         * */

         // 根据 示例查询(Query By Example) 

         //根据示例查询(QBE,Query By Example)是条件查询的一种特殊情况,NHibernate.Criterion.Example类根据你指定的实例创造查询条件。其典型的用法:创建一个Example实例;在Example实例上设置值;根据Example和设置NHibernate返回其对象集合。

         public IList<Customer> Query()
         {

            Customer customer = new Customer { Firstname="yangyang", Lastname="wang"};

            return _session.CreateCriteria(typeof(Customer))
             .Add(Example.Create(customer))
             .List<Customer>();

         }

         //可以自行调整Example使之更实用:
         public IList<Customer> Query(Customer customer)
         {

            Example exa = Example.Create(customer)
             .IgnoreCase()
             .EnableLike()
             .SetEscapeCharacter(‘&‘);

             return _session.CreateCriteria(typeof(Customer))
             .Add(exa)
             .List<Customer>();

         }

        #endregion

        #region 查询  NHibernate查询语言(HQL)

        public IList<Customer> ListAll()
         {

           return _session.CreateCriteria(" from Customer ")
           .List<Customer>();

         }

         public IList<Customer> ListAll2()
        {

          return _session.CreateCriteria(" From Customer as c ")
          .List<Customer>();

          // group by 子句
          //return _session.CreateCriteria("select * from Customer group by  firstname ")
          //.List<Customer>();

         // distinct 子句
   //       return _session.CreateQuery("select distinct c.Firstname from Customer c")
   //.List<Customer>();

           // where 子句

          //return _session.CreateQuery("from Customer c where c.Firstname=‘YJing‘")
          // .List<Customer>();

           // 带参数的 where 子句
    //       // return _session.CreateQuery("from Customer c where c.CustomerId > :cid")
    //.SetInt32("cid", 1)
    //.List<Customer>();

        }

        #endregion

3. 用 NHibernate 进行分页查询

        #region  分页查询

         ISessionFactory SessionFactory;

         // 分页功能
         public IList<Customer> GetAll(int currentPage, int pageSize)
         {
             // 获取当前 session
             ISession curSession = SessionFactory.GetCurrentSession();

             ICriteria cria = _session.CreateCriteria(typeof(Customer));

             // 分页
             var model = cria.SetFetchSize(pageSize).SetFirstResult(currentPage).List<Customer>();

             return model;

         }

          // 分页查询
         //在Nhibernate里实现分页用 SetFirstResult 和SetMaxResults实现,SetFirstResult 简单的理解就是从第几条记录开始,SetMaxResults是取几条记录
         private IList<Customer> GetRecord(IList<ICriterion> queryConditions, int pageIndex, int pageSize, string orderField, bool isAscending)
         {

             ICriteria criteria = _session.CreateCriteria(typeof(Customer));

             foreach (ICriterion cri in queryConditions)
             {

                 criteria.Add(cri);

             }

             //记录总数
             int skipCount = (pageIndex - 1) * pageSize;

             criteria.AddOrder(new Order(orderField, isAscending));

             criteria.SetFirstResult(skipCount).SetMaxResults(pageSize);

             return criteria.List<Customer>();

             //SQL查询
             //IList<Customer> customerList = Session.CreateSQLQuery("SELECT * FROM Customer")
             //    .SetFirstResult(pageStart*pageLimit)
             //    .SetMaxResults(pageLimit)
             //    .SetResultTransformer(Transformers.AliasToBean<Customer>()).List<Customer>();
             //return customerList;

             IList<Customer> customers = _session.CreateSQLQuery("")
             .SetFirstResult(pageIndex * pageSize)
             .SetMaxResults(pageSize)
             .SetResultTransformer (NHibernate.Transform.Transformers.AliasToBean<Customer>()).List<Customer>();

             return customers;
         } 

        #endregion
时间: 2024-10-29 19:05:46

跟我学 NHibernate (二)的相关文章

笨鸟学php(二) 如何使用变量

一. 变量的声明 1. php中声明变量的方法:  $var = 123; 2. php是弱类型的语言, 变量的类型由存储的值决定 注: Java是强类型语言, 声明变量一定要先指定类型 3. isset() 和 unset() isset() : 判断值是否存在;    unset() : 去掉变量的值 <?php $a = $b = $c = $d = "hello, world"; unset($a); if(isset($a)){ echo $a; }else{ echo

一步一步学WebSocket(二) 使用SuperWebSocket实现自己的服务端

上一篇文章,我们了解了客户端如何与服务器创建WebSocket连接.但是一个巴掌拍不响,既然是通信,就必然最少要有两个端.今天我们来看看c#如何用已有的框架实现一个WebSocket服务端. 在.Net Framework 4.5及以上版本中,微软为我们集成了WebSocket协议的基本实现.微软提供的WebSocket对象位于System.Net.WebSocket命名空间下,使用起来挺繁琐的,所以我选择了SuperWebSocket框架来简化开发的难度. SuperWebSocket框架可以

从头开始学JavaScript (二)——变量及其作用域

原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义:var firstDemo; 二.变量的作用域 2.1基本概念 使用var 定义变量:定义该变量的作用域的局部变量,这种定义变量的方法也被成为显式声明. 这么说不理解的话可以看看下面这个简单粗暴的例子: test();function test(){var firstDemo="hello

三分钟教你学Git(二)之命令索引

记住这三个概念,工作区(Working Area),暂存区(Stage),版本库,通过add,工作区的变化到暂存区,通过commit暂存区的变化到本地版本库,通过push本地版本库的变化到远程版本库.下面是常用的命令. 保存进度恢复工作进度 #把工作区和暂存区的内容保存到进度列表里 git stash save "description" #列出stash里的所有项 git stash list #把进度恢复出来并删除进度列表中的项 git stash pop #只把进度恢复出来,不删

大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)

大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008) 分类: C#2013-08-10 18:47 1589人阅读 评论(5) 收藏 举报 NHibernateNUnitVisual Studio 2012 如果你没听过Nhibernate or NUnit,那么,恭喜你,和我一样,握个手吧.如果你已经是个老酱油了,那就道不同不带你玩了,请自觉绕行,,,.谨以此文献给像我这样广大的小白同胞们(鼓掌)! 话说2013年某月某日,听一武林前辈提起 NHibe

【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一)

先扯几句闲话 往往非科班出身的编程爱好者,以C作为入门语言时,往往会问:“我学了这个XX,能做些什么?” 其实,配合Google,基本上啥都能做了. 你甚至连链表都不需要,就可以写一个贪食蛇小游戏 :) 本系列将分4个部分,让任何一个仅仅会二维数组合结构体的初学者写出自己的贪食蛇 进入正题.我们先分析一下问题,确定下四个部分. 0.分析游戏的本质以及在控制台中的表现形式 1.分析贪食蛇游戏的基本结构 2.确定实现方案 3.全部源代码 一.游戏,或者视频游戏的本质是什么? 0.游戏的本质是程序 对

乐哥学AI_Python(二):Numpy索引,切片,常用函数

Numpy的索引和切片 ndarray对象的内容可以通过索引和切片查看和修改. 索引:ndarray对象中的元素索引基于0开始 切片:对数组里某个片段区域的描述 数组的切片也可以理解为原始数组的局部视图,都是指向内存中的原始数组,所以不同于列表复制,切片上的修改都会直接反映到原始数组上. 索引切片的实例代码演示: Numpy常用函数的代码演示: Numpy的置换函数transpose.T和swapaxes演示与区别 T适用于一.二维数组 arr = np.arange(12).reshape(3

再学ajax--第二天 | 基于php+mysql+ajax的表单注册、登录、注销

写在前面 ajax学习到了第二天,这次是用第一天封装的ajax函数,后端使用了php+mysql实现基本的注册,登录,注销. php是我前几个月get到的技能,我已经学习到了面向对象,知道各修饰符的含义,继承,接口,构造函数,实例化对象 mysql是跟php一块学的,学习了基本增删改查. ajax原理其实不难理解,最主要的就是XMLHttpRequest(ActiveXObject("Microsoft.XMLHTTP")):在理解该对象之后,最主要理解的是前后端数据的传递问题,我也是

从零开始学JavaScript二(基本概念)

基本概念 一.区分大小写 在ECMAScript中的一切(变量.函数名.操作符)都是区分大小写的. 如变量名test和Test分别表示两个不同的变量, 二.标识符 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符按照下列格式规则组合起来的一或者多个字符: 第一个字符必须为一个字母.下划线(_).或者一个美元符号($); 其它字符可以是字母.下划线.美元符号或数字. ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写,例如:firstSe