| |
1. 学习目的 学习nhibernate基础知识。掌握nhibernate的配置方法,实现对单表的简单操作,如:创建表,查询,添加,删除,修改。 2. 开发环境+前期准备 开发环境: windows 2003,visual studio .net 2005,sql server 2005 developer edition 前期准备: nhibernate框架,我用的目前最新版nhibernate-1.2.0.cr1, 下载地址: http://downloads.sourceforge.net/nhibernate/nhibernate-1.2.0.cr1.msi?modtime=1172161735&big_mirror=0 3. 开发步骤: 1).双击下载下来的nhibernate-1.2.0.cr1.msi,将其安装到某个目录,我的目录为: e:/download project/orm/nhibernate.,打开该目录,即可以看到bin,doc,src三个子目录,分别为realse好的dll或者exe目录,文档说明目录,和源程序目录. 2).打开visual studio 2005,创建类库项目nhibernatesample1 3).在解决方案管理其中,右键点击引用-添加引用,在选项卡种选择浏览,设定查找范围为:e:/download project/orm/nhibernate/bin,添加对nhibernate.dll,log4net.dll, iesi.collections, hashcodeprovider四个dll的引用. 4).打开sql server management studio,创建数据库nhibernate。 5).在解决方案管理器中添加hibernate.cfg.xml文件。将下面代码粘贴到此文件:
<?xml version="1.0" encoding="utf-8" ?><hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" ><session-factory name="nhibernate.test"><!-- properties --><property name="connection.provider">nhibernate.connection.driverconnectionprovider</property><property name="connection.driver_class">nhibernate.driver.sqlclientdriver</property><property name="connection.connection_string">server=127.0.0.1;initial catalog=nhibernate;uid=sa;pwd=123;</property><property name="show_sql">false</property><property name="dialect">nhibernate.dialect.mssql2005dialect</property><property name="use_outer_join">true</property><!-- mapping files --><mapping assembly="nhibernatesample1" /></session-factory></hibernate-configuration>
该文件是nhibernate的配置文件,其中connection.connection_string为数据库连接字符串,dialect项因为我用的是sql2005,所以为:mssql2005dialect注意:<mapping assembly=”nhibernatesample1”/>表示映射nhibernatesample1程序集下的所有类,所以以后不要需要configuration.addclass(..)了;
6).添加类文件:user.cs,添加代码:
using system;using system.collections.generic;using system.text;namespace nhibernatesample1{public class user{private int _id;private string _name;private string _pwd;/**//// <summary>/// 编号/// </summary> public virtual int id{get{return _id;}set{_id = value;}}/**//// <summary>/// 名称/// </summary> public virtual string name{get{return _name;}set{_name = value;}}/**//// <summary>/// 密码/// </summary> public virtual string pwd{get{return _pwd;}set{_pwd = value;}}}}
6).编写user类的映射配置文件:user.hbm.xml
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"><class name="nhibernatesample1.user,nhibernatesample1" table="users" lazy="false"><id name="id" column="id" unsaved-value="0"><generator class="native" /></id><property name="name" column="name" type="string" length="64" not-null="true" unique="true"></property><property name="pwd" column="pwd" type="string" length="64" not-null="true"></property></class></hibernate-mapping>
注意:该映射文件的属性中的生成操作必须为:嵌入的资源.
7).编写管理isession对象的辅助类: nhibernatehelper.cs,代码为:
using system;using system.web;using nhibernate;using nhibernate.cfg;namespace nhibernatesample1...{public sealed class nhibernatehelper...{private static readonly isessionfactory sessionfactory;static nhibernatehelper()...{sessionfactory = new configuration().configure(@"e:/my project/nhibernate study/simle 1/nhibernatestudy1/nhibernatesample1/hibernate.cfg.xml").buildsessionfactory();}public static isession getcurrentsession()...{isession currentsession = sessionfactory.opensession();return currentsession;}public static void closesessionfactory()...{if (sessionfactory != null)...{sessionfactory.close();}}}}
注:因为我用的是单元测试,所以这里的配置文件路径写成固定的了。如果换成windows或者web程序,可以直接去掉该路径。
8) 编写测试crud类:userfixue using system;using system.collections.generic;using system.text;using nhibernate;using nhibernate.cfg;using nhibernate.tool.hbm2ddl;namespace nhibernatesample1{public class userfixure{private isession session;public userfixure(){}/**//// <summary>/// 创建表/// </summary> public bool exporttable(){try{configuration cfg = new configuration().configure(@"e:/my project/nhibernate study/simle 1/nhibernatestudy1/nhibernatesample1/hibernate.cfg.xml");session = nhibernatehelper.getcurrentsession();itransaction transaction = session.begintransaction();new schemaexport(cfg).create(true, true);transaction.commit();return true;}catch(exception ex){throw ex;}finally{session.close();}}/**//// <summary>/// 添加/// </summary> public int add(){try{user u = new user();u.name = guid.newguid().tostring();u.pwd = "124";session = nhibernatehelper.getcurrentsession();itransaction transaction = session.begintransaction();session.save(u);transaction.commit();return u.id;}catch (exception ex){throw ex;}finally{session.close();}}/**//// <summary>/// 更新/// </summary>/// <param name="uid"></param> public bool update(int uid){try{session = nhibernatehelper.getcurrentsession();itransaction transaction = session.begintransaction();user u = session.load(typeof(user), uid) as user;if (u != null){u.name = "updatedname";session.saveorupdate(u);transaction.commit();u = session.load(typeof(user), uid) as user;if (u.name == "updatedname"){return true;}}return false;}catch (exception ex){throw ex;}finally{session.close();}}/**//// <summary>/// 删除/// </summary>/// <param name="uid"></param>/// <returns></returns> public bool delete(int uid){try{session = nhibernatehelper.getcurrentsession();itransaction transaction = session.begintransaction();user u = session.get(typeof(user), uid) as user;if (u != null){session.delete(u);transaction.commit();u = session.get(typeof(user), uid) as user;if (u == null){return true;}}return false;}catch (exception ex){throw ex;}finally{session.close();}}public system.collections.ilist query(){try{session = nhibernatehelper.getcurrentsession();itransaction transaction = session.begintransaction();system.collections.ilist list= session.createquery("select u from user as u").list();transaction.commit();return list;}catch (exception ex){throw ex;}finally{session.close();}}}}
9)创建新单元测试项目: testproject1,添加nhibernatesample1的引用 10)创建单元测试类: unittest1.cs,并输入如下代码: using system;using system.text;using system.collections.generic;using microsoft.visualstudio.testtools.unittesting;using nhibernatesample1;namespace testproject1{/**//// <summary>/// unittest1 的摘要说明/// </summary> [testclass]public class unittest1{public unittest1(){//// todo: 在此处添加构造函数逻辑// }其他测试属性#region 其他测试属性 //// 您可以在编写测试时使用下列其他属性://// 在运行类中的第一个测试之前使用 classinitialize 运行代码// [classinitialize()]// public static void myclassinitialize(testcontext testcontext) { }//// 在类中的所有测试都已运行之后使用 classcleanup 运行代码// [classcleanup()]// public static void myclasscleanup() { }//// 在运行每个测试之前使用 testinitialize 运行代码// [testinitialize()]// public void mytestinitialize() { }//// 在运行每个测试之后使用 testcleanup 运行代码// [testcleanup()]// public void mytestcleanup() { }// #endregion int uid;[testmethod]public void testmethod1(){userfixure userfixure = new userfixure();assert.istrue(userfixure.exporttable());}[testmethod]public void testmethod2(){userfixure userfixure = new userfixure();uid = userfixure.add();assert.istrue(uid>0);}[testmethod]public void testmethod3(){userfixure userfixure = new userfixure();assert.istrue(userfixure.update(uid));}[testmethod]public void testmethod4(){userfixure userfixure = new userfixure();assert.istrue(userfixure.delete(uid));}[testmethod]public void testmethod5(){userfixure userfixure = new userfixure();assert.istrue(userfixure.query().count>0);}}}
11)在菜单-测试-加载元数据文件 选择nhibernatestudy1.vsmdi,然后按顺序执行testmethod1-testmethod5,全部成功!
4.总结 通过使用nhibernate,基本上可以使开发人员不在接触繁琐的数据库表和数据库操作代码,您唯一需要关心的就是如何设计好类,让这些类满足您的业务需求。从扩展性来说nhinernate具有非常好的扩展性。与代码生成比较,nhibernate更改数据表结构对代码的影响要远远小于代码生成。
|
|