Nhibernate学习之起步篇-1

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文件。将下面代码粘贴到此文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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,添加代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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


 

1
2
3
4
5
6
7
8
9
10
11
<?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,代码为:


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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,并输入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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更改数据表结构对代码的影响要远远小于代码生成。

  源码下载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值