Nhibernate学习!基础篇!

来源:互联网 发布:英语六级怎么过 知乎 编辑:程序博客网 时间:2024/06/05 13:33

Nhibernate是什么?

Nhibernate是一个对象关系映射(ORM)解决方案!是一个面向对象领域域模映射到传统的关系型数据库,他提供呢一个框架,其主要目的是为呢缓解开发者从关系数据库持久化编程任务的一个重要部分。

ORMObject/Relation Mapping),对象关系映射,是一种解决某一方面或者问题的思想,其思想(个人理解)就是为呢解决或者缓解对象持久化的问题。而Nhibernate就是体现这一思想的过程。

比如:以前,我们通过写Sql语句和存储过程来对数据进行持久化,这样不仅容易出错,而且繁琐且出现大量重复代码,而现在,我们只需通过对象本身自己就插入、删除、更改、查找进行持久化等。而Nhibernate就替我们解决编写sql语句等任务。

当然,对于ORM,还可以同其他角度来进行理解,比如从映射角度来进行理解,映射的数学解释是集合A中元素a,在法则f情况下,在集合B中唯一存在b跟其对应。同样,程序内存中的一个确定对象,在关系型数据库中只有一条记录与之对应。我对对象直接的关系,仅从关系型数据库来理解的话,只有一对多,多对多,多对一等三个关系。

解释呢什么是Nhibernate和ORM后,应该对其有一个直观了解,就是解放劳动力!

现在开始通过Nhibernate来为我们减轻工作!

这里我们通过Nhibernate对一张表记录进行增、删、改、查,来初步了解Nhibernate!

其主要工作和流程如下:

1,  编写表Student,所对应的实体类StudentClass)。

2,  编写数据库与实体类沟通的基础Xml,这个属于映射文件。

3,  编写NHibernate对应的配置文件,告诉NHibernate如何连接数据库。

4,  调用Nh提供的API,对数据库进行操作。

具体方法如下:

1,编写表Student,所对应的实体类StudentClass

publicclass Student    {        public Student() { }         privatestring studentId;        privatestring studentName;        privatestring studentSex;        privatestring studentAddress;        privateint cID;          publicvirtual string StudentId        {            get { return studentId; }            set { studentId = value; }        }         publicvirtual string StudentName        {            get { return studentName; }            set { studentName = value; }        }        publicvirtual string StudentSex        {            get { return studentSex; }            set { studentSex = value; }        }        publicvirtual string StudentAddress        {            get { return studentAddress; }            set { studentAddress = value; }        }         publicvirtual int CID        {            get { return cID; }            set { cID = value; }        }}


 

这个地方在写属性的时候,要加上virtual虚方法的标示。

2,编写数据库与实体类对应的XML,映射文件。

   可能你会问,为什么这个XML映射文件,会操作对应的表,Net中的Nhibernate是从Javahibernate引申扩展过来的,其运用到反射的机制,这个我们和面的文章会详细说明反射,其中我们也自己编写一个基于ORM关系映射的文件,通过他,我们也会象Nhibernate那样进行数据库操作。

<?xmlversion="1.0"encoding="utf-8" ?>

<hibernate-mappingxmlns="urn:nhibernate-mapping-2.2">

    <classname="MyNhibernate.Student, MyNhibernate"table="Student">

        <idname="StudentId"column="StudentId"type="string"length="50">

           <generatorclass="assigned" />

        </id>

        <propertyname="StudentName"column="STUDENTNAME"type="string"length="50"/>

        <propertyname="StudentSex"column="STUDENTSEX"type="string"length="50"/>

        <propertyname="StudentAddress"column="STUDENTADDRESS"type="String"length="50"/>

    </class>

</hibernate-mapping>

3,编写NHibernate对应的配置文件,告诉NHibernate如何连接数据库。在web.conf里面进行配置。或者在单独的hibernate.cfg.xml里面

<configSections><sectionname="hibernate"type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>

   </configSections>

<hibernate>

    <propertyname="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>

    <propertyname="dialect">NHibernate.Dialect.Oracle10gDialect</property>

    <propertyname="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

    <propertyname="connection.connection_string">

      Data Source=ORACLEONE;User ID=SCOTT;Password=SCOTT

    </property>

    <propertyname="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

    <mappingassembly="MyNhibernate"/>

  </hibernate>

相关配置都配置成啦。现在开始在程序中调用

 

 

首先介绍几个Nhibernate组件提供的几个主要对象接口,这些对象就是操作数据的帮手

ISessionIsessionFactoryITranSaction

ISessionFactory,针对单个数据库映射后编译的内存镜像,是线程安全(不可变),他是Isession的工厂。

ISession,应用程序与持久存储层(数据库)交互操作的一个单线程对象,其生命周期短。隐藏呢ADO.Net连接,是ITranSaction的工厂。

ITranSaction,事物,指定原子操作单元范围,是单线程,生命周期短。他通过抽象从底层具体的ADO.NET事物隔开。在某些情况下,一个ISession之内可能包含多个ITranSaction.

 

 

首先,通过NH提供的Nhibernate.cfg.Configuration类,来创造一个ISessionFactory接口

public static readonly ISessionFactory sessionFactory;

sessionFactory = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();

之后,在创造出一个获得的Isession的方法

  publicstaticISession GetSession()

        {

            return sessionFactory.OpenSession();//创造一个ISesion接口对象

        }

 

对象有呢,现在就使用其来操作数据吧CRUD吧!

增(Create)     ISession session =Dal.GetSession(); //获得ISession接口对象    Student sd =newStudent();    StudentId = Guid.NewGuid().ToString();    sd.StudentName = txt_name.Text;    sd.StudentSex = txt_sex.Text;    sd.StudentAddress = txt_address.Text;    sd.CID = 1;    session.Save(sd);    //对数据进行保存    session.Flush();     //这个地方为什么要用到Flush?查(Retrieve)      ISession session =Dal.GetSession();      Student sd=session.Get<Student>(“###########”); //依据ID     this.Label1.Text = sd.StudentAddress;      ICriteria c = session.CreateCriteria(typeof(Student));     c.Add(Expression.Eq("StudentName","郑良辉")); //依据属性查    IList<Student> list = c.List<Student>();    this.Label1.Text = list[0].StudentAddress; 改(Update)  一般思路就是获得对象,在更改相关信息。            ISession session = Dal.GetSession();            Student sd = session.Get<Student>(“###########”);//获得该对象            sd.StudentAddress = this.txt_address.Text; //修改其中某一熟悉            session.Update(sd);            session.Flush();            session.Close(); 删(Delete)一般思路也是获得该对象,在删除该信息。      ISession sessions =Dal.GetSession();            Student sd = sessions.Get<Student>(“######”);            sessions.Delete(sd);            sessions.Flush();            sessions.Close();            string hql ="From Student where StudentName='郑良辉'"; //这个里面是Query语句,基于对象的写法。也就是里面的值都是对象属性,不是表字段            sessions.Delete(hql);          


 

问题:1,为什么在Session操作完成后,会使用到Flush()方法?

                 Save()方法会把一个瞬时对象转化为一个持久化对象,因此在Save()后,对象必须要有一个主键,如果是数据库自动生成的,在调用Save()方法后会立刻执行Insert语句,并获取插入后的对象,而主键设置为assigned,表示主键由用户在程序中分配,所以调用Save()方法后,Nhibernate会把需要Inert的对象放到一个集合中等待Insert,在使用Flush后才会执行Insert操作。

 如果,把Student的主键改为native,那么调用Save()后立即执行Insert语句。

         2,为什么ISessionFactory只创建一次,而我们使用把其初始化放在一个静态的构造方法里面?同时为什么每次操作数据对象都要获得一个ISession接口对象?

            就像上面提到的,ISessionFactory是一个针对单个数据库线程安全的不可变,因为其在加载初始映射的时候,会消耗掉很多资源,因此只有一个对象,而采用静态的方法,在初始加载到内存中,就保证其只会加载创建一次。而Isession是一个单线程的,生命周期短的,里面封装一个ADO.NET连接数据,因此会每次都重新获得一个对象。

         3,对提供给Nhibernate的配置文件(Info),是放在Web.Config里面,还是放在hibernate.cfg.xml里面,而程序在获得此信息进行初始化ISessionFactory对象时候的路径区别?

           在静态类Dal里面,其中

            new NHibernate.Cfg.Configuration().Configure()这个类提供的这个方法,是获得Info信息的,从而来初始化ISesionFactory对象的,有参数和无参数。

对于无参数来说,对于静态类Dal来说首先查找同目录里面的配置信息,没有在查找上一目录,知道根目录,先查找Web.Config里面的配置信息,在查找hibernate.cfg.xml里面的,以Web.Config为准。

对于有参数来说,

new NHibernate.Cfg.Configuration().Configure("Config\\hibernate.cfg.xml")

来说,通过这个查找来获得初始化的配置信息的。

Web.Config 里面的configSections信息,该如何理解呢?

关于映射文件相关节点,因为有点多,就不贴上去!

下载地址:Nhibernate   http://download.csdn.net/detail/zlhxiaohui/5569097

 

 


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米密码忘记了怎么办 红米pro玩王者卡怎么办 红米note4不支持计步怎么办 红米pro玩游戏卡怎么办 红米手机费电快怎么办 荣耀5c忘记密码怎么办 小米之家不退货怎么办 手机号绑定过多小米账户怎么办 耐克黑色鞋褪色怎么办 买广汽传祺7s新车有问题怎么办 华为荣耀10边框掉色了怎么办 网购商家打来无货怎么办 客户拍了不发货怎么办 天猫商家欺骗买家怎么办 阿里买家投诉我发空包怎么办 苹果6s电池坏了怎么办 hm买的单鞋脏了怎么办 微店违规屏蔽搜索怎么办 ios微信支付失效怎么办 京东第三方店铺关闭怎么办 京东店铺关门了怎么办 国美退款不到账怎么办 小米小店通过了怎么办 苹果的发票丢了怎么办 苹果7p开不开机怎么办 申请退款了怎么卖家还发货怎么办 买家申请退款卖家不退款怎么办 卖家恶意不退款怎么办 欠条到期了对方不还钱怎么办 冰箱磕了一坑怎么办 办信用卡没有家庭地址的怎么办 钱付了货没收到怎么办 在苏宁易购上买东西地址错了怎么办 手机分期付款银行卡丢了怎么办 华硕笔记本鼠标不动了怎么办 韵达快递不派送怎么办 中通快递不派送怎么办 农业银行信用卡密码输错三次怎么办 农业银行卡多次输错密码怎么办 想把店长弄走怎么办 济南银座卡过期了怎么办