`
javatoyou
  • 浏览: 1084475 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

NHibernate Step by Step(二) 单表操作

 
阅读更多

NHibernate Step by Step() 单表操作

接着第一期,我们继续。

为了方便学习测试,从今天开始我将使用MS Test来进行测试,这样就避免了在一个Console工程里不停地添加、注释代码了。

提示:为了在VS2005IDE中获得NHibernate配置文件的代码提示,请将你的$NHibernate/src/NHibernate下的nhibernate-configuration-2.0.xsdnhibernate-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是如何进行工作的。

应用配置文件修改如下:

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<configSections>
<sectionname="nhibernate"type="System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
<sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>

<nhibernate>
<addkey="hibernate.connection.provider"value="NHibernate.Connection.DriverConnectionProvider"/>
<addkey="hibernate.connection.driver_class"value="NHibernate.Driver.SqlClientDriver"/>
<addkey="hibernate.connection.connection_string"value="Server=localhost;InitialCatalog=NHibernate;IntegratedSecurity=SSPI"/>
<addkey="hibernate.connection.isolation"value="ReadCommitted"/>
<addkey="hibernate.dialect"value="NHibernate.Dialect.MsSql2000Dialect"/>
<addkey="show_sql"value="true"/>
</nhibernate>

<log4net>
<appendername="ConsoleAppender"type="log4net.Appender.ConsoleAppender">
<layouttype="log4net.Layout.PatternLayout">
<conversionPatternvalue="%date[%thread]%-5level%logger[%ndc]-%message%newline"/>
</layout>
</appender>
<root>
<levelvalue="ALL"/>
<appender-refref="ConsoleAppender"/>
</root>

</log4net>

</configuration>


请注意添加:

<addkey="show_sql"value="true"/>

关于log4net的使用,我们这里不做详细的讲解,有兴趣的请参考如下地址:

http://logging.apache.org/log4net/

接着,我们在上次的工程组中添加一个名为Test1的测试项目,将其中的不需要的手动测试去掉。请注意:除了NHibernate/Model引用外,还需要添加如下3个引用:

log4net,System.Data,System.Xml.


修改代码如下:

usingSystem;
usingSystem.Text;
usingSystem.Collections;
usingMicrosoft.VisualStudio.TestTools.UnitTesting;
usingNHibernate;
usingNHibernate.Cfg;
usinglog4net;
usinglog4net.Config;
usingTest.Model;

namespaceTest1
{
/**////<summary>
///SummarydescriptionforUnitTest1
///</summary>

[TestClass]
publicclassUnitTest1
{
staticISessionFactoryfactory;
staticILoglogger;
ISessionsession;

publicUnitTest1()
{
}


Additionaltestattributes#regionAdditionaltestattributes

[ClassInitialize()]
publicstaticvoidMyClassInitialize(TestContexttestContext)
{
XmlConfigurator.Configure();
logger
=LogManager.GetLogger(typeof(Test1.UnitTest1));
Configurationconfig
=newConfiguration().AddAssembly("Test.Model");
factory
=config.BuildSessionFactory();
}


[ClassCleanup()]
publicstaticvoidMyClassCleanup(){}

[TestInitialize()]
publicvoidMyTestInitialize()
{
session
=factory.OpenSession();
}


[TestCleanup()]
publicvoidMyTestCleanup()
{
session.Close();
}


#endregion

}

}

我们在测试的开始对Configuration/SessionFactory/Log进行初始化。在每一个Test的开始获取一个新的session,每一个Test结束后即关闭session


添加如下一个
Get测试:

[TestMethod]
publicvoidTestRead()
{
Personperson
=(Person)session.Get(typeof(Person),1);
Assert.IsTrue(person.Name
=="JackieChan");
}


我们在前面曾经插入一条名为“Jackie Chan”的记录,现在在Test Manager中选中TestRead,运行,ok,Passed!
我们使用了session.Get来获取记录,方法如下:

objectGet(Typeclazz,objectid);

很简单,一目了然。


我们切换到
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语句,并添加一个参数,然后将我们在代码中赋的id1来填充,这样,一条完整的可以执行的sql语句产生了。

请注意:在产生sql语句的前面,NHibernate构造了一个IDBCommand,然后在sql语句产生完全后,获取连接,通过一个DataReader来填充Persion对象给我们使用,这就是NHibernate替我们做的事,是不是很简单啊?(真的很简单吗??看看源代码吧!!)

请仔细研究输出的日志。

如法炮制,我们添加另外3Test,完成单个表的全部CRUD操作,如下完整代码:

[TestMethod]

publicvoidTestCreate()

{

Personperson
=newPerson();

person.Name
="JackieChan";



ITransactiontrans
=session.BeginTransaction();

try

{

session.Save(person);

trans.Commit();

Assert.IsTrue(person.Id
>0);

}


catch(Exceptionex)

{

trans.Rollback();

Assert.Fail(ex.Message);

}


}




[TestMethod]

publicvoidTestUpdate()

{

Personperson
=(Person)session.Get(typeof(Person),1);

person.Name
="JetLi";



ITransactiontrans
=session.BeginTransaction();

try

{

session.Save(person);

trans.Commit();

Assert.IsTrue(person.Name
=="JetLi");

}


catch(Exceptionex)

{

trans.Rollback();

Assert.Fail(ex.Message);

}


}




[TestMethod]

publicvoidTestRead()

{

Personperson
=(Person)session.Get(typeof(Person),1);

Assert.IsTrue(person.Name
=="JackieChan");

}




[TestMethod]

publicvoidTestDelete()

{

Personperson
=(Person)session.Get(typeof(Person),1);



ITransactiontrans
=session.BeginTransaction();

try

{

session.Delete(person);

trans.Commit();

}


catch(Exceptionex)

{

trans.Rollback();

Assert.Fail(ex.Message);

}


}


Delete的方法如下:

voidDelete(objectobj);

直接传入需要delete的对象即可。

好了,基本的操作都完成了,是不是很Easy?

好了,这一篇就讲这么多,我们下次再接着练习。

Step by Step,顾名思义,是一步一步来的意思,整个教程我将贯彻这一理念。

任何建议或者批评,请eabluedog@163.com

分享到:
评论

相关推荐

    NHibernate Step by Step入门教程

    在"NHibernate Step by Step"教程中,你将逐步学习如何设置项目环境,配置NHibernate,创建映射文件,使用Session和SessionFactory进行基本的CRUD操作,以及如何进行复杂查询。此外,codesmith工具的提及可能意味着...

    NHibernate Step by Step(教程).doc

    ### NHibernate Step by Step 教程知识点概览 #### 一、环境搭建与配置 - **NHibernate**:NHibernate 是一个开源的对象关系映射器(Object-Relational Mapper,ORM),它允许开发者以面向对象的方式操作关系型...

    Linq2NHibernate.Step1

    而在ORM(对象关系映射)领域,NHibernate作为一款流行的框架,能够帮助我们无缝地在.NET应用程序和数据库之间进行数据操作。本文将围绕"LINQ to NHibernate"展开,介绍如何在NHibernate中使用LINQ进行数据查询。 1...

    DOTNET数据库操作(NHibernate)

    在"第6章 数据映射方案.pdf"中,会讲解如何通过NHibernate的Hibernate Mapping By Code或者XML Hibernate Mapping文件将对象模型与数据库表进行映射。映射的核心是定义对象属性与数据库字段之间的对应关系,这使得...

    NHibernate 2.0单表Demo

    在这个"NHibernate 2.0单表Demo"中,我们将深入探讨如何利用NHibernate 2.0进行单表操作。 1. **对象关系映射(ORM)基础** ORM是将数据库结构与编程语言中的对象模型相结合的一种技术,它允许开发者用面向对象的...

    NHibernate4.0数据库操作完整代码

    这个“NHibernate4.0数据库操作完整代码”示例主要展示了如何使用NHibernate4.0版本与MSSQL数据库进行交互,包括一级缓存和二级缓存的实现。 首先,我们需要了解NHibernate的基本概念。它将对象模型与关系数据库...

    nhibernate

    nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#

    NHibernate数据库操作实例

    NHibernate数据库批量处理实例 NHibernate开发MIS系统的基础技术,NHibernate的对象/数据库映射提供数据库持久层,基于DataGridView控件实现数据的批量增删改。 关于系统的细节请参见 大树下好乘凉 的博客 ...

    NHibernate

    9. **缓存机制**:NHibernate内置了第一级缓存(Session级别)和第二级缓存(SessionFactory级别),提高数据访问效率。还可以集成第三方缓存服务,如Memcached或Redis。 10. **性能优化**:理解何时使用Flush模式...

    NHibernate-2.1.2.GA-bin NHibernate框架

    8. **复杂查询**:除了简单的单表查询,NHibernate 还支持联接查询、子查询、分组和聚合操作,以及高级的查询构造。 9. **批量操作**:对于需要大量数据操作的场景,NHibernate 提供了批量插入、更新和删除的优化...

    NHibernate+WCF项目实战(二)使用NHibernate实现数据访问并进行单元测试 - WCF - 拼吾爱程序人生.mht

    NHibernate+WCF项目实战

    Spring.Net,Nhibernate多数据库操作

    而NHibernate则是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作,从而减少了对SQL的直接依赖。 本文将深入探讨如何使用Spring.Net与NHibernate结合进行多数据库操作,以便在不同...

    Nhibernate

    **Nhibernate** 是一个流行的开源对象关系映射(ORM)框架,它为.NET开发者提供了在各种数据库系统上操作数据的强大工具。ORM框架的主要目标是简化数据库操作,通过将数据库表与C#等编程语言中的类进行映射,允许...

    学习经典NHibernate框架

    NHibernate是一款强大的对象关系映射(ORM)框架,它在.NET环境中广泛应用于数据库访问层,极大地简化了数据操作。此框架允许开发人员使用面向对象的方式来处理数据库操作,从而避免了手动编写大量的SQL语句,提高了...

    NHibernate2.0

    - NHibernate 2.0 使用Hibernate Mapping By Code或HBM XML文件来定义对象与数据库表之间的映射关系。这些文件定义了类、属性、标识符、关联等元素的映射规则。 **3. Session和Transaction管理** - Session是...

    Nhibernate_一步一步

    #### 二、NHibernate的优势 1. **减少重复性工作**:NHibernate可以自动生成大量与数据库交互的代码,这意味着开发者不必手动编写SQL查询或处理结果集。 2. **提高开发效率**:通过使用NHibernate,开发者可以专注...

    Nhibernate生成单表映射的模板

    在.NET环境中,Nhibernate简化了数据库操作,通过映射实体类到数据库表,使得数据库操作与业务逻辑解耦。本教程将详细介绍如何使用Codesmith工具生成Nhibernate的单表映射模板,以便更高效地管理数据库表的映射文件...

Global site tag (gtag.js) - Google Analytics