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();

浙公网安备 33010602011771号