zoukankan      html  css  js  c++  java
  • Nhibernate入门与demo

          学习和使用Nhibernate已经很久了,一直想写点东西和大家一起学习使用Nhibernate。博客园里也有很多大牛写了很多关于Nhibernate入门的文章。其中:李永京的博客http://www.cnblogs.com/lyj/tag/NHibernate/  内容最为丰富。而且在李哥的博客里面学了很多东西,在此致谢!

          本篇文章阅读对象是:Nhibernate初学者!如果你是Nhibernate的研究者或者已经很熟练的运用Nhibernate请不吝赐教,对本文不足之处进行指教。

         带着问题去学习!学完这些后,希望你能回答下面几个问题:

         1、Nhibernate是什么?

         2、Nhibernate能做什么?带给我们的什么?

         3、怎么搭建Nhibernate?

         4、怎么使用Nhibernate?

         好,我们就带着这几个问题开始我们的Nhibernate的旅程。

        第一个问题:

         要明白Nhibernate是什么,就要首先明白什么是ORM。

          先看一张经典的图:

         ORM:对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去。通俗讲,就是我们操作实体类,然后让ORM框架自动映射到数据库中。

         而Nhibernate就是:.Net环境下实现ORM的技术的一个框架!

         第二个问题:

         Nhibernate能做什么呢?

         看下面代码:

    User myUser = new User();
    //User初始化........
    session.Save(myUser);//保存一个用户
    session.Update(myUser);//更新用户
    session.Delete(myUser);//删除用户
    User user = session.Get<User>(Id) as User;//根据主键获取用户的 用户实例

          session哇!这么牛,不用写一句sql   session就帮你把所有的活都干了!那session设计肯定很难吧?告诉你吧,session是我们只需要一个配置文件就可以随处调用了。这么神奇?

         Nhibernate带给我们的就是:对于开发者通常的数据持久化相关的编程任务,解放其中的95%!

         第三个问题:

         这是本文的关键,是怎么搭建呢?

         先看项目整体图,作为初学的demo 没有层次,没有优化,只是作为入门的一个简单介绍!

        

         第一步:设计数据库中的表。建立一个User表。代码如下:    

    代码
    CREATE TABLE Hksj_User
    (
    Id
    INT IDENTITY(1,1) NOT NULL, --id主键
    SName NVARCHAR(20) NOT NULL, --用户名
    SNickName NVARCHAR(20), --真实姓名
    SPassWord NVARCHAR(30) NOT NULL, --密码
    DCreateDate DATETIME , --创建 日期
    SCreator NVARCHAR(20), --创建人
    SEmail NVARCHAR(50), --Email
    SPhone NVARCHAR(50), --电话
    SIdentifyId NVARCHAR(30), --身份证
    DLastTimeLogOn DATETIME --上次登录日期

    PRIMARY KEY CLUSTERED
    (
    Id
    ASC
    )
    WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    )
    ON [PRIMARY]
    END

        第二步:设计User类。 代码如下:

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MyWeb.WebTemp.Model
    {
    public class User
    {
    /// <summary>
    /// 用户id
    /// </summary>
    public Int32 Id
    {
    get;
    set;
    }

    /// <summary>
    /// 用户名,登录所用的名字
    /// </summary>
    public string Name
    {
    get;
    set;
    }

    /// <summary>
    /// 真实姓名
    /// </summary>
    public string NickName
    {
    get;
    set;
    }

    /// <summary>
    /// 密码
    /// </summary>
    public string PassWord
    {
    get;
    set;
    }

    /// <summary>
    /// 创建日期
    /// </summary>
    public DateTime CreateTime
    {
    get;
    set;
    }

    /// <summary>
    /// 创建人
    /// </summary>
    public string Creator
    {
    get;
    set;
    }

    /// <summary>
    /// Email
    /// </summary>
    public string Email
    {
    get;
    set;
    }

    /// <summary>
    /// 联系电话
    /// </summary>
    public string Phone
    {
    get;
    set;
    }

    /// <summary>
    /// 身份证
    /// </summary>
    public string IdentifyId
    {
    get;
    set;
    }

    /// <summary>
    /// 最后一次登录时间
    /// </summary>
    public DateTime LastTimeLogOn
    {
    get;
    set;
    }
    }
    }

         第三步:创建User类的映射文件 命名规则:User.hbm.xml  代码如下:    

    代码
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="MyWeb.WebTemp.Model.User,MyWeb.WebTemp.Model" table="Hksj_User" lazy="false">
    <id name="Id" column="Id" type="Int32">
    <generator class="native" />
    </id>
    <property name="Name" column="SName" type="String" length="20" />
    <property name="NickName" column="SNickName" type="String" length="20" />
    <property name="PassWord" column="SPassWord" type="String" length="30" />
    <property name="IdentifyId" column="SIdentifyId" type="String" length="30" />
    <property name="Phone" column="SPhone" type="String" length="50" />
    <property name="Email" column="SEmail" type="String" length="50" />
    <property name="CreateTime" column="DCreateDate" type="DateTime" />
    <property name="Creator" column="SCreator" type="String" length="20" />
    <property name="LastTimeLogOn" column="DLastTimeLogOn" type="DateTime" />
    </class>
    </hibernate-mapping>

         简单解释一下:

          1、<property name="Email" column="SEmail" type="String" length="50" />    意思: property name指的是:User类的属性名字 Email对应数据库的列SEmail 类型是String,长度50个字符。

         2、<class name="MyWeb.WebTemp.Model.User,MyWeb.WebTemp.Model" table="Hksj_User" lazy="false">

             这个是配置类的全名称,以及所属的程序集。然后对应数据库的表名。设置延迟加载为false。具体可以参考Nhibernate官方文档。

         3、一定要将这个文件的属性:生成操作设置为嵌入资源!

         第四步:创建Nhibernate的配置文件:hibernate.cfg.xml   代码如下:    

    代码
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
    <!-- properties -->
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">server=.;uid=sa;pwd=123;database=HkTemp;</property>
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    <property name="show_sql">true </property>
    <property name="use_outer_join">true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <!-- 代理工厂,可以试用Castle,也可以试用LinFu -->
    <!-- <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>-->
    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>

    <!-- mapping files 领域对象映射文件所在程序集 -->
    <mapping assembly="NhibernateDemo"/>
    </session-factory>
    </hibernate-configuration>

    解释:

    1、<!-- mapping files 领域对象映射文件所在程序集 -->

        <mapping assembly="NhibernateDemo"/>  这是将User.hbm.xml所在的程序集。Nhibernate自动去找Mapping映射!

    2、<property name="connection.connection_string">server=.;uid=sa;pwd=123;database=HkTemp;</property>是配置数据库连接字符串。

    其他的都是Nhibernate最重要的数据库provider,sessionfactory等。不详细说。看官方文档!

          第四个问题:    

          使用和测试你的配置【可以爽一把了!】

         在Default.aspx   代码文件中添加如下代码

    代码
    Configuration cfg = new Configuration();
    cfg.Configure(Server.MapPath("~") + "Nhibernate.cfg.xml");
    ISessionFactory _SessionFactory = cfg.BuildSessionFactory();//建立Session工厂
    ISession session = _SessionFactory.OpenSession();//打开Session
    MyWeb.WebTemp.Model.User myUser = new User {IdentifyId="122222",Email="22222",CreateTime=DateTime.Now, LastTimeLogOn = DateTime.Now, Name= "ml",NickName="malun",PassWord="123",Phone="nihao" };
    session.Save(myUser);
    session.Flush();
    session.Delete(User);

         查看数据库中,有没有一条数据保存了?

         Nhibernate做的不只是这些!搭载Spring.Net  Nhibernate能做的更多!而且代码会更加优美!

         源码下载:NhibernateDemo.zip

  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/fly_dragon/p/1828192.html
Copyright © 2011-2022 走看看