NHibernate Step by Step( 二 ) 單表操作
接著第一期,我們繼續。
為了方便學習測試,從今天開始我將使用 MS Test 來進行測試,這樣就避免了在一個 Console 工程里不停地添加、注釋代碼了。
提示:為了在
VS2005IDE
中獲得
NHibernate
配置文件的代碼提示,請將你的
$NHibernate/src/NHibernate
下的
nhibernate-configuration-2.0.xsd
、
nhibernate-mapping-2.0.xsd
拷貝到
/Program Files/Microsoft Visual Studio 8/Xml/Schemas
下,這樣當你編輯配置文件或者映射文件時,你將得到完整的代碼提示。
VS2003請拷貝到/Program Files/Microsoft Visual Studio .NET 2003/Common7/Packages/schemas/xml下。
NHibernat 內部使用 log4net 來進行日志操作,今天我們將在配置文件中添加 log4net 的配置,這樣我們在測試的時候將可以清楚地看到 NHibernate 是如何進行工作的。
應用配置文件修改如下:































請注意添加:

關于 log4net 的使用,我們這里不做詳細的講解,有興趣的請參考如下地址:
http://logging.apache.org/log4net/
接著,我們在上次的工程組中添加一個名為 Test1 的測試項目,將其中的不需要的手動測試去掉。請注意:除了 NHibernate/Model 引用外,還需要添加如下 3 個引用:
log4net,System.Data,System.Xml.
修改代碼如下:






























我們在測試的開始對
Configuration/SessionFactory/Log
進行初始化。在每一個
Test
的開始獲取一個新的
session
,每一個
Test
結束后即關閉
session
。
添加如下一個
Get
測試:







我們在前面曾經插入一條名為“Jackie Chan”的記錄,現在在Test Manager中選中TestRead,運行,ok,Passed!
我們使用了session.Get來獲取記錄,方法如下:
object Get( Type clazz , object id );
很簡單,一目了然。
我們切換到
Test Results
窗口,雙擊測試成功的
TestRead
方法,這時將會有一個詳細的測試結果顯示出來,
NHibernate
將使用我們指定的
log4net
來輸出詳細信息,我們仔細觀察:
2006-04-15 13:52:13,000 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - opened session
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - loading [Person#1]
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - attempting to resolve [Person#1]
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - object not resolved in any cache [Test.Model.Person#1]
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Persister.EntityPersister [(null)] - Materializing entity: Test.Model.Person#1
2006-04-15 13:52:13,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened new IDbCommand, open IDbCommands :1
2006-04-15 13:52:13,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Building an IDbCommand object for the SqlString: SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=:id
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.Int32Type [(null)] - binding '1' to parameter: 0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] INFO NHibernate.Loader.Loader [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - @p0 = '1'
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.DriverConnectionProvider [(null)] - Obtaining IDbConnection from Driver
2006-04-15 13:52:13,859 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened Reader, open Readers :1
2006-04-15 13:52:13,859 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - processing result set
2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - result row: 1
2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Initializing object from DataReader: 1
2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Hydrating entity: Test.Model.Person#1
2006-04-15 13:52:13,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.StringType [(null)] - returning 'Jackie Chan' as column: name0_
2006-04-15 13:52:13,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - done processing result set (1 rows)
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Driver.NHybridDataReader [(null)] - running NHybridDataReader.Dispose()
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed Reader, open Readers :0
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed IDbCommand, open IDbCommands :0
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - total objects hydrated: 1
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - resolving associations for: [Test.Model.Person#1]
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - done materializing entity [Test.Model.Person#1]
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - initializing non-lazy collections
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - closing session
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - disconnecting session
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.ConnectionProvider [(null)] - Closing connection
2006-04-15 13:52:13,968 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - transaction completion
在其中,我們可以發現:
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - @p0 = '1'
對了,就是這里,
NHibernate
替我們構造了一條
sql
語句,并添加一個參數,然后將我們在代碼中賦的
id
值
1
來填充,這樣,一條完整的可以執行的
sql
語句產生了。
請注意:在產生 sql 語句的前面, NHibernate 構造了一個 IDBCommand ,然后在 sql 語句產生完全后,獲取連接,通過一個 DataReader 來填充 Persion 對象給我們使用,這就是 NHibernate 替我們做的事,是不是很簡單啊?(真的很簡單嗎??看看源代碼吧!!)
請仔細研究輸出的日志。
如法炮制,我們添加另外 3 個 Test ,完成單個表的全部 CRUD 操作,如下完整代碼:

































































































































Delete 的方法如下:
直接傳入需要 delete 的對象即可。
好了,基本的操作都完成了,是不是很Easy?
好了,這一篇就講這么多,我們下次再接著練習。
Step by Step ,顧名思義,是一步一步來的意思,整個教程我將貫徹這一理念。
任何建議或者批評,請 e : abluedog@163.com
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
