NHibernte+ASP.NET MVC+JQuery實現增刪改查


前言:本人自學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.xmlXML文件用於映射表對應的類的表文件。然后再類和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,將我們需要的一些NHibernatedll(文件類庫)添加到這里,供我們引用。如圖所示:

 

 

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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM