网站架构:

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
GO

5.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://files.cnblogs.com/files/zhxj/XShop0822.zip

原创文章,转载请注明出处:http://www.cnblogs.com/zhxj/

2015.08.22 --张小军

通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD的更多相关文章

  1. 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置

    在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置  ----- 这一步我们告诉了Nhibernate:数据库 ...

  2. NHibernate教程

    NHibernate教程 一.NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦.浪费时间的.NHibernate是一个面向.Net环境的对象/关系数据库 ...

  3. NHibernate教程(9)一1对n关联映射

    本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...

  4. NHibernate初入门之映射文件配置说明(三)

    转载逆心http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...

  5. NHibernate教程(21)——二级缓存(下)

    本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...

  6. NHibernate教程(20)——二级缓存(上)

    本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...

  7. NHibernate教程(18)--对象状态

    本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...

  8. NHibernate教程(14)--使用视图

    本节内容 引入 1.持久化类 2.映射文件 3.测试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习如何在NHibernate中使用 ...

  9. NHibernate教程(13)--立即加载

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...

随机推荐

  1. (27) java web的struts2框架的使用-基于表单的多文件上传

    和单个文件上传配置都是一样的,只是在action中接受参数时候,接受的是数组,不再是单个的文件. 一,action的实现: public class MutableFilesUpload extend ...

  2. HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题

    题目链接:https://vjudge.net/problem/HUST-1017 1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 7673 次提交 3898 次 ...

  3. YTU 2455: Pefect 数字

    2455: Pefect 数字 时间限制: 1 Sec  内存限制: 128 MB 提交: 749  解决: 146 题目描述 小明和小林做数字游戏,他们的游戏规则如下: 小明说出一个数字n,小林说出 ...

  4. 在织梦dedecms中实现“文章标题-栏目名称-网站名”导航

    本文介绍了在dedecms中,实现文章标题-栏目名称-网站名 导航的方法,有需要的朋友参考下. 在dedecms中实现“文章标题-栏目名称-网站名”导航的方法.   第一种: 在/include/in ...

  5. I.MX6 Android /data 目录内容

    /**************************************************************************** * I.MX6 Android /data ...

  6. 奶牛排序——RMQ

    [问题描述]奶牛在熊大妈的带领下排成了一条直队.显然,不同的奶牛身高不一定相同……现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛 A 是最矮的,最右边的 B 是最高的,且 B 高于 A ...

  7. poj1830开关问题——异或高斯消元

    题目:http://poj.org/problem?id=1830 根据题意,构造出n元方程组: a(1,1)x1 ^ a(1,2)x2 ^ a(1,3)x3 ... a(1,n)xn = st1 ^ ...

  8. NSCoding

    在IOS的开发中,小数据量的持久化都用NSUserDefaults来实现,但是NSUserDefaults只能保存NSString, NSNumber, NSDate, NSArray, NSDict ...

  9. Task用法

    转: https://www.cnblogs.com/wyy1234/p/9172467.html

  10. finalize方法的作用

            finalize是在对象回收前做一些清扫工作,以及可清理栈上的内存,比如调用本地方法可能在栈上创建对象.即使对象不可达,也并不是非死不可,还是可以抢救一下,当一个对象没有与GCroot ...