网站架构:

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. JSP 使用 JDBC连接SQL Server

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. id、NSObject *、id<NSObject>、instancetype

    1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的 ...

  3. 修改u-boot的开机logo及显示过程【转】

    本文转载自;http://blog.csdn.net/voice_shen/article/details/6789424 [ u-boot: Git://git.denx.de/u-boot.git ...

  4. bzoj2436: [Noi2011]Noi嘉年华

    我震惊了,我好菜,我是不是该退役(苦逼) 可以先看看代码里的注释 首先我们先考虑一下第一问好了真做起来也就这个能想想了 那么离散化时间是肯定的,看一手范围猜出是二维DP,那对于两个会场,一个放自变量, ...

  5. codeforces 505C C. Mr. Kitayuta, the Treasure Hunter(dp)

    题目链接: C. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 me ...

  6. fastText入门

    简介fastText是Facebook AI Research在2016年提出的文本分类和词训练的工具.它最大的特点:模型非常简单,训练速度快,并且能够达到与深度学习旗鼓相当的精度. 最近在做一个给微 ...

  7. 超实用的JavaScript技巧及最佳实践给

    1.数组创建一个随机项 var items = [12,548,'a',2,5478,'foo',8852,,'Doe',2145,119]; var randomItem = items[Math. ...

  8. Java调用未被Static修饰的本类方法

    public class Dy { public static void main(String[] args){ int a=6; int b=5; int result=0; Dy dy=new ...

  9. linux基于流的文件操作

    1 打开流的函数 FIEL * fopen(const char * restrict pathname,const char* restrict type) FILE *fdopen(int fil ...

  10. html5盒子模型

    相关博客: Flex 布局教程:语法篇:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html Flex 布局教程:实例篇:http://ww ...