NHibernate框架魅力美
Nhibernate属于ORM框架之中的一个,在了解NHibernate之前我们先来了解什么是ORM?
ORM框架是为了将类对象和关系建立映射。事实上说白了,就是通过一个 Mapping将我们的实体类和数据库映射起来,建立了联系,相当于是在应用程序和数据库之间加了一个中间层。这样我们在程序中,仅仅须要直接操作对象,而不用关心数据库中的表、列和字段什么的。
这就好比我们吃饭,假设我们选择自己在家吃饭,我们就须要去油盐米菜,自己炒,炒完之后自己收拾。可是假设我们选择下馆子的话,我们仅仅须要去那点菜吃饭,拍拍屁股走人就OK了。详细这菜怎么做,做的好不好吃咱们管不着。这两种方式,在家吃相当于是未使用ORM的传统操作。什么操作都须要我们去了解关心。而饭馆就相当于是ORM框架映射,为我们处理了各种繁杂的操作,仅仅须要把最重要的环节即吃饭交给我们做即可。点菜就相当于是ORM配置,你仅仅须要告诉服务员你吃什么,她就会依据你的须要去配菜准备,菜好之后送上来即可。
以往我们写的程序,在D层中编写了各种SQL语句,并且有非常多近似通用的模式。写一条SQL(增删改查)语句,然后将sql,Command对象,參数保存起来,然后运行SqlCommand对象。对于每一个对象,我们都须要反复这些代码。怎样避免反复呢,Mapping会帮我们解决,它将SQL语句都封装好了,我们仅仅须要配置一下就能够,不用我们自己写D层代码,Mapping负责保存、删除和读取对象。
NHibernate充分发扬了ORM框架的核心理论,其来源于java的Hiberanate技术。通过XML配置来建立对象和关系的映射。为什么我们须要这些映射呢?NHibernate这么做有什么优点?
优点:首先,NHibernate使用时仅仅须要操作对象,摒弃了以往以数据库为中心的思想,属于全然的面向对象;其次,有较好的移植性,支持多种数据库,须要更换数据库或表,仅仅须要改动配置文件,灵活性大大增强。最后,提供了一个持久化的类,即仅仅是临时存储在Session中,数据永久保存在数据库。
NHibernate实现详细步骤:
1.建立实体对象(UserInfo)
<pre name="code" class="csharp"> public class UserInfo
{
public virtual int userId{ get; set; }
public virtual string userName{ get; set; }
public virtual string userPwd{ get; set; }
}
2.创建与对象类相关的映射文件UserInfo.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHModel" namespace="NHModel.Entities"> <class name="UserInfo" table="UserInfo"> //类名和表名映射
<id name="userId" type="Int32" unsaved-value="null">
<column name="userId" length="4" sql-type="int" not-null="true" unique="true" index="PK_UserInfo"/>
<generator class="native" />
</id>
<property name="userName" type="String">
<column name="userName" length="50" sql-type="nvarchar" not-null="false"/>
</property>
<property name="userPwd" type="Int32">
<column name="userPwd" length="4" sql-type="int" not-null="false"/>
</property>
</class>
</hibernate-mapping>
3.创建整合配置文件:hibernate.cfg.xml
<pre name="code" class="html"> <?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="hbm2ddl.keywords">none</property> //这句一定要有
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">NHibernate.Driver.Sql2008ClientDriver</property>
<property name="query.substitutions">hqlFunction=SQLFUNC</property>
<property name="connection.connection_string">
server=localhost;database=nhibernatesample;uid=sa;pwd=123456 //配置自己的数据库连接
</property>
<property name="show_sql">false</property> //是否显示SQL语句
<mapping assembly="TestNH" />
</session-factory>
</hibernate-configuration>
4.实现加入用户測试
<pre name="code" class="csharp">private void btnAdd_Click(object sender, EventArgs e)
{
Configuration cfg = new Configuration().Configure("hibernate.cfg.xml");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
UserInfo userInfo = new UserInfo();
userInfo.userId = 1;
userInfo.userName = "NH";
userInfo.userPwd = "abc";
session.Save(userInfo); // 运行用户加入操作
transaction.Commit(); // 运行事务
session.Close(); //关闭事务
MessageBox.Show("用户加入OK!");
}
总结:Nhibernate使我们摆脱了反复枯燥的编写SQL语句。自己主动产生SQL语句,能够让我们投入到业务逻辑的实现上。.Net技术还有很多其它的魅力等着我们去挖掘,而我们接触到的仅仅是冰山一角。
NHibernate框架魅力美的更多相关文章
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- Nhibernate的Session管理
参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...
- ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...
- "NHibernate.Exceptions.GenericADOException: could not load an entity" 解决方案
今天,测试一个项目的时候,抛出了这个莫名其妙的异常,然后就开始了一天的调试之旅... 花了很长时间,没有从代码找出任何问题... 那么到底哪里出问题呢? 根据下面那段长长的错误日志: -- ::, ...
- nhibernate连接11g数据库
我框架的数据映射用 nhibernate连接多数据库,这次又增加了oracle11g,负责开发的同事始终连接不上,悲催的sharepoint调试是在不方便... 下面描述下问题的解决,细节问题有3个: ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- 跟我学习NHibernate (1)
引言:Nibernate概述 NHibernate是一个ORM框架,NHibernate是一个把C#对象世界和关系世界数据库之间联系起来的一座桥梁.NHibernate 能自动映射实体模型到数据库,所 ...
- 让OData和NHibernate结合进行动态查询
OData是一个非常灵活的RESTful API,如果要做出强大的查询API,那么OData就强烈推荐了.http://www.odata.org/ OData的特点就是可以根据传入参数动态生成Ent ...
- MVC Nhibernate 示例
首先,非常感谢提出问题的朋友们,使得本人又去深入研究了NHibernate的<Session-Per-Request 模式>. 前言: 谈到NHibernate大伙并不陌生,搞Java ...
随机推荐
- Uva562(dp)
给我们n个硬币 每个硬币都有它的面值,要我我们分为两堆硬币,使得硬币的差值最小 我们可以dp计算出所有的差值,然后从小到大枚举差值,如果差值存在,就输出 dp[i][j] 表示对于前i件物品能达到差值 ...
- python战斗2:看到一个页面编码
编程环境:虚拟linux (windows 下 cygwin) 识别网页编码. usage: python coding http://www.***.com 測试结果: watermark/2/te ...
- C++第11周(春)项目1 - 存储班长信息的学生类
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目1 - 存储班长信息的学生类] clas ...
- [置顶] android系统如何在静音模式下关闭camera拍照声音(2)
之前写过一篇“android系统如何在静音模式下关闭camera拍照声音”的博客,今天来写他的续篇,继续探讨这个问题. 公司新需求,要求在camera应用中添加一个开关,可以进行拍照声音的关闭和开启. ...
- js日期天数差
var s1 = "2007-01-01"; var s2 = "2007-12-31"; s1 = s1.replace(/-/g, "/" ...
- cocos2d-x学习过程中的疑问
1.一个Scene中不同的层或者有几层Layer是在什么时候设置的? 2.helloWord中init()函数是有谁来调用的? 答:HelloWorld的init函数是在create函数调用后才会调用 ...
- Echache整合Spring缓存实例讲解(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCac ...
- ASIHTTPRequest 对GET POST 请求简包
1.ASIHTTPRequest一个简短的引论 github下载链接https://github.com/pokeb/asi-http-request 2.ASIHTTPRequest 对GET和PO ...
- 【Java GUI】Java GUI基金会
AWT和Swing Swing是个AWT改进和扩展. 书写GUI规划.Swing和AWT曾效力.他们共存 Java基础类(JFC)于. 虽然AWT和Swing都提供了构造图形界面元素的类.但它们的虫药 ...
- SQL Server 版本号汇总
通过SSMS连接Sql servr,查看实例的版本就能知道当前SQL Server的版本号了. RTM (no SP) SP1 SP2 SP3 SP4 SQL Server 2014 c ...