1. 学习目的
学习Nhibernate基础知识。掌握Nhibernate的配置方法,实现对单表的简单操作,如:创建表,查询,添加,删除,修改。
2. 开发环境+前期准备
开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
前期准备: Nhibernate框架,我用的目前最新版NHibernate-1.2.0.CR1, 下载地址:        http://downloads.sourceforge.net/nhibernate/NHibernate-1.2.0.CR1.msi?modtime=1172161735&big_mirror=0
3. 开发步骤:
1).双击下载下来的NHibernate-1.2.0.CR1.msi,将其安装到某个目录,我的目录为: E:\download project\orm\nhibernate.,打开该目录,即可以看到bin,doc,src三个子目录,分别为Realse好的dll或者exe目录,文档说明目录,和源程序目录.
2).打开visual studio 2005,创建类库项目NhibernateSample1
3).在解决方案管理其中,右键点击引用-添加引用,在选项卡种选择浏览,设定查找范围为:E:\download project\orm\nhibernate\bin,添加对Nhibernate.dll,log4net.dll, Iesi.Collections, HashCodeProvider四个dll的引用.
4).打开SQL Server Management Studio,创建数据库nhibernate。
5).在解决方案管理器中添加hibernate.cfg.xml文件。将下面代码粘贴到此文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory name="NHibernate.Test">
        <!-- properties -->
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">Server=127.0.0.1;initial catalog=nhibernate;uid=sa;pwd=123;</property>
        <property name="show_sql">false</property>
        <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
        <property name="use_outer_join">true</property>
        <!-- mapping files -->
        <mapping assembly="NhibernateSample1" />
    </session-factory>    
</hibernate-configuration>

该文件是Nhibernate的配置文件,其中connection.connection_string为数据库连接字符串,Dialect项因为我用的是SQL2005,所以为:MsSql2005Dialect注意:<mapping assembly=”NhibernateSample1”/>表示映射NhibernateSample1程序集下的所有类,所以以后不要需要Configuration.AddClass(..)了;

6).添加类文件:User.cs,添加代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace NhibernateSample1
{
    public class User
    {
        private int _id;
        private string _name;
        private string _pwd;
        /**//// <summary>
        /// 编号
        /// </summary>
        public virtual int Id
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }

        /**//// <summary>
        /// 名称
        /// </summary>
        public virtual string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }

        /**//// <summary>
        /// 密码
        /// </summary>
        public virtual string Pwd
        {
            get
            {
                return _pwd;
            }
            set
            {
                _pwd = value;
            }
        }
    }
}

6).编写User类的映射配置文件:User.hbm.xml

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

注意:该映射文件的属性中的生成操作必须为:嵌入的资源.

7).编写管理ISession对象的辅助类: NHibernateHelper.cs,代码为:

using System;
using System.Web;
using NHibernate;
using NHibernate.Cfg;

namespace NhibernateSample1
{
    public sealed class NHibernateHelper
    {
        private static readonly ISessionFactory sessionFactory;

        static NHibernateHelper()
        {
            sessionFactory = new Configuration().Configure(@"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml").BuildSessionFactory();
        }

        public static ISession GetCurrentSession()
        {             
            ISession currentSession = sessionFactory.OpenSession();
            return currentSession;
        }

        public static void CloseSessionFactory()
        {
            if (sessionFactory != null)
            {
                sessionFactory.Close();
            }
        }
    }
}

注:因为我用的是单元测试,所以这里的配置文件路径写成固定的了。如果换成windows或者Web程序,可以直接去掉该路径。

8) 编写测试CRUD类:UserFixue

using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace NhibernateSample1
{
    public class UserFixure
    {
        private ISession session;
        public UserFixure()
        {
            
        }
        /**//// <summary>
        /// 创建表
        /// </summary>
        public bool ExportTable()
        {
            try
            {
                Configuration cfg = new Configuration().Configure(@"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml");
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                new SchemaExport(cfg).Create(true, true);
                transaction.Commit();
                return true;
            }
            catch(Exception ex)
            {
                throw ex; 
            }
            finally
            {
                session.Close();
            }
        }
        /**//// <summary>
        /// 添加
        /// </summary>
        public int Add()
        {
            try
            {
                User u = new User();
                u.Name = Guid.NewGuid().ToString();
                u.Pwd = "124";
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                session.Save(u);
                transaction.Commit();
                return u.Id;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                session.Close();
            }
        }
        /**//// <summary>
        /// 更新
        /// </summary>
        /// <param name="uid"></param>
        public bool Update(int uid)
        {
            try
            {
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                User u = session.Load(typeof(User), uid) as User;
                if (u != null)
                {
                    u.Name = "updatedName";
                    session.SaveOrUpdate(u);
                    transaction.Commit();
                    u = session.Load(typeof(User), uid) as User;
                    if (u.Name == "updatedName")
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                session.Close();
            }
        }
        /**//// <summary>
        /// 删除
        /// </summary>
        /// <param name="uid"></param>
        /// <returns></returns>
        public bool Delete(int uid)
        {
            try
            {
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                User u = session.Get(typeof(User), uid) as User;
                if (u != null)
                {
                   session.Delete(u);
                   transaction.Commit();
                   u = session.Get(typeof(User), uid) as User;
                   if (u == null)
                   {
                       return true;
                   }
                }
                return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                session.Close();
            }
        }
        public System.Collections.IList Query()
        {
            try
            {
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                System.Collections.IList list= session.CreateQuery("select u from User as u").List();
                transaction.Commit();
                return list;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                session.Close();
            }
        }
    }
}

9)创建新单元测试项目: TestProject1,添加NhibernateSample1的引用
10)创建单元测试类: UnitTest1.cs,并输入如下代码:

using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NhibernateSample1;

namespace TestProject1
{
    /**//// <summary>
    /// UnitTest1 的摘要说明
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        其他测试属性#region 其他测试属性
        //
        // 您可以在编写测试时使用下列其他属性:
        //
        // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 在运行每个测试之前使用 TestInitialize 运行代码 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 在运行每个测试之后使用 TestCleanup 运行代码
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        int uid;
        [TestMethod]
        public void TestMethod1()
        {
            UserFixure userFixure = new UserFixure();
            Assert.IsTrue(userFixure.ExportTable());            
        }
        [TestMethod]
        public void TestMethod2()
        {
            UserFixure userFixure = new UserFixure();
            uid = userFixure.Add();
            Assert.IsTrue(uid>0);
        }
        [TestMethod]
        public void TestMethod3()
        {
            UserFixure userFixure = new UserFixure();
            Assert.IsTrue(userFixure.Update(uid));
        }
        [TestMethod]
        public void TestMethod4()
        {
            UserFixure userFixure = new UserFixure();
            Assert.IsTrue(userFixure.Delete(uid));
        }
        [TestMethod]
        public void TestMethod5()
        {
            UserFixure userFixure = new UserFixure();
            Assert.IsTrue(userFixure.Query().Count>0);
        }
    }
}

11)在菜单-测试-加载元数据文件 选择NHibernateStudy1.vsmdi,然后按顺序执行TestMethod1-TestMethod5,全部成功!
4.总结
通过使用Nhibernate,基本上可以使开发人员不在接触繁琐的数据库表和数据库操作代码,您唯一需要关心的就是如何设计好类,让这些类满足您的业务需求。从扩展性来说Nhinernate具有非常好的扩展性。与代码生成比较,Nhibernate更改数据表结构对代码的影响要远远小于代码生成。
如果您想下载Demo:/Files/jillzhang/simle.rar

转载于:https://www.cnblogs.com/jillzhang/archive/2007/03/21/683067.html

Nhibernate学习之起步篇-1相关推荐

  1. Nhibernate学习之many-to-many篇

    学习目的: 通过进一步学习Nhibernate基础知识,掌握用Nhiberate实现多对多的业务逻辑 开发环境+必要准备 开发环境: windows 2003,Visual studio .Net 2 ...

  2. nhibernate学习之集合组合依赖

    1.学习目标    还是学习compenent的用法,上节实现了简单字段的组合,这节中将讨论两个问题:1.依赖对象有一个指向容器对象的引用.2.集合依赖 2.开发环境和必要准备    开发环境为:wi ...

  3. NHibernate学习笔记(二):one-to-one关系映射

    上一篇:NHibernate学习笔记(一):初识NHibernate 本文的内容:1.介绍NH如何处理对象间one-to-ont的映射关系: 经验教训: 1.操作一对一关联关系中的一个对象时,得在程序 ...

  4. 框架:NHibernate学习目录

    NHibernate 基本配置 (第一篇) 摘要: 使用NHibernate最重要的一步就是配置,如果连NHibernate都还没有跑的起来,谈何学习.今天就来详解一下NHibernate的配置.一. ...

  5. Floodlight 入门 之 起步篇 - 建立一个Floodlight模块

    Floodlight 入门 之 起步篇 - 建立一个Floodlight模块 2017-3-1 网上也有不少关于Floodlight的入门教程了,我写该博文的目的主要是问了整理个人在学习和使用Floo ...

  6. 深度学习——数据预处理篇

    深度学习--数据预处理篇 文章目录 深度学习--数据预处理篇 一.前言 二.常用的数据预处理方法 零均值化(中心化) 数据归一化(normalization) 主成分分析(PCA.Principal ...

  7. [BTS]BizTalk学习之Functoid篇(ID Cross-References)

    早在三周前,就已经收集了所有有关Cross-Reference Functoid的资源,虽然现在看来,它并不是很难,但想真正的应用它,还是需要花费一些心思的研究一下,不过,托了三周时间,还是写完了. ...

  8. NHibernate 基本配置 (第一篇)

    使用NHibernate最重要的一步就是配置,如果连NHibernate都还没有跑的起来,谈何学习.今天就来详解一下NHibernate的配置. 一.NHibernate基本配置 NHibernate ...

  9. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

最新文章

  1. 解决bootstrap下的图片自适应问题
  2. mybatis 一二事(1) - 简单介绍
  3. Finding Similar Items 文本相似度计算的算法——机器学习、词向量空间cosine、NLTK、diff、Levenshtein距离...
  4. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 A题 Visiting Peking University
  5. 关于java和c语言中,变量重名问题
  6. SAP 报表程序的一些标准功能码
  7. Python高阶函数--map、lambda、reduce、filter、zip
  8. android 音乐播放器 获取sd卡所有音乐文件,Android Studio音乐播放器无法读取SD卡,只有内部存储器...
  9. 1/100. Jewels and Stones
  10. Cocopods的升级错误解决
  11. 以太坊geth节点各种报错(求助)
  12. 随机验证码(数字和字母组成)及toLowerCase() 字符串转小写方法和toUpperCase()字符串转大写方法...
  13. SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
  14. WPF的prism框架
  15. 计算机组成原理课程设计(附完整项目)
  16. Vs2010中文版MSDN 安装方法
  17. 亚信安全助手、杀毒软件卸载
  18. DNS服务器可能不可用的解决方法
  19. 14.css中的定位的参照物
  20. 计算机硬盘启动改u为盘启动不了,如果计算机BIOS启动项找不到硬盘应该怎么办...

热门文章

  1. ORACLE 出现的错误
  2. 微软基础认证信息汇总
  3. SAP Commerce Cloud Github 项目的个性化配置 customization
  4. [Yocto-imx]6 Customization
  5. 纯对流问题matlab,matlab一个2D差分法解决对流扩散方程
  6. 探索“华为”的研发项目管理精髓
  7. 基于ASP的新闻管理系统的设计与实现
  8. Liunx 虚拟机Ubuntu更换内核版本以及更换内核后,碰到Memtest86
  9. IMX6ULL学习笔记(20)——UART串口使用
  10. Android 端读取图片exif信息,并对其进行修改