.Net輕量級數據持久層組件:Restful.Data

jopen 10年前發布 | 20K 次閱讀 持久層框架 Restful.Data

Restful.Data是一套通用的輕量級數據持久層組件,除封裝了ADO.NET基本的數據庫操作以外,也提供了一些orm相關的API,用戶可以方便的定義實體類,并使用這些API對數據進行增刪改查等操作。 Restful.Data借鑒了業界如nhibernate、entity framework等知名的數據持久層組件,但從一開始設計的初衷就是為了讓用戶能快速的學習和使用,并寫出更加簡潔優雅的代碼,所以摒棄了一些復雜的設計和功能,用戶可以使用變通的方式或方法使用Restful.Data組件實現其目的。 Restful.Data充分考慮了實體框架的執行效率問題,進行了反復的推敲和論證,盡可能的采用高效的設計方案來提高性能。

誰需要Restful.Data? 

敢于冒險、追求完美、勇于挑戰并極具責任感的程序設計人員。

Restful.Data提供哪些功能?

基本的ADO.NET操作:    BeginTransaction    ExecuteScalar    ExecuteDataReader    ExecuteDataTable    ExecuteDataSet    ExecutePageQuery    ExecuteStoredProcedure

ORM相關操作:    Insert    Updete    Delete    Find

如何使用Restful.Data? 

使用前的準備:  下載Restful.dll、Restful.Data、Restful.Data.MySql、Remotion.Linq.dll、MySql.Data.dll,或者直接下載源代碼進行編譯并獲取這5個dll,并在項目中引用這些dll。

在 Web.config 或 App.config 中配置連接字符串,如下:

注冊提供程序工廠:  SessionFactories.Register();  提供程序工廠在一個Application中僅需注冊一次。

如何進行基本的數據庫操作:

using( ISession session = SessionFactory.CreateDefaultSession() ){
    string sql = "select * from Person";
    DataTable dt = session.ExecuteDataTable( sql );
}

CreateDefaultSession默認情況下根據配置文件中連接字符串節點的第一項創建數據庫連接,你可以調用CreateSession進行指定,或者你也可以使用 SessionFactory.Default = "MySql2"指定默認連接。

未防止 SQL 注入,你也使用呆參數方法:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    string sql = "select * from Person where Id = @Id;";
IDictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add( "@Id", 5 );
DataTable dt = session.ExecuteDataTable( sql, parameters );
}

與此類似的還有ExecuteScalar、ExecuteDataReader、ExecuteDataTable、ExecuteDataSet等方法。

如何進行分頁查詢:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
      string sql = "select * from User where CreateTime < @CreateTime";
  IDictionary<string, object> parameters = new Dictionary<string, object>();
  parameters.Add( "@CreateTime", DateTime.Now );
  // 查詢第2頁,每頁10條,并根據 CreateTime 字段降序排列
  PageQueryResult result = session.ExecutePageQuery( sql01, 2, 10, "CreateTime DESC", parameters );
}

如何進行數據新增:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    var person = new Person();
// person.Id = 1; 若Id字段為自增類型,無需指定。
person.Name = "test01";
person.CreateTime = DateTime.Now;
person.IsActive = true;
int i = session.Insert( person );
}

如何進行數據更新:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    var person = new Person();
person.Id = 1; 
person.Name = "test01";
person.CreateTime = DateTime.Now;
person.IsActive = true;
// 在調用此方法時,務必指定實例的主鍵值。
int i = session.Update( person );
}

或者你也可以批量更新:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    var person = new Person();
// person.Id = 1; 
person.Name = "test01";
person.CreateTime = DateTime.Now;
person.IsActive = true;
// 在調用此方法時,不需要指定主鍵值,且不會更新主鍵字段
session.Update<Person>().Set( person ).Where( s => s.IsActive == false ).Execute();
}

如何進行數據刪除:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    var person = new Person() { Id = 1 };
// 在調用此方法時,需要指定主鍵值
session.Delete( person );
}

或者你也可以批量刪除:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    // 在調用此方法時,不需要指定主鍵值
    session.Delete().Where( s => s.IsActive == false ).Execute();
  }

如何進行單表查詢:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    var queryable = session.Find()
        .Where( s => s.Name.Contains("a") )
        .Where( s => s.CreateTime < DateTime.Now )
        .OrderBy( s => s.CreateTime )
        .Skip(5)
        .Take(10);
var list = queryable.ToList();
var count = queryable.Count();
var first = queryable.FirstOrDefault();
var queryable1 = from s in session.Find<Person>()
            where s => s.Name.Contains("a")
            orderby s.CreateTime descending
            select new { Id = s.Id, Name = s.Name };
// ...
}

目前只支持對單表的LINQ查詢,且為了降低復雜度,后期也并不打算支持多表查詢,對函數的支持也有限,僅支持string類型的 StartsWith、EndsWith、Contains、Equals、IsNullOrEmpty等方法,對于其他方法后期將會繼續完善。

如果你需要實現一個復雜的查詢并將其轉換成對象,你也可以這樣:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    string sql = "...";
T @object = session.Find<T>( sql );
}

如何支持事務處理:

using( ISession session = SessionFactory.CreateDefaultSession() )
  {
    using( DbTransaction transaction = session.BeginTransaction() )
    {
        // ...
        // ...
    transaction.Commit();
}
}

SessionHelper的使用:

SessionHelper對session對象的方法進行了靜態封裝,如果你只是需要執行單條語句,并馬上關閉連接,你可以使用 SessionHelper 類中提供的一些輔助方法。

5、如何定義實體類

[Serializable]
public class Person : EntityObject  // 需繼承與 EntityObject 類
{
    private int m_Id;
    private string m_Name;
    private int? m_Age;
    private decimal? m_Money;
    private DateTime m_CreateTime;
    private bool m_IsActive;


    [PrimaryKey, AutoIncrease]  // 如果是自增字段,標記為 AutoIncrease;如果是主鍵標記為 PrimaryKey
    public int Id
    {
        get { return this.m_Id; }
        set { this.m_Id = value; this.OnPropertyChanged( "Id", value ); }
    }

    public string Name
    {
        get { return this.m_Name; }
        set { this.m_Name = value; this.OnPropertyChanged( "Name", value ); }
    }

    public int? Age
    {
        get { return this.m_Age; }
        set { this.m_Age = value; this.OnPropertyChanged( "Age", value ); }
    }

    public decimal? Money
    {
        get { return this.m_Money; }
        set { this.m_Money = value; this.OnPropertyChanged( "Money", value ); }
    }

    public DateTime CreateTime
    {
        get { return this.m_CreateTime; }
        set { this.m_CreateTime = value; this.OnPropertyChanged( "CreateTime", value ); }
    }

    public bool IsActive
    {
        get { return this.m_IsActive; }
        set { this.m_IsActive = value; this.OnPropertyChanged( "IsActive", value ); }
    }
}

6、總結

因作者時間關系,組件目前并非十分完善,測試工作也只簡單的進行了一部分,但您可以完全放心的應用于商業項目中,如遇到問題,作者將盡可能的解決。

項目主頁:http://www.baiduhome.net/lib/view/home/1402448775587

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!