Restful.Data,現招募有為騷年,群號 338570336
光陰似箭,日月如梭,套用小學作文慣用的一句開場白來開始重新開始我的部落格園生涯吧。
8年的風霜雪雨,不斷的擊打著我內心的哀傷,可我依舊堅挺的屹立在這裡,是因為技術是我一直堅持的夢想。
追尋著先輩和高人的腳步,多希望能見見他們的模樣,仰望著他們高高在上,心中不禁黯然神傷。
三十功名塵與土,八千里路雲和月,或許正是這樣。
一路荊棘密佈,坎坷不堪,是進是退,此時的你究竟想鬧哪樣。
技術生涯是枯燥的、乏味的。
當別人摟著小三進入夢鄉,而你還在冥思苦想。
遠望著路邊昏暗的燈光,傾聽著青蛙與蛐蛐的鳴響。
你思索著,也許明天就會變得晴朗,藍天白雲,鳥語花香。
也許沒有人懂得你的浪漫,你只會傻傻的說出一句程式搬的詩句,如果愛,所以愛。
如果她聽懂了,那就好好珍惜吧。
不好意思,跑題了,最近思緒太多了,改天再為各位大俠寫詩啊。
詩中提到,技術生涯是枯燥的、乏味的,一直以來,我都想讓開發變得更加簡單,讓程式碼更加優雅。讓你看到程式碼就像見到美女一樣。
今天我提到的 Restful.Data ,是一個通用的資料持久層元件。
有的博友肯定會說幹嘛老是重複造輪子呢,我想說,你的想法和當年米其林輪胎公司生產出全世界第一條全鋼絲子午線輪胎時的想法一樣。
對啊,我已經造出輪子了,你普利司通、韓泰、橫濱、錦湖幹嘛還造啊,都用我家生產的輪胎好了啊。
正是因為有了更多的企業重複製造的輪子,你才有了更多的選擇,才讓這個世界變得更加豐富多彩。
在.NET世界裡,有很多持久層元件讓我們選擇:
- entity framework
- nherbinate
- ibatis.net
- castle
- ...
我無法評判它們孰勝孰劣,它們都是優秀的,這一點是值得肯定的。可是它們都不是我想要的。
有的過於複雜,有的過於龐大,有的需要大量的配置,有的讓你難以輕鬆上手。
我希望我的工具就像一把尖刀,拿過來就能殺鬼子的,而它們至少還需要你在磨刀石上磨一下。
今天我所提到的 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
已是深夜,你是否已經酣然入睡,靜靜的等待那可惡的鬧鈴將你從春夢中吵醒,而我明天不用上班...