NHibernate初学一之简单增删改查

之前有简单了解NHibernate,但因项目一直没有运用因此也没有机会进行一个详细了解;最近利用一点空闲的时间认真学习它;一样但愿把学习过程进行简单记录,今天简单写一个针对MSSQL数据库的增删改查的小实例,做为进行学习NHibernate第一步git

一:ORM理论github

ORM是经过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。数据持久化:就是将内存中的 数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。在应用程序中能永久地保存各个处理状态信息的机制。若是没有持久化这个机制,状态只能保存在内存中,机器关机后就会丢失。数据库


二:NHibernate简介编程

NHibernate就是用于作数据持久化相关的编程工做,可以使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可让开发人员投入到业务逻辑的实现。NHibernate是由一个Java开源项目Hibernate发展来而来。与数据库打交道主要是用NHibernate,NHibernate的开发者尝试为其提供与Hibernate相似的API。使用前咱们须要下载Nhibernate,微信

下载地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/。session

NHibernate-3.3.3.GA-src.zip 是源文件,里面有源代码以及链接各类数据库的写法模板。架构

NHibernate-3.3.3.GA-bin.zip 是使用文件,解压后能直接使用的dll。在接下的实例中,使用的NHibernate-3.3.3GA版本app


三:NHibernate实例ide

实例中解决方案简单的建立三层架构,符合开发过程当中最简单的运用;学习

 

1:首先在数据库中建立一个表T_School,脚本以下:

USE [TestDb]
GO
/****** 对象:  Table [dbo].[T_School]    脚本日期: 03/01/2014 19:45:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_School](
    [ID] [uniqueidentifier] NOT NULL,
    [SchoolName] [nvarchar](255) COLLATE Chinese_PRC_CI_AS NULL,
    [BuildDate] [datetime] NULL,
    [Address] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [IsSenior] [bit] NULL,
    [StudentNum] [int] NULL
) ON [PRIMARY]

2:建立实体层Model,实体中的字段还以virtual进行修饰

namespace Wujy.ModelLibrary.Entity
{
    public class SchoolModel
    {
        /// <summary>
        /// ID
        /// </summary>
        public virtual Guid ID
        {
            get;
            set;
        }
        /// <summary>
        /// SchoolName
        /// </summary>
        public virtual string SchoolName
        {
            get;
            set;
        }
        /// <summary>
        /// BuildDate
        /// </summary>
        public virtual DateTime? BuildDate
        {
            get;
            set;
        }
        /// <summary>
        /// Address
        /// </summary>
        public virtual string Address
        {
            get;
            set;
        }
        /// <summary>
        /// 高级
        /// </summary>
        public virtual bool IsSenior
        {
            get;
            set;
        }
        /// <summary>
        /// 人数
        /// </summary>
        public virtual int? StudentNum
        {
            get;
            set;
        }        
    }
}

2.1 此处还增长NHibernate须要的XML映射文件,以实体名+hbm.xml结尾而且还要设置其生成操做为"嵌入的资源";其中Class中的name是指实体类的完整名及类库名称,代码以下

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Maticsoft" namespace="Maticsoft">
  <class name="Wujy.ModelLibrary.Entity.SchoolModel, Wujy.ModelLibrary" table="T_School">
    <id name="ID" column="ID" type="Guid"></id>
    <property name="SchoolName" column="SchoolName" type="string"  />
    <property name="BuildDate" column="BuildDate" type="DateTime"  />
    <property name="Address" column="Address" type="string"  />
    <property name="IsSenior" column="IsSenior" type="bool"  />
    <property name="StudentNum" column="StudentNum" type="int"  />
  </class>
</hibernate-mapping>

3:建立一个类库做为DAL层,此处咱们引用NHibernate两个DLL,分别为NHibernate.dll及Iesi.Collection.dll;此处建立一个帮助类NHibernateHelper用于ISessionFactory;

using NHibernate;
using NHibernate.Cfg;

namespace Wujy.DalLibrary.DalHelp
{
    public class NHibernateHelper
    {
        private ISessionFactory _sessionFactory;
        public NHibernateHelper()
        {
            _sessionFactory = GetSessionFactory();
        }
        private ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }
        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }
    }
}

3.1:建立类SchoolDal并把一些操做的代码写入,如查不用transaction.Commit()则要运和isession.Flush()不然没法执行SQL就没有效果:

using Wujy.ModelLibrary.Entity;
using NHibernate;
using Wujy.DalLibrary.DalHelp;

namespace Wujy.DalLibrary
{
    public class SchoolDal
    {
        private ISession isession;

        public SchoolDal()
        {
            isession = new NHibernateHelper().GetSession();
        }

        public void Add(SchoolModel model)
        {
            //如查不用transaction.Commit()则要运和isession.Flush()不然没法执行SQL就没有效果
            //ITransaction transaction = isession.BeginTransaction();
            //isession.Save(model);
            //transaction.Commit();
            isession.Save(model);
            isession.Flush();
        }

        public bool Update(SchoolModel model)
        {
            try
            {
                isession.Update(model);
                isession.Flush();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                isession.Close();
            }
        }

        public bool Delete(SchoolModel model)
        {
            try
            {
                isession.Delete(model);
                isession.Flush();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                isession.Close();
            }
        }

        public SchoolModel GetSchoolById(Guid ID)
        {
            return isession.Get<SchoolModel>(ID);
        }

        public IList<SchoolModel> GetSchoolList()
        {
            IList<SchoolModel> list = null;
            list = isession.QueryOver<SchoolModel>().List();
            return list;
        }
    }
}

4:由于本实例重点是对NHibernate运用,对于逻辑层就简单的引用;代码也很简单:

using Wujy.ModelLibrary.Entity;
using Wujy.DalLibrary;

namespace Wujy.BllLibrary
{
    public class SchoolBll
    {
        public static void Add(SchoolModel model) 
        {
            new SchoolDal().Add(model);
        }

        public static bool Update(SchoolModel model)
        {
            return new SchoolDal().Update(model);
        }

        public static bool Delete(SchoolModel model)
        {
            return new SchoolDal().Delete(model);
        }

        public static SchoolModel GetSchoolById(Guid ID)
        {
            return new SchoolDal().GetSchoolById(ID);
        }

        public static IList<SchoolModel> GetSchoolList()
        {
            return new SchoolDal().GetSchoolList();
        }
    }
}

5:WebUI除简单调用BLL层外,另外一个比较重要是NHibernate链接数据库的配置文件,其中其属性复制到输出目录改成"始终复制";Hibernate.cfg.xml内容:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="NHibernateConfig">
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Server=localhost;uid=sa;password=admin;database=TestDb</property>
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    <property name="command_timeout">10</property>
    <mapping assembly="Wujy.ModelLibrary"/><!--表示映射Wujy.ModelLibrary实体程序集下的全部类,就不用一个个去映射-->
  </session-factory>
</hibernate-configuration>

 

 

感谢您的阅读,坚持天天进步一点点,离成功就更新一步;但愿文章对您有所帮助;源代码下载

 

最近有个妹子弄的一个关于扩大眼界跟内含的订阅号,天天都会更新一些深度内容,在这里若是你感兴趣也能够关注一下(嘿对美女跟知识感兴趣),固然能够关注后输入:github 会有个人微信号,若是有问题你也能够在那找到我;固然不感兴趣无视此信息;

相关文章
相关标签/搜索