通俗易懂的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中代理模式 ...
随机推荐
- Android Studio解决导入项目非常慢
Android Studio比Eclipse ADT有巨大的优势.Android Studio原生支持使用Gradle来构建项目,使用动态语言Groovy定义项目构建的过程,避免了build.xml文 ...
- C# List Find方法
https://blog.csdn.net/knqiufan/article/details/77847143
- locate和grep命令
这任然是一篇读书笔记,以下内容来源<linux命令速查手册>这本书. 1.locate命令 用文件名或者文件名的部分来搜索文件在系统中的位置.locate不搜索具体目录,而是搜索一个数据库 ...
- Hadoop 文件压缩
一.目的 a. 减小磁盘占用 b. 加速网络IO 二.几个常用压缩算法 是否可切分:是指压缩后的文件能否支持在任意位置往后读取数据. 各种压缩格式特点: 压缩算法都需要权衡 空间/时间 :压缩率越高, ...
- umask文件屏蔽字的使用【学习笔记】
#include "apue.h" #include <fcntl.h> #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP ...
- Opencv中视频播放与进度控制
视频画面本质上是由一帧一帧的连续图像组成的,播放视频其实就是在播放窗口把一系列连续图像按一定的时间间隔一幅幅贴上去实现的. 人眼在连续图像的刷新最少达到每秒24帧的时候,就分辨不出来图像间的闪动了,使 ...
- I.MX6 Android busybox 从哪里生成的
/**************************************************************************** * I.MX6 Android busybo ...
- Dijkstra再理解+最短路计数
众所周知,Dijkstra算法是跑单源最短路的一种优秀算法,不过他的缺点在于难以处理负权边. 但是由于在今年的NOI赛场上SPFA那啥了(嗯就是那啥了),所以我们还是好好研究一下Dij的原理和它的优化 ...
- UVa 1644 Prime Gap (水题,暴力)
题意:给定一个数 n,求它后一个素数和前一个素数差. 析:先打表,再二分查找. 代码如下: #pragma comment(linker, "/STACK:1024000000,102400 ...
- Not enough free disk space on disk '/boot'(转载)
转自:http://m.oschina.net/blog/277224 # 解决 出现此情况是因为你的boot分区是单独分区的,像我只给了100M,以前装ubuntu时没有出现,所以当出现这个提示时, ...