态度决定高度、企图决定版图、格局决定结局

导航

NHiberante学习笔记

NHibernate 学习
   忙惑了一天,终于小有成果。其实,算是很落后了--懂得了最基本的如何使用NHibernate。
很久前,就开始明白,面向对象系统持久化层的处理方式,也一直想尝试,终于今天做了个例子。
嘿嘿,总算没有白忙。
   学习方法:
   1。看手册
   2。百度两下
   3。copy
   4。write by myself
  
   为什么这么简单的入门要花费几乎一天的时间呢?
   1。最重要的原因:NHibernate版本是NHibernate-1.2.0.Alpha1-debug,最新的,网络上基本没有现成例子,
      也因为没有想到版本问题,胡乱搞了一个上午,没有任何起色!叹息中,改正中...
   2。一中观念的转变,写sql写习惯了,一下子从sql到HQL,还是小有难度!
  
   总结下,体验过程:
   1。create table
   2。建立class(最好做一个类库项目,而不是简单建立一个类)
   3。写映射文件(没有用CodeSmit搞)(和类放在一起)
   4。写NHibernate配置(主要是数据源配置)
   5。写个测试例子。
  
   具体:
   1。
  CREATE TABLE users (
  LogonID nvarchar(20) NOT NULL default '0',
  Name nvarchar(40) default NULL,
  Password nvarchar(20) default NULL,
  EmailAddress nvarchar(40) default NULL,
  LastLogon datetime default NULL,
  PRIMARY KEY  (LogonID)
 )
 2。
 namespace NHibernate.Examples.QuickStart
{
 public class User
 {
  private string id;
  private string userName;
  private string password;
  private string emailAddress;
  private DateTime lastLogon;
  public User()
  {
  }
  public string Id
  {
   get { return id; }
   set { id = value; }
  }
  public string UserName
  {
   get { return userName; }
   set { userName = value; }
  }
  public string Password
  {
   get { return password; }
   set { password = value; }
  }
  public string EmailAddress
  {
   get { return emailAddress; }
   set { emailAddress = value; }
  }
  public DateTime LastLogon
  {
   get { return lastLogon; }
   set { lastLogon = value; }
  }
 
 }
}
  3。
  应该机械化的,不然肯定死人,我是copy来的
 
  <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
 <class name="NHibernate.Examples.User, NHibernate.Examples" table="users">//full-classname and namespace
  <id name="Id" column="LogonId" type="String" length="20">
   <generator class="assigned" />
  </id>
  <property name="UserName" column= "Name" type="String" length="40"/>
  <property name="Password" type="String" length="20"/>
  <property name="EmailAddress" type="String" length="40"/>
  <property name="LastLogon" type="DateTime"/>
 </class>
</hibernate-mapping>

 4。配置NHibernate
      <?xml version="1.0"?>
<configuration>
 <configSections>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
 </configSections>
 <log4net debug="false">
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
   <param name="File" value="SunSystem.log.txt"/>
   <param name="datePattern" value="MM-dd HH:mm"/>
   <param name="AppendToFile" value="true"/>
   <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m-%r%n"/>
   </layout>
  </appender>
  <root>
   <level value="INFO"/>
   <appender-ref ref="AdoNetAppender_SQL"/>
   <appender-ref ref="ColoredConsoleAppender_console"/>
  </root>
  <logger name="Logging" additivity="false">
   <appender-ref ref="LogFileAppender"/>
  </logger>
 </log4net>
 <nhibernate>
  <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
  <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect"/>
  <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
  <add key="hibernate.connection.connection_string" value="Server=10.0.0.3;initial catalog=CHENFEI;UID=sa;Pwd=sa"/>
 </nhibernate>
<!-- 
  <system.web>
 <compilation debug="true"/>
  </system.web>
-->
</configuration>
 其中还有一部分log4net的配置。因为NHibernate默认用log4net作日志。(幸好,前段时间学过)
 
 
 5.插入(基本所以例子都是用这个,也许插入是最简单的,而不是查询了哦)
    创建一个web/winform项目,把上面的类库dll引入。当然你还需要引入:
   // Castle.DynamicProxy.dll
   //Iesi.Collection.dll
    Log4net.dll
    NHibernate.dll
    NHibernate.Examples(类库项目的输出)//用command生成最好(感觉):
    csc /t:library /out:namespace.dll /resource:className.hbm.xml className.cs
    
    private void Insert(
            string id,
            string name,
            string pwd,
            string email
            )
        {
           
                ISession session;
                ITransaction transaction;
                init(out session, out transaction);


                NHibernate.Examples.User newUser = new NHibernate.Examples.User();
                newUser.Id = id;
                newUser.UserName = name;
                newUser.Password = pwd;
                newUser.EmailAddress = email;
                newUser.LastLogon = DateTime.Now;


                session.Save(newUser);
                transaction.Commit();
                session.Close();
        }
  
 <?=---------------------------------------------------------------------------------------?>
 来个查询:查询有两种方式:
 1。HQL--今天没有怎么搞,感觉还是要一段时间学习的.因为老是按照sql写,当然老是出错。
 2。ICriteria--小用了下,感觉不错。下面转载一下abluedog的大作(http://abluedog.cnblogs.com/archive/2006/04/26/385978.html)

posted on 2006-06-20 17:37  flyingchen  阅读(499)  评论(0编辑  收藏  举报