天天看點

Restful.Data,現招募有為騷年,群号 338570336

光陰似箭,日月如梭,套用國小作文慣用的一句開場白來開始重新開始我的部落格園生涯吧。

8年的風霜雪雨,不斷的擊打着我内心的哀傷,可我依舊堅挺的屹立在這裡,是因為技術是我一直堅持的夢想。

追尋着先輩和高人的腳步,多希望能見見他們的模樣,仰望着他們高高在上,心中不禁黯然神傷。

三十功名塵與土,八千裡路雲和月,或許正是這樣。

一路荊棘密布,坎坷不堪,是進是退,此時的你究竟想鬧哪樣。

技術生涯是枯燥的、乏味的。

當别人摟着小三進入夢鄉,而你還在冥思苦想。

遠望着路邊昏暗的燈光,傾聽着青蛙與蛐蛐的鳴響。

你思索着,也許明天就會變得晴朗,藍天白雲,鳥語花香。

也許沒有人懂得你的浪漫,你隻會傻傻的說出一句程式搬的詩句,如果愛,是以愛。

如果她聽懂了,那就好好珍惜吧。

不好意思,跑題了,最近思緒太多了,改天再為各位大俠寫詩啊。

詩中提到,技術生涯是枯燥的、乏味的,一直以來,我都想讓開發變得更加簡單,讓代碼更加優雅。讓你看到代碼就像見到美女一樣。

今天我提到的 Restful.Data ,是一個通用的資料持久層元件。

有的博友肯定會說幹嘛老是重複造輪子呢,我想說,你的想法和當年米其林輪胎公司生産出全世界第一條全鋼絲子午線輪胎時的想法一樣。

對啊,我已經造出輪子了,你普利司通、韓泰、橫濱、錦湖幹嘛還造啊,都用我家生産的輪胎好了啊。

正是因為有了更多的企業重複制造的輪子,你才有了更多的選擇,才讓這個世界變得更加豐富多彩。

在.NET世界裡,有很多持久層元件讓我們選擇:

  1. entity framework
  2. nherbinate
  3. ibatis.net
  4. castle
  5. ...

我無法評判它們孰勝孰劣,它們都是優秀的,這一點是值得肯定的。可是它們都不是我想要的。

有的過于複雜,有的過于龐大,有的需要大量的配置,有的讓你難以輕松上手。

我希望我的工具就像一把尖刀,拿過來就能殺鬼子的,而它們至少還需要你在磨刀石上磨一下。

今天我所提到的 Restful.Data,也許就是你想要的。

首先,Restful.Data 對 ado.net 做了進一步的封裝,提供了對資料庫通路的基本操作:

#region ADO.NET 封裝

        #region Transaction
        /// <summary>
        /// 開始一個事務
        /// </summary>
        /// <returns></returns>
        DbTransaction BeginTransaction();
        #endregion

        #region ExecuteScalar
        /// <summary>
        /// 執行 SQL 語句,傳回一個單一對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <returns>單一對象</returns>
        T ExecuteScalar<T>( string sql );

        /// <summary>
        /// 執行帶參數的 SQL 語句,傳回一個單一對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <param name="parameters">參數</param>
        /// <returns>單一對象</returns>
        T ExecuteScalar<T>( string sql, IDictionary<string,object> parameters );
        #endregion

        #region ExecuteDataReader
        /// <summary>
        /// 執行 SQL 語句,傳回一個 DataReader 對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <returns>DataReader 對象</returns>
        DbDataReader ExecuteDataReader( string sql );

        /// <summary>
        /// 執行帶參數 SQL 語句,傳回一個 DataReader 對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <param name="parameters">參數</param>
        /// <returns>DataReader 對象</returns>
        DbDataReader ExecuteDataReader( string sql, IDictionary<string, object> parameters );
        #endregion

        #region ExecuteDataTable
        /// <summary>
        /// 執行 SQL 語句,傳回一個 DataTable 對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <returns>DataTable 對象</returns>
        DataTable ExecuteDataTable( string sql );

        /// <summary>
        /// 執行帶參數 SQL 語句,傳回一個 DataTable 對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <param name="parameters">參數</param>
        /// <returns>DataTable 對象</returns>
        DataTable ExecuteDataTable( string sql, IDictionary<string,object> parameters );
        #endregion

        #region ExecuteDataSet
        /// <summary>
        /// 執行 SQL 語句,傳回一個 DataSet 對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <returns>DataSet 對象</returns>
        DataSet ExecuteDataSet( string sql );

        /// <summary>
        /// 執行帶參數 SQL 語句,傳回一個 DataTable 對象
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <param name="parameters">參數值</param>
        /// <returns>DataSet 對象</returns>
        DataSet ExecuteDataSet( string sql, IDictionary<string, object> parameters );
        #endregion

        #region ExecuteNonQuery
        /// <summary>
        /// 執行非查詢 SQL 語句,傳回受影響的行數
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <returns>受影響的行數</returns>
        int ExecuteNonQuery( string sql );

        /// <summary>
        /// 執行帶參數的非查詢 SQL 語句,傳回受影響的行數
        /// </summary>
        /// <param name="sql">SQL 語句</param>
        /// <param name="values">參數值</param>
        /// <returns>受影響的行數</returns>
        int ExecuteNonQuery( string sql, IDictionary<string,object> parameters );
        #endregion

        #endregion
           

  使用方法:

#region 使用Session
using( ISession session = SessionFactory.CreateDefaultSession() )
{
    return session.ExecuteDataTable( "select * from T" );
}
#endregion

#region 使用DbHelper
return DbHelper..ExecuteDataTable( "select * from T" );
#endregion
           

支援事務處理:

#region 事務處理
using( ISession session = SessionFactory.CreateDefaultSession() )
{
    session.BeginTransaction();

    session.ExecuteNonQuery( "insert into t value( '', '' )" );
    session.ExecuteNonQuery( "update t set a = 1, b = 2 where c = 3" );

    session.Commit();
}
#endregion
           

當執行過程中出現異常,事務自動復原。  

在ORM方面,支援對單表的增删改查操作,對我來說這夠用了。

先定義一個實體類:

#region 實體類
public class User : EntityObject<User>
{
        /// <summary>
        /// 構造方法
        /// </summary>
        public User()
            : base()
        {
        }

        private long m_ID;
        private string m_Account;
        private string m_Password;
        private bool m_IsActived;

        /// <summary>
        /// 
        /// </summary>
        [Column( IsPrimaryKey = true, IsAutoIncrease = true )]
        public long ID
        {
            get
            {
                return this.m_ID;
            }
            set
            {
                this.m_ID = value;
                this.OnPropertyChanged( "ID", value );
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public string Account
        {
            get
            {
                return this.m_Account;
            }
            set
            {
                this.m_Account = value;
                this.OnPropertyChanged( "Account", value );
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public string Password
        {
            get
            {
                return this.m_Password;
            }
            set
            {
                this.m_Password = value;
                this.OnPropertyChanged( "Password", value );
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public bool IsActived
        {
            get
            {
                return this.m_IsActived;
            }
            set
            {
                this.m_IsActived = value;
                this.OnPropertyChanged( "IsActived", value );
            }
        }
}
#endregion
           

實體類代碼可通過工具自動生成,對于Column特性隻需設定 IsPrimaryKey和IsAutoIncrease。

如何實作增删改:

#region 增删改
DbHelper.Insert<User>( user );
DbHelper.Update<User>( user ).Execute();
DbHelper.Update<User>( user ).Where( s => s.IsActive  ).Execute();
DbHelper.Delete<User>( user ).Execute();
DbHelper.Delete<User>().Where( s => s.ID == 1 ).Execute();
#endregion
           

對于查詢,內建了LINQ,但僅支援單表的查詢:

#region 查詢
var source = session.Find<User>()
                    .Where( s => !string.IsNullOrEmpty( s.Account ) )
                    .Where( s => s.Account.StartsWith( "xxx" ) )
                    .Where( s => s.IsActive )
                    .OrderBy( s => s.ID )
                    .Skip( 1 ).Take( 2 );

                var target = source.ToList();

source = from s in session.Find<User>()
              where s.Account.StartsWith( "xxx" )
              orderby s.ID
              select new { ID = s.ID, Account = s.Account };

target = source.ToList();
#endregion
           

使用前,你隻需要簡單的将Web.config或App.config中的connectionStrings節點中的providerName改成Restful.Data.MySql、Restful.Data.SQLServer、Restful.Data.Oracle等等,并在程式啟動時調用

SessionProviderFactories.Register<T>()方法注冊一下provider即可。

整個 Restful.Data 介紹完了,如果覺得不好請拍磚,并留下你寶貴的意見和建議,我将持續改進。

目前隻實作了核心功能和MySql的provider,是以想找幾個有為騷年一起完善,有興趣者請加群 338570336

已是深夜,你是否已經酣然入睡,靜靜的等待那可惡的鬧鈴将你從春夢中吵醒,而我明天不用上班...

轉載于:https://www.cnblogs.com/zhaoguihua/p/restful-data.html