以前有简单了解NHibernate,但因项目一直没有运用所以也没有机会进行一个详细了解;最近利用一点空闲的时间认真学习它;同样希望把学习过程进行简单记录,今天简单写一个针对MSSQL数据库的增删改查的小实例,作为进行学习NHibernate第一步

一:ORM理论

ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另一种形式。数据持久化:就是将内存中的 数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。在应用程序中能永久地保存各个处理状态信息的机制。如果没有持久化这个机制,状态只能保存在内存中,机器关机后就会丢失。

二:NHibernate简介

NHibernate就是用于做数据持久化相关的编程工作,能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现。NHibernate是由一个Java开源项目Hibernate发展来而来。与数据库打交道主要是用NHibernate,NHibernate的开发者尝试为其提供与Hibernate类似的API。使用前我们需要下载Nhibernate,

下载地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/。

NHibernate-3.3.3.GA-src.zip 是源文件,里面有源代码以及连接各种数据库的写法模板。

NHibernate-3.3.3.GA-bin.zip 是使用文件,解压后能直接使用的dll。在接下的实例中,使用的NHibernate-3.3.3GA版本

三:NHibernate实例

实例中解决方案简单的创建三层架构,符合开发过程中最简单的运用;

1:首先在数据库中创建一个表T_School,脚本如下:

USE [TestDb]
GO
/****** 对象: Table [dbo].[T_School] 脚本日期: 03/01/2014 19:45:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_School](
[ID] [uniqueidentifier] NOT NULL,
[SchoolName] [nvarchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[BuildDate] [datetime] NULL,
[Address] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[IsSenior] [bit] NULL,
[StudentNum] [int] NULL
) ON [PRIMARY]

2:创建实体层Model,实体中的字段还以virtual进行修饰

namespace Wujy.ModelLibrary.Entity
{
public class SchoolModel
{
/// <summary>
/// ID
/// </summary>
public virtual Guid ID
{
get;
set;
}
/// <summary>
/// SchoolName
/// </summary>
public virtual string SchoolName
{
get;
set;
}
/// <summary>
/// BuildDate
/// </summary>
public virtual DateTime? BuildDate
{
get;
set;
}
/// <summary>
/// Address
/// </summary>
public virtual string Address
{
get;
set;
}
/// <summary>
/// 高级
/// </summary>
public virtual bool IsSenior
{
get;
set;
}
/// <summary>
/// 人数
/// </summary>
public virtual int? StudentNum
{
get;
set;
}
}
}

2.1 此处还增加NHibernate需要的XML映射文件,以实体名+hbm.xml结尾并且还要设置其生成操作为"嵌入的资源";其中Class中的name是指实体类的完整名及类库名称,代码如下

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Maticsoft" namespace="Maticsoft">
<class name="Wujy.ModelLibrary.Entity.SchoolModel, Wujy.ModelLibrary" table="T_School">
<id name="ID" column="ID" type="Guid"></id>
<property name="SchoolName" column="SchoolName" type="string" />
<property name="BuildDate" column="BuildDate" type="DateTime" />
<property name="Address" column="Address" type="string" />
<property name="IsSenior" column="IsSenior" type="bool" />
<property name="StudentNum" column="StudentNum" type="int" />
</class>
</hibernate-mapping>

3:创建一个类库作为DAL层,此处我们引用NHibernate两个DLL,分别为NHibernate.dll及Iesi.Collection.dll;此处创建一个帮助类NHibernateHelper用于ISessionFactory;

using NHibernate;
using NHibernate.Cfg; namespace Wujy.DalLibrary.DalHelp
{
public class NHibernateHelper
{
private ISessionFactory _sessionFactory;
public NHibernateHelper()
{
_sessionFactory = GetSessionFactory();
}
private ISessionFactory GetSessionFactory()
{
return (new Configuration()).Configure().BuildSessionFactory();
}
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
}
}

3.1:创建类SchoolDal并把一些操作的代码写入,如查不用transaction.Commit()则要运和isession.Flush()否则无法执行SQL就没有效果:

using Wujy.ModelLibrary.Entity;
using NHibernate;
using Wujy.DalLibrary.DalHelp; namespace Wujy.DalLibrary
{
public class SchoolDal
{
private ISession isession; public SchoolDal()
{
isession = new NHibernateHelper().GetSession();
} public void Add(SchoolModel model)
{
//如查不用transaction.Commit()则要运和isession.Flush()否则无法执行SQL就没有效果
//ITransaction transaction = isession.BeginTransaction();
//isession.Save(model);
//transaction.Commit();
isession.Save(model);
isession.Flush();
} public bool Update(SchoolModel model)
{
try
{
isession.Update(model);
isession.Flush();
return true;
}
catch (Exception ex)
{
return false;
}
finally
{
isession.Close();
}
} public bool Delete(SchoolModel model)
{
try
{
isession.Delete(model);
isession.Flush();
return true;
}
catch (Exception ex)
{
return false;
}
finally
{
isession.Close();
}
} public SchoolModel GetSchoolById(Guid ID)
{
return isession.Get<SchoolModel>(ID);
} public IList<SchoolModel> GetSchoolList()
{
IList<SchoolModel> list = null;
list = isession.QueryOver<SchoolModel>().List();
return list;
}
}
}

4:因为本实例重点是对NHibernate运用,对于逻辑层就简单的引用;代码也很简单:

using Wujy.ModelLibrary.Entity;
using Wujy.DalLibrary; namespace Wujy.BllLibrary
{
public class SchoolBll
{
public static void Add(SchoolModel model)
{
new SchoolDal().Add(model);
} public static bool Update(SchoolModel model)
{
return new SchoolDal().Update(model);
} public static bool Delete(SchoolModel model)
{
return new SchoolDal().Delete(model);
} public static SchoolModel GetSchoolById(Guid ID)
{
return new SchoolDal().GetSchoolById(ID);
} public static IList<SchoolModel> GetSchoolList()
{
return new SchoolDal().GetSchoolList();
}
}
}

5:WebUI除简单调用BLL层外,另一个比较重要是NHibernate连接数据库的配置文件,其中其属性复制到输出目录改为"始终复制";Hibernate.cfg.xml内容:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="NHibernateConfig">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=localhost;uid=sa;password=admin;database=TestDb</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="command_timeout">10</property>
<mapping assembly="Wujy.ModelLibrary"/><!--表示映射Wujy.ModelLibrary实体程序集下的所有类,就不用一个个去映射-->
</session-factory>
</hibernate-configuration>

感谢您的阅读,坚持每天进步一点点,离成功就更新一步;希望文章对您有所帮助;源代码下载

转载至:http://www.cnblogs.com/wujy/p/3575542.html

NHibernate初学一之简单增删改查的更多相关文章

  1. ado.net的简单数据库操作(三)——简单增删改查的实际应用

    果然,在犯困的时候就该写写博客,写博客就不困了,哈哈! 上篇我记录了自己的SqlHelper的开发过程,今天记录一下如何使用这个sqlhelper书写一个具有简单增删改查的小实例啦. 实例描述:在数据 ...

  2. Redis:五种数据类型的简单增删改查

    Redis简单增删改查例子 例一:字符串的增删改查 #增加一个key为ay_key的值 127.0.0.1:6379> set ay_key "ay" OK #查询ay_ke ...

  3. 国产化之路-统信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 达梦DM8实现简单增删改查操作

    专题目录 国产化之路-统信UOS操作系统安装 国产化之路-国产操作系统安装.net core 3.1 sdk 国产化之路-安装WEB服务器 国产化之路-安装达梦DM8数据库 国产化之路-统信UOS + ...

  4. Mybatis实现简单增删改查

    Mybatis的简单应用 学习内容: 需求 环境准备 代码 总结: 学习内容: 需求 使用Mybatis实现简单增删改查(以下是在IDEA中实现的,其他开发工具中,代码一样) jar 包下载:http ...

  5. Android_ADB 常用 shell命令 和 sqlite3 简单增删改查

    今天学习了一个ADB的常用命令.接下来简单使用几个常用ADB shell 命令. 首先我们得明白什么是adb.exe ADB -Android Debug Bridge, 是 Android sdk ...

  6. MyBatis之二:简单增删改查

    这一篇在上一篇的基础上简单讲解如何进行增删改查操作. 一.在mybatis的配置文件conf.xml中注册xml与注解映射 <!-- 注册映射文件 --> <mappers> ...

  7. 基于springmvc的简单增删改查实现---中间使用到了bean validation

    package com.kite.controller; import java.util.HashMap; import java.util.Map; import javax.validation ...

  8. JDBC实现简单增删改查

    JDBC全称为:Java Data Base Connectivity (java数据库连接),主要用于java与数据库的链接. 整个链接过程如下图: 1.数据库驱动:Driver 加载mysql驱动 ...

  9. 【C#】使用NHibernate连接MySQL数据库及增删改查

    学习资料 http://www.sikiedu.com/course/51/task/891/show https://www.codeproject.com/Articles/26123/NHibe ...

随机推荐

  1. Spark RDD、DataFrame和DataSet的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   转载请标明出处:小帆的帆的专栏 RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类 ...

  2. 使用TortoiseGit操作分支的创建与合并功能集合

    使用TortoiseGit操作分支的创建与合并 本文在介绍了软件安装和设置后, 写了TortoiseGit 常用的一些功能, 包括: 创建新库 添加文件及文件夹 创建分支 看分支情况及修改log 比较 ...

  3. Spring Boot干货系列:(五)开发Web应用JSP篇

    Spring Boot干货系列:(五)开发Web应用JSP篇 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 上一篇介绍了Spring Boot中使用Thymeleaf模板引擎,今天 ...

  4. [转]解决 Eclipse项目红感叹号

    原文地址:http://www.cnblogs.com/hakuci/archive/2012/01/06/2314143.html 原因:显示红色感叹号是因为jar包的路径不对 解决:在项目上右击B ...

  5. 【算法】转载:Iterative vs. Recursive Approaches

    Iterative vs. Recursive Approaches Eyal Lantzman, 5 Nov 2007 CPOL             Introduction This arti ...

  6. java.io.PrintWriter 中 write() 与 print() 的区别

    最终都是重写了抽象类Writer里面的write方法print方法可以将各种类型的数据转换成字符串的形式输出.重载的write方法只能输出字符.字符数组.字符串等与字符相关的数据.

  7. C#与C++区别

    C#是三大主流OOP(面向对象编程)语言(C++,Java,C#)之一,也是最新的一种,其中必然借鉴了前两者的长处,“否则它的缔造者就该打屁股”——候捷语,见<C#Primer中文版>的译 ...

  8. 使用 FreeRTOS 时注意事项总结(基础篇教程完结)

    以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须 ...

  9. Winform 加密连接字符串“未能提供RsaProtectedConfigurationProvider加密,对象已存在”的解决方案

    当一台机器已安装软件,并有新用户需要使用此软件时提示“未能提供RsaProtectedConfigurationProvider加密,对象已存在”. 这是因为加密模式是用户模式,需要运行以下脚本添加新 ...

  10. openwrt使用list

    openwrt中用到双向无头链表,实际应用时应在外部定义实体链表头,后续可直接应用链表函数(宏定义已将链表头排除在外): static struct list_head timeouts = LIST ...