日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate简介

發布時間:2025/1/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NHibernate簡介

???????????????原文地址:???????http://cyber2005.bokee.com/6095648.html????????????????

?

什么是NHibernate?
NHibernate是一個基于.Net,用于關系數據庫的對象持久化類庫.它是著名的Hibernate的.Net版本.
NHibernate用于把你的.Net對象持久化到底層的關系數據庫中.你完全不用自己編寫Sql語句去操作這些對象,NH會代替你做.你的代碼里面只需要關心這些對象,NH生成sql語句并能為你取到正確的東西.
開發過程
HNibernate將會有一些工具幫助你,如:生成schema,根據映射文件(Mapping?file)生成類,并更新schema(一個新開發者的建議).然而,在本文檔中,前提是你已經手動的數據庫的創建喝.Net類的編寫...
這里是我們要做的:
?
1.???????在數據庫中創建把.Net類持久化的對應表.
2.???????創建需要被持久化的.Net類.
3.???????創建映射文件,以告訴NH怎樣持久化這些類的屬性.
4.???????創建NH的配置文件,以告訴NH怎樣連接數據庫.
5.???????使用NH提供的API.
?
步驟1:創建數據庫表
我們正在做的是一個非常簡單的NH示例.在這個例子里面,我們實現一個基本的用戶管理子系統.我們將會使用一個user表(sql?server?2000):
?
use?NHibernate
go
?
CREATE?TABLE?users?(
??LogonID?varchar(20)?NOT?NULL?default?'0',
??Name?varchar(40)?default?NULL,
??Password?varchar(20)?default?NULL,
??EmailAddress?varchar(40)?default?NULL,
??LastLogon?datetime?default?NULL,
??PRIMARY?KEY??(LogonID)
)
go
?
我使用的是MS?Sql?Server?2000,但是如果你找到一個任何數據庫的.net?Data?Provider驅動,你可以使用任何數據庫.
?
步驟2:創建.Net類:
當我們這樣一堆的用戶的時候,我們需要某種對象來保存.NH是通過reflection對象的屬性來工作的,所以我們給需要持久化的對象添加屬性.一個對應于上面數據庫結構的類可以寫成這個樣子:
?
using?System;
?
namespace?NHibernate.Demo.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;?}
??????????????}
??????????????
???????}
}
?
在上面的代碼里面,我們把屬性和構造函數寫成了public-NH并不要求一定要這樣做.你可以使用public,protected,internal或者干脆private來標記你的屬性.
?
步驟3:編寫映射文件(Mapping?File)
現在我們有了數據庫表和.Net類,我們還需要告訴NH怎樣在數據庫和類之間映射.這就需要映射文件了.最簡捷(也是可維護性最好的)方法就是為每一個類編寫一個映射文件,如果你把命名為"XXX.hbm.xml"的映射文件和XXX類文件放在同一目錄下,NH會很讓?一切變得很輕松.這兒,我們的 User.hbm.xml可能會像這樣:
<?xml?version="1.0"?encoding="utf-8"??>?


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


????<class?name="NHibernate.Demo.QuickStart.User,?NHibernate.Demo.QuickStart"?table="users">

??????????????<id?name="Id"?column="LogonId"?type="String(20)">

?????????????????????<generator?class="assigned"?/>

??????????????</id>

??????????????<property?name="UserName"?column="Name"?type="String(40)"/>

??????????????<property?name="Password"?type="String(20)"/>

??????????????<property?name="EmailAddress"?type="String(40)"/>

??????????????<property?name="LastLogon"?type="DateTime"/>

???????</class>

</hibernate-mapping>
讓我們來看看這個有趣的映射文件:第一個tag是class,這里我們把類型名(類名和Assembly名)映射到數據庫中的user表(這里和 hibernate有些不同,我們必須告訴NH這個類從哪兒來的.這個差異是由.Net和Java?Reflect機制的不同引起的-zyyang).這種情況下,我們是從Assembly?NHibernate.Demo.QuickStart中載入 NHibernate.Demo.QuickStart.User類..NH遵守.Net?Framework使用Reflection載入類型的規則- 所以遇到什么疑惑,就去查查.NET?Framework?SDK.?
讓我們暫時跳過"id"?tag,先說property節點."name" 屬性值就是我們寫的.Net類中的屬性,column屬性值就是在數據庫中與'Net類屬性對應的字段名.type屬性是可選的(如果你沒有標明,NH會給出一個最適合的),但是推薦的做法是帶上這個屬性.hibernate用戶會注意到,在type屬性值里,我們給出了長度值,這是因為ADO.NET需要這樣做.
讓我們返回到"id"?tag,你可能會猜想這個tag和映射到表的Primary?Key有關.正確.ID??tag的格式和Property?tag的相似.我們從Property(name)映射到目標數據庫的字段(colume).
這些嵌入的Generator標記告訴NH怎樣生成Primary?Key(NH很方便的就能給你生成一個,不管是什么類型的,只要你告訴它怎樣去做).在我們舉的例子中,把它設置成"assigned",意思是"我們的對象將自己生成key"(User對象將總是需要一個UserID),如果你樂意讓NH 代替你生成,你會對uuid.hex和uuid.string類感興趣的(參看chm文檔).
Tip:如果你使用vs.net編譯,設置Build?Action,把User.hbm.xml文件作為資源綁定到Asssembly,這樣映射文件就成了Asssembly的一部分了.后面我們會明白這個步驟的重要性.
?
步驟4:創建數據庫配置文件
目前為止,我們還沒有告訴NH到哪兒去找數據庫.最直接的方法就是在你程序的配置文件中給NH一個部分,就是這樣:
<?xml?version="1.0"?encoding="utf-8"??>

<configuration>

?????<configSections>

???????????????<section?name="nhibernate"?type="System.Configuration.NameValueSectionHandler,?System,?Version=1.0.3300.0,Culture=neutral,?PublicKeyToken=b77a5c561934e089"?/>

???????</configSections>

???????<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=localhost;initial?catalog=nhibernate;User?ID=someuser;Password=somepwd;Min?Pool?Size=2"?/>

???????</nhibernate>

</configuration>
上面的例子中使用SqlClient驅動,連接到本地的nhibernate數據庫,并且使用提供的用戶和密碼.還會有其他的配置項,你可以參看文檔.
?
步驟5:開始體驗NHibernate的神奇
所有艱苦的工作已經做完了.如果所有的工作完成后,你將會有這些成果:
??????????User.cs?-?需要持久化的.Net類.
??????????User.hbm.xml?-?映射文件
??????????app.config?-?帶有Ado.net連接信息的配置文件(你也可以在代碼中指定的)
??????????一個叫做user的數據庫表.
?
在代碼里面使用NHibernate是很簡單的事情:
1.???????創建一個Configuration對象.
2.???????告訴Configuration你想要持久化哪一種對象.
3.???????創建一個Session連接到你設定的數據庫.
4.???????載入,保存和查詢你的對象.
5.???????Flush()你的Session
?
好,讓我們來看看一些代碼:
?
創建一個Configuration對象....
Configuration對象知道所有在.Net類和后端數據庫之間的映射關系,
?
Configuration?cfg?=?new?Configuration();
cfg.AddAssembly("NHibernate.Demo.QuickStart");
?
Configuration對象會查找這個Assembly中所有以.hbm.xml結尾的文件.也有其他的方法添加映射文件,這個可能是最簡單的一個.
?
創建一個Session對象.......
ISession對象代表著一個到后端數據庫連接,ITransaction代表一個NHibernate管理的事務(Transaction).
?
ISessionFactory?factory?=?cfg.BuildSessionFactory();
ISession?session?=?factory.OpenSession();
ITransaction?transaction?=?session.BeginTransaction();
?
載入,保存和查詢你的對象......
?
現在你可以以.net的方式對待這些對象.想在數據庫中保存一個新的user?只需要:
?
User?newUser?=?new?User();
newUser.Id?=?"joe_cool";
newUser.UserName?=?"Joseph?Cool";
newUser.Password?=?"abc123";
newUser.EmailAddress?=?"joe@cool.com";
newUser.LastLogon?=?DateTime.Now;
??????????????
//?Tell?NHibernate?that?this?object?should?be?saved
session.Save(newUser);
?
//?commit?all?of?the?changes?to?the?DB?and?close?the?ISession
transaction.Commit();
session.Close();
?
這就是NH的好處,大部分時間內你只用關心你的業務對象(BO).
?
假如你需要根據已經知道的user?ID查詢一個對象,如果session是open的,你只需要一行:
?
//?open?another?session?to?retrieve?the?just?inserted?user
session?=?factory.OpenSession();
User?joeCool?=?(User)session.Load(typeof(User),?"joe_cool");
?
這樣你又會得到這個對象,設置一下對象的屬性,它會在下一次Flush()方法出現的時候被持久化到數據庫.
?
//?set?Joe?Cool's?Last?Login?property
joeCool.LastLogon?=?DateTime.Now;
?
//?flush?the?changes?from?the?Session?to?the?Database
session.Flush();
?
讓NH去寫入你對對象作出的修改,你只需要Flush?Session就可以了.
?
更好的是,你可以從數據庫中查詢到一個System.Collections.IList:
?
IList?userList?=?session.CreateCriteria(typeof(User)).List();
foreach(User?user?in?userList)
{
???????Console.WriteLine(user.Id?+?"?last?logged?in?at?"?+?user.LastLogon);
}
?
這個查詢會返回整個表的內容.尤其是當你想要更多的控制時候--像類出所有在March?14,?2004?10:00?PM之后登陸過的用戶,你可以:
?
IList?recentUsers?=?session.CreateCriteria(typeof(User)).Add(Expression.Gt("LastLogon",?new?DateTime(2004,?03,?14,?20,?0,?0))).List();
foreach(User?user?in?recentUsers)
{
???????Console.WriteLine(user.Id?+?"?last?logged?in?at?"?+?user.LastLogon);
}
?
文檔里還有很多的查詢選項,但是以上這些足夠讓你看出Hinernate的力量了.
不要忘記了,最后要關掉你的Session.
?
//?tell?NHibernate?to?close?this?Session
session.Close();

轉載于:https://www.cnblogs.com/JediJin/archive/2009/09/11/1564895.html

總結

以上是生活随笔為你收集整理的NHibernate简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。