zoukankan      html  css  js  c++  java
  • NHibernate的基本使用

    一.O/R Mapping 概论

    工厂模式+反射+每个数据库的DAL层来解决数据访问层的代码

    针对数据库表中字段的变化我们是无法预料的,所以每一次用户需求的修改都会直接导致我们程序员来修改—实体类(BE层),数据访问层(DAL),这样同样会导致以上的各层BLL,UI等等的修改,长久的下去,只会造成项目的噩梦。

    在软件高速发展的今天,已经有很多的人在为这个问题而努力了,其中最有成果的就是java社区,因为java社区的开源精神,促使了一个新的概念的诞生。

    O/R Mapping的思想。

    二.什么是O/R Mapping?

    O:object
    R:relationship
    Mapping:映射

    将关系型数据库与我们的面向对象联系起来,
    将表与类(实体类,javabean)联系起来

    我们的程序直接与对象打交道,而不去关心是什么类型的数据库以及是不是数据库了。

    三.为什么要O/R Mapping?

    考虑我们原先的JDBC或者ADO.NET,我们的代码是这个样子的:
    Using System.Data.SqlClient;

    SqlConnection conn = new SqlConnection(“server=.;uid=sa;pwd=sa;database=dbtest”);
    SqlCommand cmd = conn.CreateCommand();
    cmd,.CommandText = “select * from account”;
    Con.Open();
    SqlDataReader sr = cmd.ExecuteQuery();
    While(sr.Read())

     //………这里是我们需要的代码,才是我们真正关心的代码
    }
    Conn.Close();

    但是很烦琐,因为其中很多的代码都是与我们整个需求无关的。
    我们只需要关心的是:获得的结果以及增加,修改,删除的结果。
    所以我们要把数据库与面向对象的概念整和起来。

    四.我们的需求

    我们希望在编写代码的时候是这个样子的:
    //实体类
    Class User
    {
     string name;
     int age;
     ……..
    }
    //DAL层代码
    Class UserDAL
    {
     User u = new User();
     u.Name = “Guilee”;
     u.Age = 25;
     u.Id = 1;
     Add(u);//将新用户添加到数据库中
     Update(u);//修改数据库的内容
     Delete(u);//删除数据库的内容
    }
     

    我们不需要关心数据库是什么,如果数据库中表的字段进行了更改,我们也不需要对代码有过多的更改,做为程序员,我们应该更加关心的是当我拥有了这些数据之后,我的业务怎么样去完成!
    您不需要写SQL语句!!!!
    O/R Mapping框架帮您做好

    五.Hibernate

    在全球的程序员的努力下,我们终于看到了这样的产品的出现:
    JDO:一个不成熟的产品
    IBatis:一个半成品
    Hibernate:目前最有影响力,最好的O/R Mapping框架,已经成为Java持久层的标准。
     
    在.NET社区,已经有NHibernate,NIBatis这样的产品出现了!
    Hibernate一个数据持久层的框架,足以满足中小企业进行企业级开发的选择,能让你摆脱数据库的烦恼,不再过去写那麻烦的数据访问层的代码,不关心数据的连接与释放,把精力都放置在具体的业务逻辑上面!

    六.NHibernate的基本使用

    首先我们需要NHibernate的程序集:
    NHibernate.dll
    Log4net.dll
    Iesi.Collections.dll
    Castle.DynamicProxy.dll
     
    至少四个,其中NHibernate.dll是核心的程序集,Log4net.dll是日志记录程序集,
    Iesi.Collections.dll是集合框架的程序集,Castle.DynameicProxy.dll控制反转的程序集
     
     
    第二步
    需要持久化类
    所谓的持久化类就是我们常说的实体类或者javabean,它是O/R Mapping的映射对象,通过控制它来封装我们的数据
     
     

    第三步:
    使用NHibernate的配置文件
    在配置文件中指定数据库的方式,连接数据库的方式
    让NHibernate知道如何去使用连接数据库


    第四步:
    编写O/R Mapping的映射文件
    让NHibernate知道如何去映射.NET与数据库之间的关系


    最后使用强大的NHibernate来编写你的程序!
    为了让NHibernate知道如何去连接数据库,所以你必须在我们.NET中的app.config或者web.config中去配置一下:


     

                 type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
     


     
        
                 value="NHibernate.Connection.DriverConnectionProvider" />
        
                 value="NHibernate.Dialect.MsSql2000Dialect" />
        
                 value="NHibernate.Driver.SqlClientDriver" />
        
                 value="server=(local);uid=sa;pwd=sa;database=dbtest" />

    制作一个持久化的类:

    public class Account //注意必须将属性设置为virtual虚拟的
        {
            private int id;

            virtual public int Id
            {
                get { return id; }
                set { id = value; }
            }
            private string username;

            virtual public string Username
            {
                get { return username; }
                set { username = value; }
            }
            private string password;

            virtual public string Password
            {
                get { return password; }
                set { password = value; }
            }
        }


    编写每个持久化类的配置


     
       
         
       
       
       
     

    其中xmlns指定了使用NHibernate的版本,
    class元素的name属性指定了持久化类的全名称,逗号隔开的是程序集的名称
    table属性指定了对应的数据库中表名称
    id元素是指定主键列名,name属性是指持久化类的属性名,column是表中列名
    property元素是其他的每一列与持久化类的哪个属性对应
    generator元素 中的class属性指定了是自动增长列

    保存为Account.hbm.xml文件

    使用NHibernate,你可以开始使用NHibernate来体验他们的强大之处了:)
     

    using NHibernate;
    using NHibernate.Cfg;
     
                Configuration cfg = new Configuration();
                cfg.AddAssembly(“BE");
                ISessionFactory factory = cfg.BuildSessionFactory();
                ISession session = factory.OpenSession();
                ITransaction transaction = session.BeginTransaction();
                Account a = new Account();
                a.Username = “Guilee";
                a.Password = "1234";
                a.Id = 1;
                session.Save(a);
     
                //修改数据库的内容
                //session.Update(a);
     
                //删除数据库的内容
                //session.Delete(a);
                transaction.Commit();
                session.Close();
     

     

    首先,创建一个Configuration对象
    Configuration对象能够解析所有.Net对象和后台数据库中的映射关系。
    Configuration cfg = new Configuration();
    cfg.AddAssembly(“BE");
    Configuration对象会搜索装配件里的任何以hbm.xml 结尾的文件。还有其他方法加载映射文件,但这种方式是最简单的。
     
    创建一个Session对象
    ISession对象提供一个到后台数据库的连接,ITransaction对象提供一个可以被NHibernate管理的事务。
    ISessionFactory factory = cfg.BuildSessionFactory(); ISession session = factory.OpenSession();
    ITransaction transaction = session.BeginTransaction();
    接着来增///查你的对象
    现在你可以用使用传统的.Net方法来操纵对象。
     

     

    NHibernate将查询的方式变成了面向对象的方法,针对查询最简单的使用方式是:
     ICriteria c = session.CreateCriteria(typeof(BEAccount));
    c.Add(Expression.Eq("Username",account.Username));
    c.Add(Expression.Eq("Password",account.Password));
    IList list = c.List();
     
    使用ICriteria 表示一次查询动作
    整个代码表示:
    查询Account表,找到username为account.Username并且password为account.Password的所有记录
    使用List来得到所有查询之后的结果
  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/jett010/p/4826579.html
Copyright © 2011-2022 走看看