设为首页 加入收藏

TOP

ORM利器:NHibernate(三)五部曲+简单对象CRUD+HQL(一)
2014-11-24 07:39:36 来源: 作者: 【 】 浏览:6
Tags:ORM 利器 NHibernate 五部 简单 对象 CRUD HQL

前面的两篇文章中,我们对NHibernate已经做了大致了解

《ORM利器:NHibernate(一)简介》Nhibernate的作用:解决了对象和数据库的转化问题

《ORM利器:NHibernate(二)使用CodeSmith快速生成映射文件和映射类 》利用CodeSmith由表导出映射类(就是通常所说的Entity)和映射文件(告诉你表和对象之间是如何建立一一对应的关系的)。

接下来将会对NHibernate的使用做Demo解析,分为五部曲:

  1. 创建表。若要把对象转换为数据库中的表,自然要有对一个的表。因此,首先要在数据库中创建把.Net类持久化的对应表。创建类。创建需要被持久化的.Net类.对象。创建映射文件。 描述对象和库之间的关系,告诉NH怎样持久化这些类的属性.创建NH的配置文件,以告诉NH怎样连接数据库,以何种方式连接不同种类的数据库。使用NH提供的API。维护对象和库之间的关系,对对象的CRUD和对数据库的DML.
    步骤详情: 第一部:创建表(步骤很简单,这里不做解释)
    第二部:创建类+第三部:创建映射文件(本Demo利用CodeSmith自动生成,详细请参见《ORM利器:NHibernate(二)使用CodeSmith快速生成映射文件和映射类 》)
    第四部:创建NH配置文件 主要用于连接数据库:驱动的提供者、驱动的位置、数据库的身份验证信息等,和我们曾经写过的数据库连接语句无意,只不过放在了配置文件中而已。而且NH采用代理工厂,针对不同的数据库产品进行生产,提供了更好的灵活性,如果你需要把SQLServer数据库,更改为Oracle数据库,只需要更改相应的配置信息就可以。
    < xml version="1.0" encoding="utf-8"  >
    
      
        
    NHibernate.Connection.ConnectionProvider,NHibernate NHibernate.Driver.SqlClientDriver Server=(local);initial catalog=NHibernate;Integrated Security=SSPI NHibernate.Dialect.MsSql2008Dialect False NHibernate.ByteCode.Linfu.ProcxyFactoryFactory,NHibernate.ByteCode.Linfu
    如果你觉得配置文件很复杂、记不住,也没有关系。NH为我们提供了很多配置文件的模板以供参考,这里我们采用SQLServer,因此可以参照:Configuration_Templates—MSSQL.cfg.xml

    第五部:使用NH提供的API。维护对象和库之间的关系,对对象的CRUD和对数据库的DML

    1、目录结构如下:

    1)新建类库Test:

    用于存放所有的对象和.NET映射文件(如此处的Person.cs对象,Person.hbm.xml映射文件),为了让NHibernate能够找到所有的映射文件,必须设置为“嵌入资源”,生成Test.dll文件备用。

    2)添加引用:

    外部引用NHibernate和NHibernate.ByteCode.Linfu.项目引用Test.dll

    \

    2、添加窗体Form1,如图所示:

    \

    3、窗体Form1中的代码如下所示:

    首先,通过config读取配置文件,读取所有映射文件,加载程序集(必须是嵌入资源)
    其次,通过SessionFactory创建session工厂,负责持久化的连接以及OR映射(该对象的开销比较大,一般建议用单例模式实现)
    然后,通过session创建一个可以用于用户级别的操作对象。
    开启事务对象trans = session.BeginTransaction();

    上面的思路和我们曾经使用过的SQLServer是一个道理。接下来看一下不同点:

    以前D层和数据库打交道的时候,我们通常使用sql语句,而后直接对数据库进行操作。而在NH中所有的操作(增删改查)全都是针对“对象”而言的,如果想要把对象保存在数据库中,就需要先将对象必须转化为数据库能识别的sql语句,由于在SessionFactory中已经保存了所有的OR映射,ISession能根据相应的方言实现sql语句。

    下文的代码中已经实现了简单操作对象。主要是通过session的get、save、delete方法来实现。若要实现复杂的查询不免会比较繁琐。NHibernate提供了一种强大的查询语言HQL(Hibernate Query Language),它的语法非常类似于Sql,不同的是只能用于对数据进行查询操作,不能用于数据增、删、改。它是完全面向对象的,具备继承、多态和关联等特性。

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using NHibernate;
    using NHibernate.Cfg;
    using Test.Model;
    using System.Linq;
    
    namespace WinFormTest
    {
        public partial class Form1 : Form
        {
            //创建session
            ISession session = null;
            //创建session工厂
            ISessionFactory factory = null;
            //创建事务
            ITransaction trans = null;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
                //读取配置文件
                //读取所有映射文件,加载程序集,必须是嵌入资源
                Configuration config = new Configuration().AddAssembly("Test.Model");
                //创建session工厂,负责持久化的连接以及OR映射,该对象的开销比较大,一般建议用单例模式实现
                factory = config.BuildSessionFactory();
                //创建一个可以用于用户级别的操作对象
                session = factory.OpenSession();
    
            }
    
            //添加用户
            private void btnAdd_Click(object sender, EventArgs e)
            {
                //开启事务对象
                trans = session.BeginTransaction();
                //使用NHibernate现有API
                //体验过程
                try
                {
                    //对象的实例化方式
                    Person p = new Person();
                    p.Name = this.txtName.Text;
                    //把对象保存在数据库中
                    //将对象必须转化为数据库能识别的sql语句
                    //由于在SessionFactory中已经保存了所有的OR映射
                    //ISession能根据相应的方言实现sql语句
                    session.Save(p);
                    trans.Comm
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如何成为一名出色的Oracle数据库.. 下一篇极简AWR报告收集指导

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·HyperText Transfer (2025-12-26 07:20:48)
·半小时搞懂 HTTP、HT (2025-12-26 07:20:42)
·CPython是什么?PyPy (2025-12-26 06:50:09)
·Python|如何安装seab (2025-12-26 06:50:06)
·python要学习数据分 (2025-12-26 06:50:03)