通俗易懂的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中代理模式 ...
随机推荐
- Codeforces Round #346 (Div. 2) E. New Reform
E. New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- vue中如何实现后台管理系统的权限控制
vuejs单页应用的权限管理实践 一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单 ...
- vue 数组和对象渲染问题
vue 数组和对象渲染问题 最近项目有点忙碌,遇到好多问题都没有总结(╥﹏╥),在开发过程中,取vuex中的数组渲染完成之后,再次修改数组的值,数据更新了,但是视图并没有更新.以为是数组更新的问题,后 ...
- OpenSSL生成CA证书及终端用户证书
环境 OpenSSL 1.0.2k FireFox 60.0 64位 Chrome 66.0.3359.181 (正式版本)(32位) Internet Explorer 11.2248.14393. ...
- sublime text3 3176激活
更改hosts sudo vim /etc/hosts 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com 输入激活码 ---- ...
- 自己封装的Ajax - JavaScript
1. [代码][JavaScript]代码 //javascript Object: ajax Object//Created By RexLeefunction Ajax(url,data ...
- windows下编译调试nginx
typora-copy-images-to: image windows下编译调试nginx linux使用gdb跟踪代码效率不高,在通过跟踪代码进行源码分析,与定位复杂逻辑问题时,如果有一个简单易用 ...
- Mixing Milk
链接 分析:水题,按照价格从小到大排序,在进行贪心即可 /* PROB:milk ID:wanghan LANG:C++ */ #include "iostream" #inclu ...
- 【Codeforces 582A】 GCD Table
[题目链接] 点击打开链接 [算法] G中最大的数一定也是a中最大的数. G中次大的数一定也是a中次大的数. 第三.第四可能是由最大和次大的gcd产生的 那么就不难想到下面的算法: ...
- Spring中Bean获取IOC容器服务的方法
Spring 依赖注入可以让所有的Bean对其IOC容器的存在是没有意识的,甚至可以将容器换成其它的.但实际开发中如果某个Bean对象要用到Spring 容器本身的功能资源,需要意识到IOC容器的存在 ...

