zoukankan      html  css  js  c++  java
  • NHibernate总结

    NHibernate总结

    现在的项目中数据访问使用的是NHibernate的一个ORM框架,小弟也是在后期加入项目组,之前对NHibernate就一直没有接触过,所以一直在学习NHibernate,都是一些很基础的一些东西,写出来总结一下,作为备忘。

    如果你下个系统的学习NHibernate,给大家推荐一个博客,详细的介绍了NHibernate,我也是根据这篇博客学习的。请点击(http://www.cnblogs.com/lyj/archive/2008/10/10/1308267.html)

    NHibernate是什么

    NHibernate 是一个面向.NET 环境的对象/关系数据库映射工具。对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去。

    NHibernate不仅仅管理.NET 类到数据库表的映射(包括.NET 数据类型到SQL 数据类型的映射),还提供数据查询和获取数据的方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据的时间。NHibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。并请记住NHibernate作为数据库访问层,是与你的程序紧密集成的。

    开始使用NHibernate

    我们亲自动手,一步一步实现一个NHibernate简单程序来,我只实现了简单的增删改查功能。我使用的开发环境:Microsoft Visual Studio 2012、SQL Server 2008 、NHibernate。

    1、创建项目

    (1)     我们新建如下一个项目

     

    NH.Data层为Nhibernate操作相关,其中DBConnect.cfg.xml文件为数据库连接文件(按照模板修改即可),NHData.cs包含增删改查操作,NHibernateHelper.cs封装Nhibernate底层操作,People.cs为实体类,People.hbm.xml为映射文件(把数据库表People映射到实体类People)。,其中People实体类中的字段要设置为virtual。每个文件的详细代码在下面介绍

    (2)     在NH.Data层引用Nhibernate相关的DLL

     

    2、建立数据库表

    复制代码
    Create database Test
    GO
    use Test
    GO
     CREATE TABLE [dbo].[People](
    
    [Id] [int] IDENTITY(1,1) primary key NOT NULL,
    
    [Name] [nvarchar](10) NULL,
    
    [Age] [int] NULL,
    
    [Sex] [nvarchar](1) NULL,
     
    )
    
    GO
    复制代码

     3、NH.Data类库中文件介绍

    (1)      DBConnect.cfg.xml数据库连接文件

    我们根据模板修改一下配置信息和文件输出属性就可以了,主要就是配置连接字符串。

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    
      <session-factory>
    
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    
        <property name="connection.connection_string">
    
          Server=10.165.150.105;initial catalog=Test;User ID=sa;Password=Hello123
    
        </property>
    
        <property name="adonet.batch_size">25</property>
    
        <property name="show_sql">true</property>
    
        <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    
        <property name="use_outer_join">true</property>
    
        <property name="command_timeout">60</property>
    
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    
        <property name="proxyfactory.factory_class">
    
          NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu
    
        </property>
    
        <mapping assembly="NH.Data"/>
    
      </session-factory>
    
    </hibernate-configuration>
    复制代码

     注意:XML文件的默认“复制到输出目录”为“不复制”,这里需要修改为“始终复制”。否则出现异常。我们可以在该文件上点击右键选择属性进行修改。

    (2)     NHibernateHelper.cs数据操作辅助类

    我们现在可以开始NHibernate了。首先,我们要从ISessionFactory中获取一个ISession(NHibernate的工作单元)。ISessionFactory可以创建并打开新的Session。一个Session代表一个单线程的单元操作。 ISessionFactory是线程安全的,很多线程可以同时访问它。ISession不是线程安全的,它代表与数据库之间的一次操作。ISession通过ISessionFactory打开,在所有的工作完成后,需要关闭。 ISessionFactory通常是个线程安全的全局对象,只需要被实例化一次。我们可以使用GoF23中的单例(Singleton)模式在程序中创建ISessionFactory。这个实例我编写了一个辅助类NHibernateHelper 用于创建ISessionFactory并配置ISessionFactory和打开一个新的Session单线程的方法,之后在每个数据操作类可以使用这个辅助类创建ISession

    复制代码
    public class NHibernateHelper
    
        {
    
            private ISessionFactory _sessionFactory;
    
            public NHibernateHelper()
    
            {
    
                _sessionFactory = GetSessionFactory();
    
            }
    
            private ISessionFactory GetSessionFactory()
    
            {
    
                return (new Configuration()).Configure(AppDomain.CurrentDomain.BaseDirectory + "DBConnect.cfg.xml").BuildSessionFactory();
    
            }
    
            public ISession GetSession()
    
            {
    
                return _sessionFactory.OpenSession();
    
            }
    
          
    
    }
    复制代码

    (3)     People.cs实体类

    复制代码
    public class People
    
        {
    
           public virtual int Id { get; set; }
    
           public virtual string Name { get; set; }
    
           public virtual int Age { get; set; }
    
           public virtual string Sex { get; set; }
    
    }
    复制代码

     注意:字段的属性一定要设置为virtual,要不然会报错

    (4)     下面我们开始为People实体类进行数据库表映射配置People.hbm.xml

    NHibernate要知道怎样去加载和存储持久化类的对象。这正是NHibernate映射文件发挥作用的地方。映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉NHibernate它应该访问数据库里面的哪个表及使用表里面的哪些字段。

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    
       assembly="NH.Data"
    
       namespace="NH.Data">
    
     
    
      <class name ="People" table="People" lazy="true">
    
        <id name="Id" column ="Id" type="Int32">
    
          <generator class ="native"/>
    
        </id>
    
        <property name ="Name" column="Name" type="String"/>
    
        <property name ="Age" type="Int32" column="Age"/>
    
        <property name ="Sex" type="String" column="Sex"/>
    
      </class>
    
    </hibernate-mapping>
    复制代码

     注意:XML文件的默认生成操作为“内容”,这里需要修改为“嵌入的资源”生成,因为NHibernate是通过查找程序集中的资源文件映射实体。我们可以在People.hbm.xml点击右键选择属性修改该文件的生成操作

    (5)     NHData.cs对库表People进行增删改查

    现在完事具备只欠东风了,开始我们的数据库CRUD操作,在看该文件的代码时,建议大家先看一下http://www.cnblogs.com/lyj/archive/2008/10/15/1312089.html这篇博客,了解一下NHibernate查询语言(HQL)。

    复制代码
    public class NHData
    
        {
    
           protected ISession Session { get; set; }
    
           public NHData()
    
            {
    
                Session = new NHibernateHelper().GetSession();
    
            }
    
           public IList<People> GetList()
    
           {
    
               var crit = Session.CreateCriteria(typeof(People));
    
               return crit.List<People>();
    
           }
    
           //增加
    
           public int Create(People p)
    
           {
    
             object value= Session.Save(p);
    
               Session.Flush();
    
               return Convert.ToInt32(value);
    
           }
    
           //根据Sql语句获取实体
    
           public IList<People> GetListBySql()
    
           {
    
               return Session.CreateQuery("from People c where c.id>:id").SetString("id", "1").List<People>();
    
     
    
               string strsql = "select * from Customer where id>2";
    
               ISQLQuery sqlQuery = Session.CreateSQLQuery(strsql).AddEntity("Customer", typeof(People));
    
               return sqlQuery.List<People>();
    
           }
    
           //获取
    
           public People Get(int id)
    
           {
    
               List<ICriterion> lst = new List<ICriterion>();
    
               lst.Add(Restrictions.Where<People>(c=>c.Id==id));
    
               var crit = Session.CreateCriteria(typeof(People));
    
               lst.ForEach(c => crit.Add(c));
    
               return crit.List<People>()[0];
    
           }
    
           //删除
    
           public void Delete(int id)
    
           {
    
               People p = Get(id);
    
               Session.Delete(p);
    
               Session.Flush();
    
           }
    
           //修改
    
           public void Update(int id)
    
           {
    
               People p=Get(id);
    
               p.Name="wer";
    
               Session.Update(p);
    
               Session.Flush();
    
           }
    
     
    
           public List<People> getList()
    
           {
    
               string strsql = "select * from people";
    
               SqlConnection con = new SqlConnection(strsql);
    
               con.Open();
    
               SqlCommand cmd = new SqlCommand(strsql,con);
    
               SqlDataAdapter sda = new SqlDataAdapter(cmd);
    
               DataTable dt = new DataTable();
    
               sda.Fill(dt);
    
               return dt.ToList<People>();
    
           }
    
     
    
    }
    复制代码

    4、测试

    在NHibernateSample中引用NH.Data.dll

    把NH.Data中的DBConnect.cfg.xml文件copy到NHibernateSample项目中,这个问题我一直没有解决,不知道怎么解决。

    新建一个default.aspx页面

    复制代码
    protected void btnAdd_click(object sender, EventArgs e)
    
            {
    
                People p = new People()
    
                {
    
                    Name = new Random().Next(99999999).ToString(),
    
                    Age = 10010,
    
                    Sex = ""
    
                };
    
                data.Create(p);
    
                IList<People> lst = data.GetList();
    
                GridView1.DataSource = lst;
    
                GridView1.DataBind();
    
            }
    复制代码

    点击这里下载源程序

     每天学习一点点,每天进步一点点。

     
     
     
    标签: NHbernate
  • 相关阅读:
    重写Django登录认证,实现用户名或者手机均可登录
    Django media文件夹详解
    Django admin使用
    python极验验证部署
    django 分页
    模板语言控制往哪个地址提交时,如果不填,默认往当前地址提交,也可以用request方法获取当前地址提交
    HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别
    ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析
    谈谈线程池的核心参数,描述核心流程、应该怎么正确使用
    深入CAS的底层实现机制,以及对应的使用风险
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3199608.html
Copyright © 2011-2022 走看看