經過幾個星期的優化調整,今天 Restful.Data 正式開源發布。
源碼地址:https://github.com/linli8/Restful
今天不寫那么多廢話了,還是重新介紹一下 Restful.Data 吧。
1、什么是Restful.Data?
Restful.Data是一套通用的輕量級數據持久層組件,除封裝了ADO.NET基本的數據庫操作以外,也提供了一些orm相關的API,用戶可以方便的定義實體類,並使用這些API對數據進行增刪改查等操作。
Restful.Data借鑒了業界如nhibernate、entity framework等知名的數據持久層組件,但從一開始設計的初衷就是為了讓用戶能快速的學習和使用,並寫出更加簡潔優雅的代碼,所以摒棄了一些復雜的設計和功能,用戶可以使用變通的方式或方法使用Restful.Data組件實現其目的。
Restful.Data充分考慮了實體框架的執行效率問題,進行了反復的推敲和論證,盡可能的采用高效的設計方案來提高性能。
2、誰需要Restful.Data?
敢於冒險、追求完美、勇於挑戰並極具責任感的程序設計人員。
3、Restful.Data提供哪些功能?
基本的ADO.NET操作:BeginTransaction、ExecuteScalar、ExecuteDataReader、ExecuteDataTable、ExecuteDataSet、ExecutePageQuery、ExecuteStoredProcedure
ORM相關操作:Insert、Updete、Delete、Find
4、如何使用Restful.Data?
使用前請先下載Restful.dll、Restful.Data、Restful.Data.MySql、Remotion.Linq.dll、MySql.Data.dll,或者直接下載源代碼進行編譯並獲取這5個dll,並在項目中引用這些dll。
點這里下載相關文件
在 Web.config 或 App.config 中配置連接字符串,如下:
<connectionStrings> <clear /> <add name="MySql1" connectionString="server=192.168.1.101;database=Restful;user id=linli8;password=linli8" providerName="Restful.Data.MySql"/> <add name="MySql2" connectionString="server=192.168.1.102;database=Restful;user id=linli8;password=linli8" providerName="Restful.Data.MySql"/> </connectionStrings>
注冊提供程序工廠:
SessionFactories.Register<MySqlSessionFactory>();
提供程序工廠在一個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<Person>().Where( s => s.IsActive == false ).Execute();
}
如何進行單表查詢:
using( ISession session = SessionFactory.CreateDefaultSession() )
{
var queryable = session.Find<Person>()
.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、總結
因作者時間關系,組件目前並非十分完善,測試工作也只簡單的進行了一部分,但您可以完全放心的應用於商業項目中,如遇到問題,作者將盡可能的解決。后期還將持續優化,感興趣且願意參與開源項目的小伙伴們,請加QQ群:338570336。
另如使用中發現bug,真心希望能分享出來,我們一並修正並改進。
