zoukankan      html  css  js  c++  java
  • 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文件。将下面代码粘贴到此文件: 
    <?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
    7).编写管理ISession对象的辅助类: NHibernateHelper.cs,代码为:
    <?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>
      注意:该映射文件的属性中的生成操作必须为:嵌入的资源.

    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(truetrue);
                    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
     
  • 相关阅读:
    leetcode38.外观数列(循环匹配)
    leetcode35.搜索插入位置(遍历并进行大小判断)
    leetcode28.实现strStr()(暴力拆解,双指针,KMP算法)
    JavaScript对象
    数组迭代
    数组的用法:
    数组
    while与do while 区别 for循环的简介及break和continue的区别
    for循环语句
    if.......else语句子
  • 原文地址:https://www.cnblogs.com/encounter/p/2188836.html
Copyright © 2011-2022 走看看