NHibernate的基本使用(转载)

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中去配置一下:

<configSections> <!--配置节-->
 <section name="nhibernate"
             type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>

<!-- 配置信息用于指定NH以何种方式访问数据库-->
  <nhibernate>
     <!--连接提供者,取值必须是实现了IConnectionProvider接口的类的全名-->
    <add key="hibernate.connection.provider"
         value="NHibernate.Connection.DriverConnectionProvider" />
     <!--数据库方言,取值必须是继承之Dialect的类的全名-->
    <add key="hibernate.dialect"
         value="NHibernate.Dialect.MsSql2000Dialect" />
     <!--数据驱动类,取值必须是实现了IDriver接口的类的全名-->
    <add key="hibernate.connection.driver_class"
         value="NHibernate.Driver.SqlClientDriver" />
     <!--连接字符串,取值要与driver_class指定的数据驱动类对应.-->
    <add key="hibernate.connection.connection_string"
         value="server=(local);uid=sa;pwd=sa;database=dbtest" />
</nhibernate>

制作一个持久化的类:

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; }
        }
    }


编写每个持久化类的配置
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name=“BE.Account,BE" table="account">
    <id name="Id" column="userid" type="Int32">
      <generator class="identity" />
    </id>
    <property name="Username" type="String" length="50"/>
    <property name="Password" type="String" length="50"/>
  </class>
</hibernate-mapping>

其中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 来得到所有查询之后的结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值