zoukankan      html  css  js  c++  java
  • NHibernate初学一之简单增删改查

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

    一:ORM理论

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


    二:NHibernate简介

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

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

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

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


    三:NHibernate实例

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

    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 会有我的微信号,如果有问题你也可以在那找到我;当然不感兴趣无视此信息;

  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/wujy/p/3575542.html
Copyright © 2011-2022 走看看