Nhibernate的第一个实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nhibernate的第一个实例相关的知识,希望对你有一定的参考价值。

第一个NhIbernate程序

 

1、目的:

a) 链接到oracle数据库

b) 增删改

c) 基本查询、sql查询

d) 视图查询

e) 使用存储过程

f) 多表查询、级联查询

g) 级联增删改

 

2、后续目的

a) 加载机制——立即加载or延迟加载

b) 并发控制

c) 缓存——一级缓存,二级缓存

 

   接下来我会一一完成上面的目的,以便对Hhibernate有更多的了解,写希望各位能多多的指正。

 

3、第一个项目

a) 下载

Nhibernate最新版本为4.0.1.GA,下载地址:http://nhforge.org/

 

下载内容如下图

 技术分享

 

其中  Configuration_Templates中放的是各个数据库连接的配置文件样本模板,基本上包含了主流的数据库

 

B) 创建项目

根据三层架构把项目分为三层:

第一层: Model层——主要存放数据实体与映射文件

第二层: DAL层——存放数据库的操作方法

第三层: Facade层——业务逻辑层,主要实现与页面的业务逻辑

第四层: View层——页面层,包含接口、web

第五层:Common层——公共类层,主要存储一些共有的操作类

 

由于分五层为个人习惯问题,有不习惯的园友可以分三层:去掉第三层与第五层。

        分布图如下

       技术分享

    

 

  C) 引用DLL文件 (这里介绍主要的几个引用,其他的话,可以根据我放出的实例来看)

         Model层: 需要引入Required_Bins 文件夹中的Iesi.Collections.dllNHibernate.dll

         DAL层 :  需要引入Required_Bins 文件夹中的Iesi.Collections.dllNHibernate.dllModel层;

         Facade层:需要引入Model层与DAL层;

         View层:  需要引入Required_Bins 文件夹中的Iesi.Collections.dllNHibernate.dlllog4net.dllModel层与Facade层;

   

        其实还有另一种方法可以添加引用,就是通过NuGet进行引用,这种方法我在这里就不介绍了。

 

     D) 创建数据库

        先在oracle数据库中创建一张表,如图

技术分享

 

      该表没有任何外键关联,也没其他表的ID字段。

 

E)创建model层中的持久化类 及 xml映射文件

创建cat的类

技术分享

 

创建catmapping对应的xml文件

 技术分享

 

基本文件位置如下

 技术分享

 

    F)修改配置文件

      因为连接的是oracle的数据库,所以在下载的文件Configuration_Templates文件夹中找到oracle的配置文件,如图  

     技术分享

  选择oracle.cfg.xml 文件 放到View层下面 ,并且修改名字。默认的名字是hibernate.cfg.xml,且需要放在bin——debug文件夹下面。大多数情况我们会根据自身的习惯进行一些调整。比如我喜欢放在App_Data文件夹下。

   技术分享

 

    修改配置文件信息

        原始的配置文件信息

 技术分享

        我修改后的文件信息

 技术分享

    G)编写DAL方法与实例

 

首先  先写一个NhibernateHelper.cs文件

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 using NHibernate;
 8 using NHibernate.Linq;
 9 using NHibernate.Criterion;
10 
11 namespace CommonClass
12 {
13    public class NHibernateHelper
14     {
15        /// <summary>
16         /// Session工厂
17         /// </summary>
18         private  readonly ISessionFactory SessionFactory;
19         /// <summary>
20         /// nhibernate.cfg.xml 所在相对路径
21         /// </summary>
22         private  string xmlString = "App_Data/hibernate.cfg.xml";
23         /// <summary>
24         /// 构造函数
25         /// </summary>
26         public NHibernateHelper()
27         {
28             if (SessionFactory == null)
29             {
30                 var cfg = new NHibernate.Cfg.Configuration().Configure(xmlString);
31                
32                 SessionFactory = cfg.BuildSessionFactory();
33                 
34             }
35         }
36 
37        public NHibernateHelper(string path)
38         {
39             if (SessionFactory == null)
40             {
41                 var cfg = new NHibernate.Cfg.Configuration().Configure(path);
42 
43                 SessionFactory = cfg.BuildSessionFactory();
44             }
45         }
46 
47         /// <summary>
48         /// 获取一个Isession
49         /// </summary>
50         /// <returns></returns>
51         public ISession GetSession()
52         {
53             return SessionFactory.OpenSession();
54         }
55         /// <summary>
56         /// 关闭一个Isession
57         /// </summary>
58         /// <param name="session"></param>
59         public void CloseSeeion(ISession session)
60         {
61             session.Close();
62         }
63 
64         /// <summary>
65         /// 关闭一个Isessionfactory
66         /// </summary>
67         public void CloseSessionFactory()
68         {
69             SessionFactory.Close();
70         }
71     }
72 }

   再编写CATDAL.cs  用来操作数据库的方法

 

技术分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using NHibernate;
using NHibernate.Linq;
using NHibernate.Criterion;

using ModelEntityClass.Model;
using CommonClass;

namespace DALClass
{
    public class CATDAL
    {
        private  NHibernateHelper HB_Helper = null;
        public CATDAL()
        {
            HB_Helper = new NHibernateHelper();
        }
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="entitys"></param>
        /// <returns></returns>
        public bool InsertAll(List<CAT> entitys)
        {
            bool flag = false;
            ISession session = HB_Helper.GetSession();
            using (ITransaction tt = session.BeginTransaction())
            {
                try
                {
                    foreach (CAT entity in entitys)
                    {
                        session.Save(entity);
                    }
                    session.Flush();
                    tt.Commit();
                    flag = true;
                }
                catch (HibernateException ex)
                {
                    tt.Rollback();
                }
            }

            HB_Helper.CloseSeeion(session);
            return flag;
        }
        /// <summary>
        /// 根据ID进行查找
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public CAT Find(string id)
        {
            ISession session = HB_Helper.GetSession();
            CAT cat = null;
            using (ITransaction tt = session.BeginTransaction())
            {
                try
                {
                    cat = session.Query<CAT>().Where(p => p.ID == id).FirstOrDefault();
                }
                catch (HibernateException ex)
                {
                    tt.Rollback();
                }
            }

            HB_Helper.CloseSeeion(session);
            return cat;
        }
        /// <summary>
        /// 查询所有
        /// </summary>
        /// <returns></returns>
        public List<CAT> FindAll()
        {
            ISession session = HB_Helper.GetSession();
            //ICriteria criteria = session.CreateCriteria(typeof(CAT));
            List<CAT> catList = null;
            using (ITransaction tt = session.BeginTransaction())
            {
                try
                {
                    catList = session.Query<CAT>().ToList();
                }
                catch (HibernateException ex)
                {
                    tt.Rollback();
                }
            }

            HB_Helper.CloseSeeion(session);
            return catList;
        }

        /// <summary>
        /// 删除所有
        /// </summary>
        /// <param name="entitys"></param>
        /// <returns></returns>
        public bool DeleteAll(List<CAT> entitys)
        {

            bool flag = false;
            ISession session = HB_Helper.GetSession();
            using (ITransaction tt = session.BeginTransaction())
            {
                try
                {
                    foreach (CAT entity in entitys)
                    {
                        session.Delete(entity);
                    }
                    session.Flush();
                    tt.Commit();
                    flag = true;
                }
                catch (HibernateException ex)
                {
                    tt.Rollback();
                }
            }

            HB_Helper.CloseSeeion(session);
            return flag;

        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public bool Delete(CAT entity)
        {

            bool flag = false;
            ISession session = HB_Helper.GetSession();
            using (ITransaction tt = session.BeginTransaction())
            {
                try
                {
                    session.Delete(entity);

                    session.Flush();
                    tt.Commit();
                    flag = true;
                }
                catch (HibernateException ex)
                {
                    tt.Rollback();
                }
            }

            HB_Helper.CloseSeeion(session);
            return flag;

        }


        /// <summary>
        /// 保存和添加
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public bool SaveAndUpdate(List<CAT> entitys)
        {
            bool flag = false;
            ISession session = HB_Helper.GetSession();
            using (ITransaction tt = session.BeginTransaction())
            {
                try
                {
                    foreach (CAT entity in entitys)
                    {
                        session.SaveOrUpdate(entity);
                    }
                    session.Flush();
                    tt.Commit();
                    flag = true;
                }
                catch (HibernateException ex)
                {
                    tt.Rollback();
                }
            }

            HB_Helper.CloseSeeion(session);
            return flag;
        }
    }
}
View Code

 

   接下来编辑业务逻辑层的类,由于它是对应ConsoleApplication1项目的这个业务,我把他命名成ConsoleFacade(里面只有一个方法,后面可以根据需要进行添加)

技术分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using ModelEntityClass.Model;
using DALClass;

namespace FacadeClass
{
   public  class ConsoleFacade
    {

       public bool InsertAll(List<CAT> entitys)
       {
           CATDAL dal = new CATDAL();
           return dal.InsertAll(entitys);
       }
    }
}
View Code

   现在我们进行测试

技术分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using ModelEntityClass.Model;
using FacadeClass;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            CAT cat = new CAT();

            cat.ID = Guid.NewGuid().ToString();

            cat.NAME = "芝麻";
            cat.SHORTNAME = "小婊砸";
            cat.CREATDATA = DateTime.Now;
            cat.ADDRESS = "北京市不知道什么的地方";
            cat.AGE = 2;
            cat.CODE = "M0001";

            List<CAT> InsertList = new List<CAT> ();
            InsertList.Add(cat);

            ConsoleFacade facade = new ConsoleFacade();
           if(  facade.InsertAll(InsertList))
           {
               Console.WriteLine("添加成功");
           }else
           {
               Console.WriteLine("添加失败");
           }

           Console.ReadKey();
        }
    }
}
View Code

   测试页面如下

技术分享

 

这样我们一个简单的Nhibernate实例就完成了。

 

 项目实例下载 

 

以上是关于Nhibernate的第一个实例的主要内容,如果未能解决你的问题,请参考以下文章

您如何使用 NHibernate 进行分页?

NHibernate 错误 - 在刷新之前保存瞬态实例

NHibernate之(13):初探立即加载机制

NHibernate之(12):初探延迟加载机制

NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段

将 NHibernate 开放会话合并到 DB(耦合 NHibernate 和 DB 会话)