Nhibernate學習之起步篇-1
1. 學習目的
學習Nhibernate基礎知識。掌握Nhibernate的配置方法,實現對單表的簡單操作,如:創建表,查詢,添加,刪除,修改。
2. 開發環境+前期準備
開發環境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
前期準備: Nhibernate框架,我用的目前最新版NHibernate-
3. 開發步驟:
1).雙擊下載下來的NHibernate-
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=”NhibernateSample
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();
}
}
}
}
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: 在此處添加構造函數邏輯
//
}
其他測試屬性
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更改數據表結構對代碼的影響要遠遠小于代碼生成。
如果您想下載Demo:/Files/jillzhang/simle.rar
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。



浙公網安備 33010602011771號