Nhibernate入门与demo
本篇文章阅读对象是:Nhibernate初学者!如果你是Nhibernate的研究者或者已经很熟练的运用Nhibernate请不吝赐教,对本文不足之处进行指教。
带着问题去学习!学完这些后,希望你能回答下面几个问题:
1、Nhibernate是什么?
2、Nhibernate能做什么?带给我们的什么?
3、怎么搭建Nhibernate?
4、怎么使用Nhibernate?
好,我们就带着这几个问题开始我们的Nhibernate的旅程。
第一个问题:
要明白Nhibernate是什么,就要首先明白什么是ORM。
先看一张经典的图:
ORM:对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去。通俗讲,就是我们操作实体类,然后让ORM框架自动映射到数据库中。
而Nhibernate就是:.Net环境下实现ORM的技术的一个框架!
第二个问题:
Nhibernate能做什么呢?
看下面代码:
User myUser = new User();
//User初始化........
session.Save(myUser);//保存一个用户
session.Update(myUser);//更新用户
session.Delete(myUser);//删除用户
User user = session.Get<User>(Id) as User;//根据主键获取用户的 用户实例
session哇!这么牛,不用写一句sql session就帮你把所有的活都干了!那session设计肯定很难吧?告诉你吧,session是我们只需要一个配置文件就可以随处调用了。这么神奇?
Nhibernate带给我们的就是:对于开发者通常的数据持久化相关的编程任务,解放其中的95%!
第三个问题:
这是本文的关键,是怎么搭建呢?
先看项目整体图,作为初学的demo 没有层次,没有优化,只是作为入门的一个简单介绍!
第一步:设计数据库中的表。建立一个User表。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CREATE TABLE Hksj_User ( Id INT IDENTITY(1,1) NOT NULL , --id主键 SName NVARCHAR(20) NOT NULL , --用户名 SNickName NVARCHAR(20), --真实姓名 SPassWord NVARCHAR(30) NOT NULL , --密码 DCreateDate DATETIME , --创建 日期 SCreator NVARCHAR(20), --创建人 SEmail NVARCHAR(50), --Email SPhone NVARCHAR(50), --电话 SIdentifyId NVARCHAR(30), --身份证 DLastTimeLogOn DATETIME --上次登录日期 PRIMARY KEY CLUSTERED ( Id ASC ) WITH (IGNORE_DUP_KEY = OFF ) ON [ PRIMARY ] ) ON [ PRIMARY ] END |
第二步:设计User类。 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyWeb.WebTemp.Model { public class User { /// <summary> /// 用户id /// </summary> public Int32 Id { get; set; } /// <summary> /// 用户名,登录所用的名字 /// </summary> public string Name { get; set; } /// <summary> /// 真实姓名 /// </summary> public string NickName { get; set; } /// <summary> /// 密码 /// </summary> public string PassWord { get; set; } /// <summary> /// 创建日期 /// </summary> public DateTime CreateTime { get; set; } /// <summary> /// 创建人 /// </summary> public string Creator { get; set; } /// <summary> /// Email /// </summary> public string Email { get; set; } /// <summary> /// 联系电话 /// </summary> public string Phone { get; set; } /// <summary> /// 身份证 /// </summary> public string IdentifyId { get; set; } /// <summary> /// 最后一次登录时间 /// </summary> public DateTime LastTimeLogOn { get; set; } } } |
第三步:创建User类的映射文件 命名规则:User.hbm.xml 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <? xml version = "1.0" encoding = "utf-8" ?> < hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2" > < class name = "MyWeb.WebTemp.Model.User,MyWeb.WebTemp.Model" table = "Hksj_User" lazy = "false" > < id name = "Id" column = "Id" type = "Int32" > < generator class = "native" /> </ id > < property name = "Name" column = "SName" type = "String" length = "20" /> < property name = "NickName" column = "SNickName" type = "String" length = "20" /> < property name = "PassWord" column = "SPassWord" type = "String" length = "30" /> < property name = "IdentifyId" column = "SIdentifyId" type = "String" length = "30" /> < property name = "Phone" column = "SPhone" type = "String" length = "50" /> < property name = "Email" column = "SEmail" type = "String" length = "50" /> < property name = "CreateTime" column = "DCreateDate" type = "DateTime" /> < property name = "Creator" column = "SCreator" type = "String" length = "20" /> < property name = "LastTimeLogOn" column = "DLastTimeLogOn" type = "DateTime" /> </ class > </ hibernate-mapping > |
简单解释一下:
1、<property name="Email" column="SEmail" type="String" length="50" /> 意思: property name指的是:User类的属性名字 Email对应数据库的列SEmail 类型是String,长度50个字符。
2、<class name="MyWeb.WebTemp.Model.User,MyWeb.WebTemp.Model" table="Hksj_User" lazy="false">
这个是配置类的全名称,以及所属的程序集。然后对应数据库的表名。设置延迟加载为false。具体可以参考Nhibernate官方文档。
第四步:创建Nhibernate的配置文件:Nhibernate.cfg.xml 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <? xml version = "1.0" encoding = "utf-8" ?> < hibernate-configuration xmlns = "urn:nhibernate-configuration-2.2" > < session-factory > <!-- properties --> < property name = "connection.provider" >NHibernate.Connection.DriverConnectionProvider</ property > < property name = "connection.driver_class" >NHibernate.Driver.SqlClientDriver</ property > < property name = "connection.connection_string" >server=.;uid=sa;pwd=123;database=HkTemp;</ property > < property name = "dialect" >NHibernate.Dialect.MsSql2005Dialect</ property > < property name = "show_sql" >true </ property > < property name = "use_outer_join" >true</ property > < property name = "query.substitutions" >true 1, false 0, yes 'Y', no 'N'</ property > <!-- 代理工厂,可以试用Castle,也可以试用LinFu --> <!-- <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>--> < property name = 'proxyfactory.factory_class' >NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</ property > <!-- mapping files 领域对象映射文件所在程序集 --> < mapping assembly = "NhibernateDemo" /> </ session-factory > </ hibernate-configuration > |
解释:<property name="connection.connection_string">server=.;uid=sa;pwd=123;database=HkTemp;</property>是配置数据库连接字符串。
其他的都是Nhibernate最重要的数据库provider,sessionfactory等。不详细说。看官方文档!
第四个问题:
使用和测试你的配置【可以爽一把了!】
在Default.aspx 代码文件中添加如下代码
1 2 3 4 5 6 7 8 | Configuration cfg = new Configuration(); cfg.Configure(Server.MapPath( "~" ) + "Nhibernate.cfg.xml" ); ISessionFactory _SessionFactory = cfg.BuildSessionFactory();//建立Session工厂 ISession session = _SessionFactory.OpenSession();//打开Session MyWeb.WebTemp.Model.User myUser = new User {IdentifyId= "122222" ,Email= "22222" ,CreateTime=DateTime.Now, LastTimeLogOn = DateTime.Now, Name= "ml" ,NickName= "malun" ,PassWord= "123" ,Phone= "nihao" }; session.Save(myUser); session.Flush(); session.Delete(User); |
查看数据库中,有没有一条数据保存了?
Nhibernate做的不只是这些!搭载Spring.Net Nhibernate能做的更多!而且代码会更加优美!
源码下载:NhibernateDemo.zip