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)