学习NHibernat for .NET笔记
虽没有大起大落,但人生还是有得失兼备,之所以要复活,一个原因是失比得要多,所以开始记录这复活的旅程。
既然是复活,那就不会从html开始,为了更好的将知识应用到实践,以一个项目开启复活之路,当然其中会关系到很多东西,比如:SQL、CSS、JS、ASP.NET等,但最重要的是应用了在以前从未使用过的NHibernat for .NET。相信都听说过或者是用过java中的SSH,以我粗糙的了解SSH与NHibernate来看,他们很相似。NHibernate是一个基于.net平台下的ORM,把对象模型与数据库中的表相对应,简单的说就是:一张表对应一个类,操作类的对象就相当于操作表中的一条数据;同时Nhibernate还提供了很多的方法、事务等工具,以便我们操作数据库。好吧,项目开始吧!
一、创建数据库
在这我使用的数据库是SQL2008,新建一个Demo的数据库,在其中新建一张USER表,代码如下:
create database Demo go use Demo go create table TUser( Id int identity(1,1) primary key,, UserName nvarchar(32), UserPwd nvarchar(32) ) select * from TUser
如图:
二、编写实体类与映射文件
在VS2010下新建一个项目,然后添加一个Domain的项目,新建一个Model,如下图:
在Model中新建一个实体类User,其代码如下:
class TUser { public TUser() { } public virtual int Id{get;set;} public virtual string UserName{get;set;} public virtual string UserPwd{get;set;} }
注意:实体类的的属性应使用virtual 来修饰,这个原因暂还未去研究,应与Nhibernate里的代理有关,先用了再说。
在上图中有一个XML文件,里面是专用来放映射文件的,新建一个xml文件,修改文件名为:TUser.hbm.xml,然后开始编写这个文件,代码如下:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain"
namespace="Domain.Model">
<class name="Domain.Model.TUser" table="TUser">
<!-- ID increment-->
<id name="Id" column="Id">
<generator class="native"></generator>
</id>
<!--S_LoginName -->
<property name="UserName" column="UserName" />
<!--S_LoginPwd -->
<property name="UserPwd" column="UserName" />
</class>
</hibernate-mapping>
注:这里要修改这个文件的属性,如下图:
三、使用Session来操作数据
在使用Nhibernate之前,得从网站上去下载,很可能打不开页面,所以你懂的。将下下不的文件中的下面二个拷到bin中
新建一个DAL的项目,添加到现在的解决方案中,DAL与Domain都应引用以上二个文件。在DAL中新建一个TUserDAL用于存放访问数据库的方法。TUSerDAL如下:
public class TUserDAL { private ISessionFactory _sessionFactory; private ISession _session; public TUserDAL(){ _sessionFactory =(new Configuration()).Configure().BuildSessionFactory(); _session = _sessionFactory.OpenSession(); } /// <summary> /// 创洹?建¨ /// </summary> /// <param name="client"></param> /// <returns></returns> public Boolean CreateUser(TUser client) { try { _session.Save(client); _session.Flush(); return true; } catch (Exception e1) { return false; } } /// <summary> /// 通过yusertId删?出?数簓据Y /// </summary> /// <param name="Id"></param> /// <returns></returns> public bool DeleteUser(int userId) { try { TUser temp = null; temp = _session.Get<TUser>(userId); _session.Delete(temp); return true; } catch (Exception e2) { return false; } } /// <summary> /// 通?过yuserId查é找ò信?息¢ /// </summary> /// <param name="userId"></param> /// <returns></returns> public TUser FindTUserInfo(int userId) { return _session.Get<TUser>(userId); } /// <summary> /// 获?得?所ù有瓺ClientInfo /// </summary> /// <returns></returns> public IList<TUser> GetAllUserInfo() { return _session.CreateQuery("from TUser").List<TUser>(); } /// <summary> /// 验é证¤用?户§名?与?密ü码? /// </summary> /// <param name="Name"></param> /// <param name="Pwd"></param> /// <returns></returns> public TUser ValidLoginNameAndPwd(string Name, string Pwd) { return _session.CreateQuery("from TUser as c where c.UserName=:fN and c.UserPwd=:fP").SetString("fN", Name).SetString("fP", Pwd).List<TUser>().FirstOrDefault(); } }
四、使用Ext.Net完成登录页面
Ext.Net一个第三方控件,我们也可以从官网上找到,然后下载,将下图中的文件拷到bin下面:
有一个hibernate.cfg.xml文件,是在下载Nhibernate中的,里面存放了数据库的连接信息。
新建一个aspx页面作为我们的登录页,我们使用EXT.NET完成这个页面,代友如下:
<div> <ext:Window ID="loginWin" runat="server" Title="CMS Login Page" Icon="Lock" Closable="false" InitCenter="true" AutoShow="true" Height="180" Draggable="false" Width="300" BodyStyle="padding-top:25px;"> <Items> <ext:TextField ID="LoginName" runat="server" EmptyText="please input your loginName" FieldLabel="用? 户§ 名?" LabelWidth="80" Width="250" LabelAlign="Right" Margins="margin-top:20px;" Height="30" AllowBlank="false"> </ext:TextField> <ext:TextField ID="LoginPwd" runat="server" EmptyText="please input your loginPwd" FieldLabel="密ü 码?" LabelWidth="80" Width="250" LabelAlign="Right" Margins="margin-top:10px;" InputType="Password" AllowBlank="false"> </ext:TextField> </Items> <Buttons> <ext:Button ID="submit" runat="server" Text="Login" Icon="Disk"> <DirectEvents> <Click OnEvent="LoginOnClick" Before="var info1=#{LoginName}.getValue();var info2=#{LoginPwd}.getValue();if(info1==''){Ext.Msg.alert('tips','用户名不能为空!');return false;}if(info2==''){Ext.Msg.alert('tips','密ü码不能为空!');return false;}"> <EventMask Msg="Login......" MinDelay="5" ShowMask="true" /> </Click> </DirectEvents> </ext:Button> </Buttons> </ext:Window> </div>
效果图如下:
五、总结
很久没有动手写东西,一开始是有点晕,当然对于哥来说才刚刚开始。对Nhibernate了解太少,但我更喜欢边做边学,这样才不用过于书本,我想这更容易复活。