NHibernate演示

简介

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

NHibernate的目标主要是用于与数据持久化相关的编程任务,能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现上。对于以数据为中心的程序,开发人员往往是在数据库中使用存储过程来实现商业逻辑,这种情况下NHibernate可能不是最好的解决方案,但对于那些基于.NET,并且能够实现OO业务模型和商业逻辑的中间层应用,NHibernate是最有用的。NHibernate可以帮助用户消除或者包装那些针对特定厂商的SQL代码,并且帮用户把结果集从表格式的表示形式转换成一系列的对象。

Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框架,它对Java的JDBC(类似于ADO.Net)进行了非常轻量级的对象封装,使得程序员可以随心所欲的使用对象编程思维来操纵数据库,目前在国内Java开发界已经颇为流行,Hibernate+Spring往往是很多Java公司招聘的要求

体系结构

NHibernate   它体现了NHibernate如何使用数据库和配置文件数据来为应用程序提供持久化服务(和持久化的对象)。
SessionFactory(NHibernate.IsessionFactory):它是Session的工厂,是ConnectionProvider的客户。可以持有一个可选的(第二级)数据缓存,可以在进程级别或集群级别保存的可以在事物中重用的数据。
会话(NHibernate.ISession):单线程,生命期较短的对象,代表应用程序和持久化层之间的一次对话。封装了一个ADO.NET连接,也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。
持久化对象(Persistent)其集合(Collections):生命期较短的单线程的对象,包含了持久化状态和商业功能。这些可能是普通的对象,唯一特别的是现在从属于且仅从属于一个Session。一旦Session被关闭,它们都将从Session中取消联系,可以在任何程序层自由使用(比如,直接作为传送到表现层的DTO,数据传输对象)。
临时对象(Transient Object)及其集合(Collection):目前没有从属于一个Session的持久化类的实例。这些可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session实例化。
事务Transaction (NHibernate.ITransaction):(可选)线程,生命期较短的对象,应用程序用其来表示一批工作的原子操作,它是底层的ADO.NET事务的抽象。一个Session在某些情况下可能跨越多个Transaction事务
ConnectionProvider(NHibernate.Connection.ConnectionProvider):(可选)ADO.NET连接的工厂。从底层的IDbConnection抽象而来。对应用程序不可见,但可以被开发者扩展/实现。
TransactionFactory(net.sf.hibernate.TransactionFactory):(可选)事务实例的工厂。对应用程序不可见,但可以被开发者扩展/实现。
 

配置

<configSections>
    <section
        name="hibernate-configuration"
        type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"
        />
  </configSections>

  <!-- Nhiberate配置节点 -->
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory name="NHibernate.Test">
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">
        Server=acer-pc;initial catalog=NhDemo;uid=sa;pwd=123
      </property>
      <property name="adonet.batch_size">10</property>
      <property name="show_sql">false</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="NhDemo" />
    </session-factory>
  </hibernate-configuration>

  配置2

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="NhDemo" assembly="NhDemo">
  
  <class name="Student" table="Student">
   
    <id name="Id">
      <column name="Id" sql-type="int" not-null="true"/>
      <generator class="identity" />
    </id>

    <!-- A cat has to have a name, but it shouldn' be too long. -->
    <property name="SName">
      <column name="SName" length="32" not-null="false" />
    </property>
    
    <!--如果列名跟属性名一致的话那就不用配置了-->
    <property name="SubTime" />
  </class>

</hibernate-mapping>

  

代码

namespace NhDemo
{
    public class Student
    {
        public virtual int Id { get; set; }

        public virtual string SName { get; set; }

        public virtual DateTime SubTime { get; set; }
    }
}

  

            
	    //通过配置文件创建Nh  Session的工厂
            ISessionFactory sessionFactory =
            new Configuration().Configure().BuildSessionFactory();

            //通过工厂创建一个Session对象


            var session = sessionFactory.OpenSession();//相当于EF的上下文。


            //var trans= session.BeginTransaction();
            ////操作数据实体
            //Student student =new Student();
            //student.SName = "demo";
            //student.SubTime = DateTime.Now;

            //session.Save(student);
            //session.SaveOrUpdate(student);

            //session.Delete(new Student(){Id=1});

            //Nh:查询,支持linq
            var temp = from u in session.Query<Student>()
                       where u.Id < 10
                       select u;
            foreach (var student in temp)
            {
                Console.WriteLine(student.Id + "  " + student.SName);
            }

            //trans.Commit();
            session.Close();

            Console.ReadKey(); 

  

 
 
posted @ 2013-11-10 10:48  那个故人  阅读(178)  评论(0)    收藏  举报