前言:本人自學NHibernate+asp.net mvc+JQuery實現了一個簡單的用戶的增刪改查的功能,現在做一個小的整理,希望和我一樣正在自學這幾個技術的人能夠共同參考,共同進步,下面我將分為好幾步做為項目的講解。也是為了我能夠更加的熟悉項目的編寫。
1. 第一步:建立數據庫
(1) 打開數據庫SQL Server 2005,新建一個數據庫NHibernate,然后再此數據庫中新建一張表,起名為:Users,用來存放我們錄入的數據,表的建立樣式如下圖所示:
2. 第二步:建立項目,映射數據庫
(1) 打開Visual Studio 2010集成開發環境,在Visual Studio 2010中建立一個ASP.MVC 2.0的項目,將會生成微軟封裝好的自帶的MVC的整個架構文件,然后再整個項目下面新建一個類庫COM.Entities,然后在這個類庫下面新建一個User類,一個User.hbm.xml的XML文件用於映射表對應的類的表文件。然后再類和XML文件中使用NHibernate實現數據庫的映射。
1) Users類的作用是定義數據庫中的字段屬性,代碼如下:
//定義數據庫中的字段屬性
public class Users
{
public virtual string LogonId { get; set; }
public virtual string Name { get; set; }
public virtual string Password { get; set; }
public virtual string EmailAddress { get; set; }
public virtual DateTime LastLogon { get; set; }
}
2) User.hbm.xml文件的作用是映射剛才定義的字段的屬性,代碼如下:
<?xmlversion="1.0"encoding="utf-8" ?>
<hibernate-mappingxmlns="urn:nhibernate-mapping-2.2">
<classname="COM.Entities.Users, COM.Entities"table="users"lazy="false">
<idname="LogonId"column="LogonId"type="String(20)">
<generatorclass="assigned" />
</id>
<propertyname="Name"column="Name"type="String(40)"/>
<propertyname="Password"type="String(20)"/>
<propertyname="EmailAddress"type="String(40)"/>
<propertyname="LastLogon"type="DateTime"/>
</class>
</hibernate-mapping>
注:解說這段代碼的內容
1) <hibernate-mappingxmlns="urn:nhibernate-mapping-2.2">這段代碼就是使用NHibernate必須有的代碼,定義了NHibernate的版本信息。
2) <classname="COM.Entities.Users, COM.Entities"table="users"lazy="false">,name定義了所要映射的類,table定義了要映射的數據庫中的表,lazy定義了是否要延遲加載,如果是默認值的話lazy=”true”,是延遲加載,這樣的話需要在定義的類字段中加入Virtual,而lazy=”true”則不用延遲加載,立即執行。並且類字段中可寫可不寫。
3) <idname="LogonId"column="LogonId"type="String(20)">
<generatorclass="assigned" />
</id>
這段代碼的作用是被映射的類必須定義對應數據庫的表主鍵字段,name標識屬性的名字,Type標識Hibernate類型的名字,column標識主鍵的名字,這三個屬性都是可選的,
可選的generator子元素是一個Java類的名字,用來為該持久化類的實例生成唯一的標識,如果這個生成器實例需要某些配置值或者初始化參數,用param元素來傳遞。
class=”assigned”的意思就是讓應用程序在save()之前為對象分配一個表示符,這是generator元素沒有指定時的默認生成策略。
4) <propertyname="Name"column="Name"type="String(40)"/>
3. 第三步 MVC中建立項目,引入命名空間
(1) 在MVC項目下面添加文件夾DLL,將我們需要的一些NHibernate的dll(文件類庫)添加到這里,供我們引用。如圖所示:
4. 第四步 實現Model層的邏輯
(1) 然后操作MVC層的Model層實現的功能如下:先在Model層地下建立2個文件夾和一個類,在各個文件夾下面在建立自己的類,建立完成之后如圖所示:
然后編程實現各個類中的功能,我們每個類的代碼都說一遍。
1) 操作接口類IUsers,在這里就需要引入命名空間using COM.Entities;,代碼如下:
public interface IUsers //定義接口類IUsers
{
///獲取所有的用戶
List<Users> GetAll();
///更新用戶
bool UpdateUser(Users u);
///添加用戶
bool AddUser(Users u);
///刪除用戶
bool DelUser(Users u);
///使用唯一的標識查詢實體集
///</summary>
///<param name="id">標識</param>
Users SelOne(string id);
}
2) 接下去來在MockModel文件夾下面的UserServices類中實現IUsers接口類的方法,需要用到NHibernate,所以引入操作NHibernate的命名空間及代碼:
using NHibernate實現簡單的增刪改查.Models.Interfaces;
using COM.Entities;
using NHibernate.Cfg;
using NHibernate;
using System.Collections;
// NHibernate操作數據庫的地方
public class UsersService:IUsers
{
//獲得所有的用戶信息
public List<Users> GetAll()
{
var cfg = new Configuration();
cfg.AddAssembly("COM.Entities");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
IList userList = session.CreateCriteria(typeof(Users)).List();
List<Users> list = new List<Users>();
foreach (Users item in userList)
{
list.Add(item);
}
return list;
}
//更新用戶
public bool UpdateUser(Users u)
{
var cfg = new Configuration();
cfg.AddAssembly("COM.Entities");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
Users eUsers = (Users)session.Load(typeof(Users), u.LogonId);
//使用事務來操作數據庫
ITransaction transaction = session.BeginTransaction();
eUsers.Name = u.Name;
eUsers.Password = u.Password;
eUsers.EmailAddress = u.EmailAddress;
eUsers.LastLogon = DateTime.Now;
transaction.Commit();
session.Flush(); //清理緩存,執行SQL
return false;
}
//刪除用戶
public bool DelUser(Users u)
{
var cfg=new Configuration();
cfg.AddAssembly("COM.Entities"); //程序集的添加
ISessionFactory factory=cfg.BuildSessionFactory();
ISession session=factory.OpenSession();
ITransaction transaction=session.BeginTransaction();
session.Delete(u);
transaction.Commit();
session.Flush();
return true;
}
//添加用戶
public bool AddUser(Users u)
{
try
{
var cfg = new Configuration();
cfg.AddAssembly("COM.Entities");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
session.Save(u);
transaction.Commit();
session.Close();
return true;
}
catch
{
return false;
}
}
///使用唯一標識查詢實體
///<param name="id">標識ID</param>
///<returns>返回Users實體</returns>
public Users SelOne(string id)
{
var cfg = new Configuration();
cfg.AddAssembly("COM.Entities");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
var u = (Users)session.Load(typeof(Users), id); // session.Load()根據指定的實體類或者ID從數據庫中讀取數據並返回與之對應的實體對象
return u;
}
}
3) 最后實現ServiceBuilder.cs類的方法使其能夠返回UserService類的方法,引入命名空間和代碼的編寫如下:
using NHibernate實現簡單的增刪改查.Models.Interfaces;
using NHibernate實現簡單的增刪改查.Models.MockModels;
public sealed class ServiceBuilder //sealed 修飾符可以應用於類、實例方法和屬性。密封類不能被繼承。密封方法會重寫基類中的方法,但其本身不能在任何派生類中進一步重寫。
{
public static IUsers BuildUsersService()
{
return new UsersService();
}
}
5. 第五步 實現MVC層的HomeController類
(1) 接下來實現MVC三層架構中的Controler層的業務邏輯,在HomeControler類中引入命名空間和代碼是:
using NHibernate實現簡單的增刪改查.Models.Interfaces;
using NHibernate實現簡單的增刪改查.Models;
using COM. Entities;
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
IUsers iuser = ServiceBuilder.BuildUsersService();
ViewData["UsersInfor"] = iuser.GetAll();
return View("Index");
}
public ActionResult OperationUser()
{
String textId = Request.Form["Text_ID"];
String textUserName = Request.Form["Text_UserName"];
String textPassword=Request.Form["Text_Password"];
String emailAddress = Request.Form["Text_EmailAddress"];
DateTime lastLogon = DateTime.Now;
string operationT = Request.Form["operationT"];
var u = new Users
{
LogonId = textId,
Name = textUserName,
Password = textPassword,
EmailAddress = emailAddress,
LastLogon = lastLogon
};
IUsers iuser = ServiceBuilder.BuildUsersService();
if (operationT.Equals("Add"))
{
if (iuser.AddUser(u))
{
ViewData["AddSuccess"] = "YES";
}
else
{
ViewData["AddSuccess"] = "No";
}
}
if (operationT.Equals("Edit"))
{
Users rU = iuser.SelOne(Request.Form["u_id"]);
string strU = "{'LogonId':'" + rU.LogonId + "','Name':'" + rU.Name + "','Password':'" + rU.Password + "','EmailAddress':'" + rU.EmailAddress + "'}";
return Content(strU);
}
if (operationT.Equals("DelOne"))
{
Users rU = new Users { LogonId = Request.Form["u_id"] };
iuser.DelUser(rU);
}
if (operationT.Equals("Update"))
{
iuser.UpdateUser(u);
}
IUsers iusersAll = ServiceBuilder.BuildUsersService();
ViewData["UsersInfor"] = iusersAll.GetAll();
return View("Index");
}
public ActionResult About()
{
return View();
}
}
6. 第6步
(1) 最后修改配置文件Web.Config的代碼如下:
<!-- 在配置文件中實現配置NHibernate的代碼 -->
<configSections>
<sectionname="nhibernate"type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
<nhibernate>
<addkey="hibernate.connection.provider"value="NHibernate.Connection.DriverConnectionProvider" />
<addkey="hibernate.dialect"value="NHibernate.Dialect.MsSql2000Dialect" />
<addkey="hibernate.connection.driver_class"value="NHibernate.Driver.SqlClientDriver" />
<addkey="hibernate.connection.connection_string"value="Data Source=.;Initial Catalog=NHibernate;Integrated Security=True" />
</nhibernate>
注釋:各個代碼所實現的功能如下:
1) hibernate.connection.provider 自定義的Connectionprovider類名,此類用來向NHibernate提供JDBC連接。
2) hibernate.dialect 數據庫方言類,NHibernate根據不同的方言來適應不同的數據庫,到0.7版只提供了支持MsSql2000的方言。
3) hibernate.connection.driver_class 數據庫連接的驅動類
4) hibernate.connection.connection_string 數據庫的連接字符串,包括主機名,數據庫名,用戶名和密碼,注意,很多實際項目中出於安全性,會將該連接字符串寫入注冊表中,那么該參數就只能在程序中動態賦值了。
7. 第7步
最后實現ActionResult的控制器Index.aspx頁的實例代碼如下:
<%@ Page Title="Nhibernate" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="COM.Entities" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
NHibernate實現Users數據庫的增刪改查功能
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<script src="http://www.cnblogs.com/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<h2>NHibernate實現Users數據庫的增刪改查功能</h2>
<div>
<%Html.BeginForm("OperationUser", "Home", FormMethod.Post); %>
用戶標識:<input type="text" name="Text_ID" id="Text_ID" />
<br /><br />
用戶姓名:<input type="text" name="Text_UserName" id="Text_UserName" />
<br /><br />
用戶密碼:<input type="password" name="Text_Password" id="Text_Password" />
<br /><br />
用戶郵箱:<input type="text" name="Text_EmailAddress" id="Text_EmailAddress" />
<input type="hidden" value="Add" name="operationT" id="operationT" />
<p style="margin-left:100px;">
<input type="submit" value="添加信息" name="btnSub" id="btnSub" onclick="javascript:SubWhere()" />
</p> <hr />
<table border="2px" cellpadding="0" cellspacing="0">
<tr>
<td style="width:70px;" align="center"><b>用戶標識</b></td>
<td style="width:80px;" align="center"><b>名稱</b></td>
<td style="width:80px;" align="center"><b>密碼</b></td>
<td style="width:80px;" align="center"><b>郵件</b></td>
<td style="width:160px;" align="center"><b>登錄時間</b></td>
<td style="width:100px;" align="center" colspan="2"><b>操作</b></td>
</tr>
<% var categorys = ViewData["UsersInfor"] as List<Users>; %>
<%
if (null != categorys)
foreach (Users u in categorys)
{
%>
<tr>
<td align="center"><%=u.LogonId%></td>
<td align="center"><%=u.Name%></td>
<td align="center"><%=u.Password%></td>
<td align="center"><%=u.EmailAddress%></td>
<td align="center"><%=u.LastLogon%></td>
<td align="center"><a href='javascript:SelOne("<%=u.LogonId%>")'>編輯</a></td>
<td align="center"><a href='javascript:ShanC("<%=u.LogonId%>")'>刪除</a></td>
</tr>
<%
}
%>
</table>
<%Html.EndForm(); %>
</div>
<script type="text/javascript">
//判斷實現添加和修改功能
function SubWhere() {
var subT = document.getElementById("btnSub").value;
if (subT == "添加信息") {
document.getElementById("operationT").value = "Add";
alert("添加成功");
}
if (subT == "確認修改") {
document.getElementById("operationT").value = "Update";
alert("修改數據成功!")
}
}
function SelOne(obj) {
document.getElementById("Text_ID").readOnly = true;
document.getElementById("btnSub").value = "確認修改";
document.getElementById("operationT").value = "Edit";
$.post(
'Home/OperationUser',
{
u_id: obj,
Text_ID: $("#Text_ID").val(),
Text_UserName: $("#Text_UserName").val(),
Text_Password: $("#Text_Password").val(),
Text_EmailAddress: $("#Text_EmailAddress").val(),
operationT: $("#operationT").val()
},
function (data) {
var _temp = eval("(" + data + ")");
document.getElementById("Text_ID").value = _temp.LogonId;
document.getElementById("Text_UserName").value = _temp.Name;
document.getElementById("Text_Password").value = _temp.Password;
document.getElementById("Text_EmailAddress").value = _temp.EmailAddress;
} )
}
function ShanC(obj) {
document.getElementById("operationT").value = "DelOne";
$.post(
'Home/OperationUser',
{
u_id:obj,
operationT:$("#operationT").val()
},
function(data){
if("Success"!=data.toString())
{
alert("刪除成功");
}
else
{
alert("刪除失敗");
}
} )
}
</script>
</asp:Content>
最后實現的功能頁面展示如下:
注:此原項目來自於博客園
源碼下載地址:http://www.chuxinm.com/Shop/Detail/Detail?id=b88e9907dbaa4b3db297443081ab238d