光陰似箭,日月如梭,套用小學作文慣用的一句開場白來開始重新開始我的博客園生涯吧。
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
已是深夜,你是否已經酣然入睡,靜靜的等待那可惡的鬧鈴將你從春夢中吵醒,而我明天不用上班...
