NHibernate Step by Step( 二 ) 單表操作
接著第一期,我們繼續(xù)。
為了方便學(xué)習(xí)測試,從今天開始我將使用 MS Test 來進(jìn)行測試,這樣就避免了在一個(gè) Console 工程里不停地添加、注釋代碼了。
提示:為了在
VS2005IDE
中獲得
NHibernate
配置文件的代碼提示,請(qǐng)將你的
$NHibernate/src/NHibernate
下的
nhibernate-configuration-2.0.xsd
、
nhibernate-mapping-2.0.xsd
拷貝到
/Program Files/Microsoft Visual Studio 8/Xml/Schemas
下,這樣當(dāng)你編輯配置文件或者映射文件時(shí),你將得到完整的代碼提示。
VS2003請(qǐng)拷貝到/Program Files/Microsoft Visual Studio .NET 2003/Common7/Packages/schemas/xml下。
NHibernat 內(nèi)部使用 log4net 來進(jìn)行日志操作,今天我們將在配置文件中添加 log4net 的配置,這樣我們?cè)跍y試的時(shí)候?qū)⒖梢郧宄乜吹? NHibernate 是如何進(jìn)行工作的。
應(yīng)用配置文件修改如下:































請(qǐng)注意添加:

關(guān)于 log4net 的使用,我們這里不做詳細(xì)的講解,有興趣的請(qǐng)參考如下地址:
http://logging.apache.org/log4net/
接著,我們?cè)谏洗蔚墓こ探M中添加一個(gè)名為 Test1 的測試項(xiàng)目,將其中的不需要的手動(dòng)測試去掉。請(qǐng)注意:除了 NHibernate/Model 引用外,還需要添加如下 3 個(gè)引用:
log4net,System.Data,System.Xml.
修改代碼如下:






























我們?cè)跍y試的開始對(duì)
Configuration/SessionFactory/Log
進(jìn)行初始化。在每一個(gè)
Test
的開始獲取一個(gè)新的
session
,每一個(gè)
Test
結(jié)束后即關(guān)閉
session
。
添加如下一個(gè)
Get
測試:







我們?cè)谇懊嬖?jīng)插入一條名為“Jackie Chan”的記錄,現(xiàn)在在Test Manager中選中TestRead,運(yùn)行,ok,Passed!
我們使用了session.Get來獲取記錄,方法如下:
object Get( Type clazz , object id );
很簡單,一目了然。
我們切換到
Test Results
窗口,雙擊測試成功的
TestRead
方法,這時(shí)將會(huì)有一個(gè)詳細(xì)的測試結(jié)果顯示出來,
NHibernate
將使用我們指定的
log4net
來輸出詳細(xì)信息,我們仔細(xì)觀察:
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
在其中,我們可以發(fā)現(xiàn):
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'
對(duì)了,就是這里,
NHibernate
替我們構(gòu)造了一條
sql
語句,并添加一個(gè)參數(shù),然后將我們?cè)诖a中賦的
id
值
1
來填充,這樣,一條完整的可以執(zhí)行的
sql
語句產(chǎn)生了。
請(qǐng)注意:在產(chǎn)生 sql 語句的前面, NHibernate 構(gòu)造了一個(gè) IDBCommand ,然后在 sql 語句產(chǎn)生完全后,獲取連接,通過一個(gè) DataReader 來填充 Persion 對(duì)象給我們使用,這就是 NHibernate 替我們做的事,是不是很簡單啊?(真的很簡單嗎??看看源代碼吧!!)
請(qǐng)仔細(xì)研究輸出的日志。
如法炮制,我們添加另外 3 個(gè) Test ,完成單個(gè)表的全部 CRUD 操作,如下完整代碼:

































































































































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

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