zoukankan      html  css  js  c++  java
  • NHibernate学习笔记之一,Hello world!

    NHibernate是一个面向.NET环境的对象/关系数据库映射框架,主要应用在数据持久层,和其它的ORM框架一样用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。Nhibernate 来源于非常优秀的基于JavaHibernate 关系型持久化框架。Nhibernate支持多种类型的数据库,包括:FireBirdMSSQLMySqlOraclePostgreSQLSQLiteSybaseASESybaseSQLAnywhere

    准备工作:

    需要使用.NET Framework 2.0或上以版本的框架,准备NHibernate框架,本文使用3.3版,到目前NHibernate都还是基于.net framework 2.0,官方下载地址:http://sourceforge.net/projects/nhibernate/files/,如果嫌麻烦,可以下载本文示例,中间包含了NHibernate

    开始做一个简单的增删改查示例,如图1示例:

     图1

    1、创建数据库与表,这里假设使用NibernateDemo数据库,Users表包括(id,name,pwd)字段,id是主键自动增长,namepwdvarchar(16)

    2、新建项目并添加引用,将NHibernate-3.3.0.GA-bin中的“Iesi.Collections.dll”与“NHibernate”引用到项目中,如图2所示复制Configuration_Templates文件夹中的对应数据库配置文件,这里使用MSSQL,所以复制“MSSQL.cfg.xml”,并对NHibernate的配置信息适当修改

    2

    <?xml version="1.0" encoding="utf-8"?>
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
        <session-factory name="NHibernateDemo">
            <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
            <property name="connection.connection_string">
                server=.;uid=sa;pwd=sa;database=NibernateDemo;
            </property>
            <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
            <mapping assembly="NHibernateDemo.WebUI"/>
        </session-factory>
    </hibernate-configuration>

    其中connection.driver_class表示数据库客户端驱动类型;connection.connection_string表示连接字符串;dialect表示数据库类型,如果数据库为MSSQL2005则应修改为NHibernate.Dialect.MsSql2005Dialectmapping表示映射NHibernateDemo.WebUI命名空间下的所有类型,包含持久化类以及对应映射文件所在的应用程序集名称

    3、编写实体类(POCOPlain Old CLR Objects),映射文件包含POCO类映射到一个或者多个数据库表的元数据信息。User.cs文件如下所示。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace NHibernateDemo.WebUI
    {
        public class User
        {
            public virtual int Id { getset; }
            public virtual string Name { getset; }
            public virtual string Pwd { getset; }
        }
    }

    NHibernate持久化类的所有的public的属性必须声明为virtual,否则映射不成功。

    4、为POCO类编写写一个数据库映射文件,其实User.hbm.xml映射文件包含了对象/关系映射(ORM)所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。该文件将POPO类型与数据表进行映射。User.hbm.xml内容如下所示。

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateDemo.WebUI" assembly="NHibernateDemo.WebUI">
        <class name="NHibernateDemo.WebUI.User,NHibernateDemo.WebUI" table="Users" lazy="false">
            <id name="Id" column="id" unsaved-value="0">
                <generator class="native" />
            </id>
            <property name="Name" column="name" type="string" length="16" not-null="true"></property>
            <property name="Pwd"  column="pwd"  type="string" length="16" not-null="false"></property>
        </class>
    </hibernate-mapping>

     

    每个持久化类都应该有一个标识属性,该文件必须输出到Bin目录中,否则会报错“xxx is not mapped,如图3所示具体方法是:选择User.hbm.xml文件->属性->生成操作,设置这个属性的值为“嵌入的资源”

    3

    5定义NHibernateHelper的帮助类,IsessionNHibernate的工作单元,它是一个持久化管理器,我们通过ISession来从数据库中存取数据ISessionFactory代表一个数据库,并且使用一个XML配置文件(Web.config或者hibernate.cfg.xml)。 NHibernate通过对Configuration().Configure()的调用来装载配置文件,并初始化成一个Configuration实例,一般ISessionFactory通常只是被初始化一次,可以借助Application_startNHibernateHelper.cs如下所示:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    using NHibernate;
    using NHibernate.Cfg;

    namespace NHibernateDemo.WebUI
    {
        /// <summary>
        
    /// 管理ISession对象的辅助类
        
    /// </summary>
        public sealed class NHibernateHelper
        {
            private static readonly ISessionFactory sessionFactory;

            static NHibernateHelper()
            {
                //获得NHibernate对当前使用的MSSQL数据库配置文件的物理路径
                string configPath = HttpContext.Current.Server.MapPath("~/MSSQL.cfg.xml");
                //通过配置信息创建一个NHibernate实例
                sessionFactory = new Configuration().Configure(configPath).BuildSessionFactory();
            }

            //获得当前NHibernate实例
            public static ISession GetCurrentSession()
            {
                ISession currentSession = sessionFactory.OpenSession();
                return currentSession;
            }

            //关闭NHibernate实例
            public static void CloseSessionFactory()
            {
                if (sessionFactory != null)
                {
                    sessionFactory.Close();
                }
            }
        }
    }

    6、编写数据库访问层代码,UsersDAL.cs代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    using NHibernate;

    namespace NHibernateDemo.WebUI
    {
        public class UsersDAL
        {
            //介于NHibernate与.NET应用程序中的主运行接口
            ISession session = null;
            //获得所有用户
            public IList<User> GetAllUsers()
            {
                try
                {
                    //获得当前运行的NHibernate实例
                    session = NHibernateHelper.GetCurrentSession();
                    //事务开始
                    ITransaction transaction = session.BeginTransaction();
                    //执行HQL查询
                    IList<User> users = session.CreateQuery("from User").List<User>();
                    //提交事务
                    transaction.Commit();
                    return users;
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    //关闭与ADO.NET的连接
                    session.Close();
                }
            }

            //添加
            public int Add(User user)
            {
                try
                {
                    session = NHibernateHelper.GetCurrentSession();
                    ITransaction transaction = session.BeginTransaction();
                    session.Save(user);
                    transaction.Commit();
                    return user.Id;
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    session.Close();
                }
            }

            //获得单个对象通过编号
            public User GetUserById(int id)
            {
                try
                {
                    session = NHibernateHelper.GetCurrentSession();
                    ITransaction transaction = session.BeginTransaction();
                    User user = session.Load<User>(id);
                    transaction.Commit();
                    return user;
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    session.Close();
                }
            }

            //更新
            public void Update(User user)
            {
                try
                {
                    session = NHibernateHelper.GetCurrentSession();
                    ITransaction transaction = session.BeginTransaction();
                    session.SaveOrUpdate(user);
                    transaction.Commit();
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    session.Close();
                }
            }

            //删除
            public void Delete(int id)
            {
                try
                {
                    User user = GetUserById(id);
                    session = NHibernateHelper.GetCurrentSession();
                    ITransaction transaction = session.BeginTransaction();
                    if (user != null)
                    {
                        session.Delete(user);
                    }
                    transaction.Commit();
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    session.Close();
                }
            }


        }
    }

    7、在表示层使用UserDAL中的方法。

    总结:这个示例算是对Nhibernate学习的一个“Hello world”,内容中有不少是参照前辈们的文章,我只是学习和分享学习。Nhibernate的学习资源远比不上Hibernate,性能不如ADO.NET,但它能是.NET平台中比较优秀的一个ORM框架之一,Hibernate还有很长的路要走。学习笔记而以,请大家海涵。

     

     示例下载,有数据库

  • 相关阅读:
    new Date在不同浏览器识别问题
    22. Generate Parentheses dfs填表
    迪杰斯特拉+优先队列实现
    1062 最简分数 (20 分)
    1091 N-自守数 (15 分)
    1054 求平均值 (20 分)
    1045 快速排序 (25 分)
    1086 就不告诉你 (15 分)
    1076 Wifi密码 (15 分)
    1081 检查密码 (15 分)
  • 原文地址:https://www.cnblogs.com/best/p/2680726.html
Copyright © 2011-2022 走看看