ASP.NET MVC+Spring.net+Nhibernate+EasyUI+Jquery開發案例(1)

來源:互聯網
上載者:User

前言:由於這段時間公司的事情比較的繁忙,每天都要學習新的東西,所以好久沒有寫部落格了,今天抽空寫寫部落格來記錄我這段時間研究的東西,給自己加深一下印象,我用easyUI的組件開發了一個簡單操作資料庫的小範例,一些常用的資料庫操作都實現了,希望能和部落格園裡面的博主們交流交流意見。

首先我用的開發環境是Visual Studio 2010,ASP.NET MVC2.0,SQL SERVER2005,我用的NHibernate的版本是1.2.1,Spring.net的版本是1.1.0。

首先在這裡將我的疑惑先說出來,希望有人能夠給我解答解答,在這裡謝過了,我在用版本的時候我發現NHibernate1.2.1和spring.net1.1.0(低版本)結合最好,Nhibernate3.0和spring.net 1.3.1(高版本)結合做好,不知道我的認為正確嗎?但是低版本的話不能使用Nhibernate.Linq,只有Nhibernate3.0以上的版本支援Nhibernate,但是高版本的話我們項目裡面有一個功能我們沒有做出來,就是我們故意把資料庫的連接字串寫錯誤,然後我執行不經過資料操作的頁面的話,比如這個頁面我就輸出一句話,但是也會報錯,說無法串連資料庫,使用者登入失敗,但是我想要的是在沒有操作資料庫的頁面可以正常顯示,在操作資料庫的頁面在提示錯誤即可?不知道哪位博友有什麼好方法呢?這種效果在低版本下面我可以實現了。

  1. 第一步:建立資料庫

(1)    開啟資料庫SQL Server 2005,建立一個資料庫bjk241,然後再此資料庫中建立一張表,起名為:User_DepInfo,用來存放我們錄入的資料,表的建立樣式如所示:

 

  1. 第二步:建立項目,類庫等

(1) 開啟Visual Studio 2010整合式開發環境,在Visual Studio 2010中建立一個ASP.MVC 2.0的項目,給項目其名稱是NewKJ241,將會產生微軟封裝好的內建的MVC的整個架構結構,然後在項目裡面建立幾個類庫,用來存放我在後面建立的一些項目,當我們建立完成之後:

 

(2) 當我們看到這張圖的時候,我們是不是在疑惑這都是幹什麼的呢?不要著急,下面我就介紹一下各個項目和類庫的作用。

  1) 首先我們看到了NewKJ241裡面的內容和我們剛建立的不一樣吧,那是因為我重建立立了幾個檔案夾,將沒有的檔案夾介紹一下,Configs檔案夾裡面放的是spring.net的XML節點,實現的作用是連結資料庫和映射整個架構,下面我會詳細介紹的,dlls檔案夾裡面放的是我們所要引用的dll,:

 

,easyUI檔案夾裡面是存放的是我們需要引用的easyUI的類庫,其他的都是建立的時候自動產生的,後面會討論的。

  2) NewKJ241.Model類庫的作用是存放映射的資料庫的檔案。

  3) NewKJ241.IDao類庫的作用是實現了我們所需要的在項目中實現資料庫方法的介面。

  4) NewKJ241. NhibernateDao類庫的作用是實現了IDao的介面,完成了介面所要實現的方法的代碼。

  5)NewKJ241.IBLL類庫的作用是實現了我們在項目中要使用Spring.NET所要使用的介面,和NewKJ241.IDao介面的寫法一模一樣。

  6)NewKJ241.BLL類庫的方法是實現了Nhibernate的實現方法,繼承自IBLL項目,是為了使用Spring.NET所寫的方法。

下面我就講我寫的東西詳細的講述一下,有什麼不足或者缺點我們可以討論。

  1. 第三步:NHibernate對應檔

(1) 首先我們要映射出資料庫中表的資訊的檔案,這裡我們怎麼映射呢,那麼多的代碼??別著急,我們可以用一個自動產生對應檔的組件CodeSmith軟體,這個軟體可以快速的協助我們產生對應檔,關於這個軟體怎麼使用可以看我以前寫的篇部落格,那裡詳細的敘述了如何使用這個軟體:http://www.cnblogs.com/hanyinglong/archive/2012/04/21/2462302.html。

(2) 接下來我們在NewKJ241.Model裡面建立一個檔案夾Mappings,在這個檔案夾裡面我們存放了映射的檔案,產生之後附加到項目中:

 

1)  UserDepInfo的作用是定義資料庫中的欄位,再用CodeSmith產生的時候模式欄位屬性是不加Virtual的,我們人為的給欄位屬性加上,代碼如下:

        protected int _id;

        protected int _depID;

        protected string _depName;

        public UserDepInfo() { }

        public UserDepInfo(int depID, string depName)

        {

            this._depID = depID;

            this._depName = depName;

        }

        public virtual int Id

        {

            get { return _id; }

            set { _id = value; }

        }

        public virtual int DepID

        {

            get { return _depID; }

            set { _depID = value; }

        }

        public virtual string DepName

        {

            get { return _depName; }

            set

            {

                if (value != null && value.Length > 50)

                    throw new ArgumentOutOfRangeException("Invalid value for DepName", value, value.ToString());

                _depName = value;

            }

        }

2) 然後對應檔的代碼如下:注意,在這裡我們需要把這個XML檔案改成內嵌資源,不然後面我們事先不了功能,怎麼改呢?很簡單,右鍵——屬性——產生操作改成內嵌資源,這樣就OK了,前期準備工作完成了下面我們就開始寫方法了。在這裡又看不懂是什麼意思的,可以看我的部落格:http://www.cnblogs.com/hanyinglong/archive/2012/04/20/2459314.html。

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

                   assembly="NewKJ241.Model.UserDepInfo"

                   namespace="NewKJ241.Model.UserDepInfo">

  <class name="NewKJ241.Model.UserDepInfo,NewKJ241.Model" table="User_DepInfo" lazy="false">

    <!--下面是使用緩衝所使用的一句話,但是本項目裡面的二級緩衝注釋掉了,所以這裡也注釋-->

    <!--<cache usage="read-write"/>-->

    <!--部門表主鍵ID-->

    <id name="Id" type="Int32" unsaved-value="null">

      <column name="ID" length="4" sql-type="int" not-null="true" unique="true"/>

      <generator class="native" />

    </id>

    <!--部門表ID-->

    <property name="DepID" type="Int32">

      <column name="DepID" length="4" sql-type="int" not-null="false"/>

    </property>

    <!--部門表名稱-->

    <property name="DepName" type="String">

      <column name="DepName" length="50" sql-type="varchar" not-null="false"/>

    </property>

  </class>

</hibernate-mapping>

  1. 第四步:建立Dao介面,實現操作資料庫的方法

(1) 在NewKJ241.IDao類庫下面建立一個類,起名為:IUserDepInfoDao,然後在此類中寫要實現方法的介面,代碼如下:

  //where表明了對類型變數T的約束關係,where T : class表示類型變數T是繼承自class或者class本身

    public interface IUserDepInfoDao<T> where T : class

    {

        /// <summary>

        /// 擷取實體

        /// </summary>

        /// <param name="id">主鍵</param>

        /// <returns>實體</returns>

        T Get(object id);

 

        /// <summary>

        /// 擷取實體

        /// </summary>

        /// <param name="id">主鍵</param>

        /// <returns>實體</returns>

        T Load(object id);

 

        /// <summary>

        /// 插入實體

        /// </summary>

        /// <param name="entity">實體</param>

        /// <returns>插入的資料</returns>

        object Save(T entity);

 

        /// <summary>

        /// 修改實體

        /// </summary>

        /// <param name="entity">實體資料</param>

        void Update(T entity);

 

        /// <summary>

        /// 儲存或者修改實體

        /// </summary>

        /// <param name="entity">實體資料</param>

        void SaveOrUpdate(T entity);

 

        /// <summary>

        /// 刪除實體

        /// </summary>

        /// <param name="id">主鍵ID</param>

        void Delete(object id);

 

        /// <summary>

        /// 刪除實體

        /// </summary>

        /// <param name="odList">主鍵ID的集合,刪除多個項</param>

        void Delete(string idList);

 

        /// <summary>

        ///讀取如果使用者不輸入任何資訊進行查詢的方法

        /// </summary>

        /// <param name="sort">按照某個欄位進行排序</param>

        /// <param name="order">按照某個欄位進行排序</param>

        /// <returns></returns>

        IList<UserDepInfo> loadByAll(string sort, string order);

 

        /// <summary>

        /// 讀取使用者輸入條件進行查詢的方法

        /// </summary>

        /// <param name="sort">按照某個欄位進行排序</param>

        /// <param name="order">按照某個欄位進行排序</param>

        /// <param name="name">只使用者輸入的資訊</param>

        /// <returns></returns>

        IList<UserDepInfo> loadAllCheck(string sort, string order, string name);

 

        /// <summary>

        ///

        /// </summary>

        /// <param name="total">總的數量</param>

        /// <param name="page">當前的頁數</param>

        /// <param name="rows">每頁所顯示的數量</param>

        /// <param name="order">按照某個欄位進行排序</param>

        /// <param name="sort">按照某個欄位進行排序</param>

        /// <param name="DepName">只使用者輸入的資訊</param>

        /// <returns></returns>

        IList<UserDepInfo> LoadAllByPage(out long total, int page, int rows, string order, string sort, string DepName);

}

這裡就沒什麼說的了,寫法都很固定!!

  1. 第五步:建立NhibernateDao項目,實現IDao介面的方法

(1) 在NewKJ241.Nhibernate類庫下面建立類,起名為:UserDepInfoDao,在該方法中繼承自IDao介面,實現了IDAO介面裡面的所有方法,在書寫本代碼的時候,我們必須引入dll,引入的dll:

 

代碼如下:

 public class UserDepInfoDao<T> : HibernateDaoSupport, IUserDepInfoDao<T> where T : class

    {

        public T Get(object id)

        {

            return this.HibernateTemplate.Get<T>(id);

        }

 

        public T Load(object id)

        {

            return this.HibernateTemplate.Load<T>(id);

        }

 

        public virtual object Save(T entity)

        {

            return this.HibernateTemplate.Save(entity);

        }

 

        public void Update(T entity)

        {

            this.HibernateTemplate.Update(entity);

        }

 

        public void SaveOrUpdate(T entity)

        {

            this.HibernateTemplate.SaveOrUpdate(entity);

        }

 

        public void Delete(object id)

        {

            var entity = this.HibernateTemplate.Get<T>(id);

            if (entity == null)

            {

                return;

            }

            else

            {

                this.HibernateTemplate.Delete(entity);

            }

        }

 

        public void Delete(string idList)

        {

            string[] idl = idList.Split(',');

            int len = idl.Length;

            for (int i = 0; i < len; i++)

            {

                var entity = this.HibernateTemplate.Get<T>(int.Parse(idl[i].ToString()));

                if (entity == null)

                {

                    return;

                }

                else

                {

                    this.HibernateTemplate.Delete(entity);

                }

            }

        }

 

        public IList<UserDepInfo> loadByAll(string sort, string order)

        {

            string hql = "from UserDepInfo order by " + sort + " " + order;

            return this.HibernateTemplate.Find<UserDepInfo>(hql).ToList();

 

        }

 

        public IList<UserDepInfo> loadAllCheck(string sort, string order, string name)

        {

            string hql = "from UserDepInfo where DepName like ? order by " + sort + " " + order;

            return this.HibernateTemplate.Find<UserDepInfo>(hql, new object[] { "%" + name + "%" }).ToList();

        }

 

 

        public IList<UserDepInfo> LoadAllByPage(out long total, int page, int rows, string order, string sort, string DepName)

        {

            IList<UserDepInfo> list = null;

            if (DepName == null)

            {

                list = this.loadByAll(sort, order);

            }

            else

            {

                list = this.loadAllCheck(sort, order, DepName);

            }

            total = list.LongCount();

            list = list.Skip((page - 1) * rows).Take(rows).ToList();

            return list;

        }

}

哎,工作一天了,累了,回學校了,明天繼續,今天寫的這些都是基礎,後面還會在寫這個項目的,一直到這個項目寫完!!,也是最有知識點了,所謂學習嗎,一步一個腳印,慢慢來吧!!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.