zoukankan      html  css  js  c++  java
  • 创建一个非常简单的NHibernate的应用

    准备工作

    首先从SourceForge上下载NHibernate最新版,本文基于NHibernate 2.0。将下载的压缩包解压缩到一个目录下。然后,启动VS.Net Studio,创建一个Windows应用程序的项目,起名为HelloNHibernate,首先把nhibernate-mapping.xsd、nhibernate-configuration.xsd两个文件添加到项目中,也可添加到C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas目录下,然后添加NHibernate.dll, log4jnet.dll, Iesi.Collections.dll, Castle.DynamicProxy2.dll引用(位于NHibernate的Bin子目录下)。

    接下来,创建一个在MS Sql Server2000上创建一个NHibernate的数据库。有了数据库,我们需要写app.config(web项目为web.config)或hibernate.cfg.xml配置文件告诉NHibernate到什么地方去找数据库,两种方法都可以,它们的配置分别为(此设置在表现层):

    (1)app.config或web.config配置文件内容:

    <?xml version="1.0"?>

    <configuration>

      <configSections>

        <section name="hibernate-configurationtype="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />

        <section name="log4nettype="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

      </configSections>

      <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

        <session-factory>

          <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>

          <!-- This is the System.Data.dll provider for MSSQL Server -->

          <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

          <property name="connection.connection_string">

            Data Source=.;Initial Catalog=NHibernate;Persist Security Info=True;User ID=sa;Password=123456

          </property>

          <property name="show_sql">true</property>

          <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>

          <mapping assembly="HelloNHibernate"/>

        </session-factory>

      </hibernate-configuration>

        <appSettings/>

        <connectionStrings>

        </connectionStrings>

        <system.web>

        </system.web>

    </configuration>

    (2) hibernate.cfg.xml配置文件内容(使用是需把此文件属性Copy to Output directory改为Copy if newer或Always Copy):

    <?xml version="1.0encoding="utf-8" ?>

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

      <session-factory>

        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>

        <!-- This is the System.Data.dll provider for MSSQL Server -->

        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

        <property name="connection.connection_string">

          Data Source=.;Initial Catalog=NHibernate;Persist Security Info=True;User ID=sa;Password=123456

        </property>

        <property name="show_sql">true</property>

        <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>

        <mapping assembly="HelloNHibernate"/>

      </session-factory>

    </hibernate-configuration>

    配置文件中的参数具有下面的含义:

    参数

    hibernate.show_sql

    True表示向控制台输出运行中产生的Sql,用于调试目的

    hibernate.connection.provider

    表示使用指定的类来提供数据库连接缓冲池。

    hibernate.dialect

    表示NHibernate方言的类名,可以让NHibernate使用某些特定数据库平台的特性,目前NHibernate支持Sql Server, Oracle, Mysql, Firebird, Sybase, PostgreSql等数据库方言。

    hibernate.connection.driver_class

    Ado.Net的驱动类,支持SqlServer, Oracle, Mysql,OleDb, ODBC,Firebird等驱动。

    hibernate.connection.connection_string

    对应于Ado.Net的连接串。

     

    业务域模型

    根据需求,我们首先来设计业务域模型,模型非常简单,只有两个属性,其中Id唯一标识一个类的实例,相当于类的主键,Text表示用户输入的信息,示意图如下:

    根据业务域模型,创建对应的.Net类的定义,代码如下:

         public class Message

         {         private int _id;

             public virtual int Id

             {             get {  return _id; }

                  set { _id = value; }    

             }

             private  string _Text;

             public virtual string Text

             {              get {  return _Text; }

                  set { _Text = value; }    

             }

             public  Message()

             {                            // TODO: 在此处添加构造函数逻    }

             public override string ToString()

             {              return _Text;}

             Message类除了定义了必需的两个属性外,还重载了基类的ToString方法,这是为了便于在界面中进行显示。有了类定义,我们还需要创建存储Message对象的数据库表,下面就是同Message对象一一对应的数据库表Messages的DbSchema脚本:

    CREATE TABLE [dbo].[messages] (

         [MsgId] [int] IDENTITY (1, 1) NOT NULL ,

         [Text] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL 

    ) ON [PRIMARY]

    GO

    接下来,我们要编写OR Mapping 映射的配置文件Message.hbm.xml来指定Message对象同数据库表的映射关系,下面是创建的映射文件内容:

    <?xml version="1.0" encoding="utf-8" ?> 

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

        <class name="HelloNHibernate.Message, HelloNHibernate" table="messages">

             <id name="Id" column="MsgId" type="Int32">

                  <generator class="identity" />

             </id>

             <property name="Text" type="String" length="200"/>

        </class>

    </hibernate-mapping>

    Xml文件中的Class元素的name属性指定了要进行映射的类的名称为HelloNHibernate.Message,同时这个类需要从HelloNHibernate assembly中进行加载, table属性指定了Message类在数据库中进行持久存储的库表名称为messages。而Id元素用于声明类标识属性对应于数据库表的主键字段的映射关系,其中name属性标识类的标识属性名称,column属性标识messages表的主键字段的名称,type是标识字段的数据类型,而内嵌的generator元素则指明主键字段唯一值的生成方法,这里identity表示NHibernate使用Sql Server数据库本身提供的自增加字段的特性来保证键值唯一。如果我们想自己给Id属性赋值来保证唯一性的话,可以设定class属性为assigned,这样NHibernate将不会自动生成键值。

    定义完文件之后,别忘了在VS.Net Studio中将Message.hbm.xml的生成操作属性修改为嵌入的资源。还要注意的是,如果每次大家修改了hbm.xml文件,一定要使用“重新生成”命令来编译项目,否则VS.Net不会重新编译整个项目。

    表现层设计

    表现层的界面设计非常简单,在界面上放置一个ListBox用于显示消息列表,一个TextBox用于输入消息,三个Button分别用于查询消息列表、添加消息和删除消息:

     (1)查询消息列表

    在系统每次加载时,我们需要获取信息列表,下面就是加载信息列表的代码:

             private void HelloForm_Load(object sender, System.EventArgs e)

             {              QueryMessages();}

                    private ISessionFactory factory;

             private void QueryMessages()

             {              //查询信息列表

                  Configuration cfg = new Configuration().Configure();

    //cfg.AddAssembly("HelloNHibernate");

    //Configure()方法是首先检查App.config文件(web项目里为web.config文件)是否含有NHibernate配置信息,如果无则检查hibernate.cfg.xml文件

    //AddAssembly()方式在配置文件里没有<mapping assembly="HelloNHibernate"/>时使用

                  factory = cfg.BuildSessionFactory();

                  ISession session = factory.OpenSession();

                  IList messages = session.CreateCriteria(typeof(Message)).List();

                  this.lbMsg.Items.Clear();

                  foreach(Message msg in messages)

                       this.lbMsg.Items.Add(msg);

                  session.Close();

             }

    在QueryMessages方法中,我们首先创建一个Configuration类,然后调用AddAssembly方法利用反射方法将装配件中定义的所有以.hbm.xml命名的Mapping文件加载到系统中,而BuildSessionFactory方法则利用app.config和hbm.xml配置文件中的定义创建一个SessionFactory,然后用SessionFactory工厂类创建一个Session会话类,通过调用会话类的条件查询方法CreateCriteria返回所有类型为 Message的对象列表。最后,边历列表将消息对象添加到列表框中,并关闭Session,释放ADO.Net的连接对象。

  • 相关阅读:
    跨平台加密版 SQLite 3 wxSQLite3
    jQuery2011年年度最佳插件
    jQ中文API离线版下载(适用版本1.4.4,1.5,1.5.1,1.5.2,1.6,1.6.1,1.6.2)
    sql2000无法执行查询及未找到提供程序解决办法
    哈里斯Harris发射机状态监控和控制
    vs2019 最近的项目 所在文件
    QT从入门到入土 vs2019+qt插件
    Asp.Net WebApi swagger使用教程
    Nport 5110 资料
    C/C++ Qt 图形化开发
  • 原文地址:https://www.cnblogs.com/lbg280/p/2508855.html
Copyright © 2011-2022 走看看