通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD
网站架构:
1.图片

2.说明
Data ----------------------- 类库项目,数据访问层,由Nhibernate提供数据相关操作
Mapping ------------------- 类库项目,映射文件都在这个项目中
Model -------------------- 类型项目,实体层
XShop -------------------- Mvc项目,UI层
步骤:
1.安装Nhibernate
2.配置Nhibernate
3.创建实体类
4.编写映射文件
5.创建数据库/表
6.CURD操作
7.测试
第一步:安装Nhibernate,这一步就不用说了,使用Nuget安装,看图

第二步:配置Nhibernate
2.1 这一步主要是一些系统级的配置,如:连接字符串,数据库驱动,数据库方言等
2.2 创建 hibernate.cfg.xml文件(XShop项目中)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<!--Nhibernate对数据库操作是基于ISession(会话),可以理解为SqlConnection的封装,可通过SessionFactory创建-->
<session-factory name="XShop">
<!--连接提供程序-->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <!--连接字符串-->
<property name="connection.connection_string">
Server=.;initial catalog=XShopDb;Integrated Security=SSPI
</property> <!--Nhibernate是一个支持多个数据库的Orm框架,然而几乎每个数据库产品都对Sql的实现都有所不同-->
<!--Nhibernate通过dialect(方言)消除数据库之间的差异-->
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <!--是否在调试的时候打印Sql语句-->
<property name="show_sql">true</property> <!--映射文件所在的程序集-->
<mapping assembly="Mapping"/>
</session-factory>
</hibernate-configuration>
温馨提示:如果发现在编写xml文件的时候发现没有智能提示,请把Nhibernate包的xsd文件复制到Vs安装目录中(参考百度)
注意:Nhibernate配置文件的文件名必须为 hibernate.cfg.xml ,不可随意更改
第三步:创建实体类 Customer(Model项目)
3.1 代码
namespace Model
{
public class Customer
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string UserName { get; set; }
public virtual string Password { get; set; }
public virtual DateTime CreateTime { get; set; }
}
}注意:实体类的属性必须是virtual,否则Nhibernate会报错.why?因为这样Nhibernate就可以重写这些属性的访问逻辑,比如 延迟加载..
第四步:创建 Customer.hbm.xml 映射文件(Mapping项目)
4.1 代码:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" auto-import="true" default-cascade="all" default-lazy="true" namespace="Model">
<!--<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="实体类所在的程序集" auto-import="是否自动导入命名空间,如果否,下面类名应该写类的全名"
default-cascade="默认的级联操作" default-lazy="是否延迟加载" namespace="实体类所在的命名空间">--> <!--<class name="类型名/类型全名" table="对应的表名" >-->
<class name="Customer" table="Customer" > <!--id是必须的-->
<!--<id name="Id的属性名" column="列名" type="数据类型" unsaved-value="未被持久化到数据库时,id的值" generator="id的生成策略"></id>-->
<id name="Id" column="CustomerId" type="int" unsaved-value="0" generator="native"></id> <!--<property name="属性名" column="对应的列名" length="长度" type="数据类型" not-null="是否不可空"></property>-->
<property name="Name" column="Name" length="20" type="string" not-null="true"></property>
<property name="UserName">
<column name="UserName" sql-type="nvarchar" not-null="true" length="20"></column>
</property> <property name="Password" length="32" column="Password" not-null="true" type="string"></property>
<property name="CreateTime" column="CreateTime" type="datetime" not-null="true"></property>
</class>
</hibernate-mapping>
注意:
1.映射文件命名规则: 类名.hbm.xml ,不可随意更改
2.映射文件的生成策略必须为:嵌入到程序集
第五步:创建数据库和表
5.1 创建数据库
CREATE DATABASE XShopDb
GO5.2 创建表
5.2.1创建表的两种方式--手动创建
注意:创建的表结构应该与映射文件一样
5.2.1创建表的两种方式--使用SchemaExport生成的Sql
代码:可以创建一个控制台项目或Winform项目跑下面这段代码
NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration().Configure();
NHibernate.Tool.hbm2ddl.SchemaExport schemaExport = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration);
//打印Sql脚本,但不执行
schemaExport.Create(true, false); //导出到文件
//schemaExport.SetOutputFile(@"c:/schma.sql");结果:
第六步:CURD操作(Data项目)
6.1 上面我们提过,所有数据库操作都是通过ISession对象操作,而ISession可以通过ISessionFactory创建
-----创建HbmHelper类--获取ISessionFactory
namespace Data
{
public class HbmHelper
{
private static ISessionFactory _sessionFactory;
public static ISessionFactory CurrentSessionFactory
{
get
{
if (_sessionFactory == null)
{
//创建SessionFactory
_sessionFactory = new Configuration().Configure().BuildSessionFactory();
}
return _sessionFactory;
}
}
}
}-------从ISessionFactory中创建session
private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();------添加数据访问基类 BaseDal<T>
namespace Data
{
/// <summary>
/// 数据访问基类
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseDal<T> where T : class
{
//从ISessionFactory中创建session
private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession(); #region ------------------ CURD ----------------
/// <summary>
/// 添加数据
/// </summary>
/// <param name="model"></param>
public int Insert(T model)
{ int id=(int) _session.Save(model);
_session.Flush();
return id; } /// <summary>
/// 更新
/// </summary>
/// <param name="model"></param>
public void Update(T model)
{
//使用事务
using (ITransaction ts = _session.BeginTransaction())
{
try
{
_session.Update(model);
_session.Flush();
ts.Commit();
}
catch (Exception)
{
ts.Rollback();
throw;
}
}
} /// <summary>
/// 删除
/// </summary>
/// <param name="model"></param>
public void Delete(T model)
{
_session.Delete(model);
_session.Flush();
} /// <summary>
/// 查询
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public T Query(int id)
{
return _session.Get<T>(id);
} #endregion
}
}
第七步:添加数据,测试
7.1 添加数据
7.2 创建单元测试项目,添加测试类:
namespace DataTest
{
[TestClass]
public class BaseDalTest
{
private BaseDal<Customer> _customerDal = new BaseDal<Customer>(); [TestMethod]
public void GetTest()
{
var result = _customerDal.Query();
Assert.AreEqual(result.Name, "张小军");
} [TestMethod]
public void InsertTest()
{
Customer customer = new Customer()
{
Name = "张三",
Password = "",
UserName = "zhs"
}; int id = _customerDal.Insert(customer); var result = _customerDal.Query(id);
Assert.AreEqual(customer.UserName, result.UserName); } [TestMethod]
public void UpdateTest()
{
var result = _customerDal.Query();
result.Name = "王五";
_customerDal.Update(result);
var r2 = _customerDal.Query();
Assert.AreEqual(result.Name,r2.Name);
} [TestMethod]
public void DelTest()
{
var result = _customerDal.Query();
_customerDal.Delete(result);
var r2 = _customerDal.Query();
Assert.IsNotNull(r2);
}
}
}
原创文章,转载请注明出处:http://www.cnblogs.com/zhxj/
2015.08.22 --张小军
通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD的更多相关文章
- 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置
在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置 ----- 这一步我们告诉了Nhibernate:数据库 ...
- NHibernate教程
NHibernate教程 一.NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦.浪费时间的.NHibernate是一个面向.Net环境的对象/关系数据库 ...
- NHibernate教程(9)一1对n关联映射
本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...
- NHibernate初入门之映射文件配置说明(三)
转载逆心http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...
- NHibernate教程(21)——二级缓存(下)
本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...
- NHibernate教程(20)——二级缓存(上)
本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...
- NHibernate教程(18)--对象状态
本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...
- NHibernate教程(14)--使用视图
本节内容 引入 1.持久化类 2.映射文件 3.测试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习如何在NHibernate中使用 ...
- NHibernate教程(13)--立即加载
本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...
随机推荐
- 关于jquery中attr和prop的用法
在项目开发中,遇到过这个情况,做一个全选的功能,通过点击一个checkbox实现下面的checkbox全选,用attr设置的checked属性,只可以生效一次,再次点击就不起作用了,但确实触发了事件, ...
- MyEclipse 8.5 启动过程优化
前言:MyEclipse5.5 大小 139M:MyEclipse6.5 大小 451M:MyEclipse7.0 大小 649M:MyEclipse8.0 大小 772.3MB(速度方面比7.1和7 ...
- Hive JOIN的基本操作 及 内部实现
1.HIVE基本操作: [一起学Hive]之十一-Hive中Join的类型和用法 注:HIve不支持非等值连接: 什么是等值连接: //Oracle SQL 不等值连接 //通过不等值连接查找7788 ...
- NEU 1683: H-Index
题目描述 Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...
- (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...
- linux设备驱动学习笔记(1)
学习了将近半个月的设备驱动程序的编写,也有一些体会,这里写下来也给学习做一个总结,为后面的学习做更好的准备. 首先,个人感觉驱动程序的设计是很有套路的,最基本的要求就是要掌握这些套路.所谓的套路就是一 ...
- Silverlight中使用MVVM(2)
Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 ...
- 666 专题三 KMP & 扩展KMP & Manacher
KMP: Problem A.Number Sequence d.求子串首次出现在主串中的位置 s. c. #include<iostream> #include<stdio.h&g ...
- asp.net微软图表控件MsChart
前段时间,开发项目时,由于需要,需要将一些数据统计,并以图表形式显示.由于是asp.net,所以就找到了MsChart图表控件,还是挺方便实用的,分享一下. MsChart控件的主要组成如图所示 工具 ...
- OpenMediaVault Redmine 安装
/******************************************************************** * OpenMediaVault Redmine 安装 * ...

