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技术还有很多其它的魅力等着我们去挖掘,而我们接触到的仅仅是冰山一角。