PetaPoco 使用總結(一)


PetaPoco 使用總結(一)

前段時間,公司的一個項目希望用一個ORM 的框架,通過對比 Dapper 和 PetaPoco ,雖然Dapper 功能很強大,速度更快。 但是最終還是選擇了比較簡單的PetaPoco。 因為PetaPoco更加的簡單,所有的代碼只有1500多行。通過一個項目的試驗,PetaPoco使用簡單,無任何需配置,無需冗長的映射文件,性能也不錯。

PetaPoco是一款適用於.NET應用程序的輕型對象關系映射器(ORM,  Object Relational Mapper)。與那些功能完備的ORM(如NHibernate或Entity Framework)不同的是,PetaPoco更注重易用性和性能,而非豐富的功能。使用PetaPoco只需要引入一個C#文件,可以使用強類型的 POCO(Plain Old CLR Object),並支持使用T4模板生成的類,和支持.net 4.0 的 Dynamic對象等等。

最近,隨着許多開源項目的發布,微型ORM已開始成為一種流行趨勢。其他一些眾所周知的適用於.NET的項目有Dapper和Massive。那些微型ORM相對於功能完備的ORM而言,會更簡單、更高效,微型ORM通常要求開發人員手動編寫SQL語句,而非完全動態生成。它們同樣不需要冗長的映射文件,因為對於維護和調試而言,那些映射文件只會讓過程變得單調乏味。

 

PetaPoco最讓人感興趣的功能包括:

  • 可與SQL Server、SQL Server CE、MySQL、PostgreSQL以及Oracle數據庫協同工作。
  • 包含針對Insert/Delete/Update/Save以及IsNew的多個輔助方法。
  • 支持簡單事務
  • 對於翻頁請求會自動計算總記錄數,並獲取特定分頁。
  • 支持參數替換,能夠從對象屬性中抓取命名參數(named parameters)
  • 包括一個消耗資源很少的SQL Builder類
  • 部分記錄更新
  • 包括T4 Templates,可以用於基於數據庫結構生成POCO類。
  • 很好的性能,剔除了Linq,並通過Dynamic方法快速的為屬性賦值

在性能方面,PetaPoco僅次於Dapper,速度只稍遜於手工編碼的數據訪問層(DAL, Data Access Layer)。

 

PetaPoco下載地址:

  GitHub - https://github.com/toptensoftware/petapoco

  例子:來自PetaPoco官網

 

查詢

  1.定義Poco 類 

// Represents a record in the "articles" table

public class article
{

    public long article_id { get; set; }

    public string title { get; set; }

    public DateTime date_created { get; set; }

    public bool draft { get; set; }

    public string content { get; set; }

}

 

  2.創建PetaPoco數據庫連接 ,並執行查詢

var db=new PetaPoco.Database("connectionStringName");

// 查詢所有articles
foreach (var a in db.Query<article>("SELECT * FROM articles"))

{

    Console.WriteLine("{0} - {1}", a.article_id, a.title);

}

 

 

查詢返回參數

 

long count=db.ExecuteScalar<long>("SELECT Count(*) FROM articles");

 

 

查詢得到一行記錄

  var a = db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=0", 123));

 

分頁查詢

         PetaPoco 自帶了分頁功能,可以自動執行分頁請求。

    // <-- 1 和 20 分別是頁碼和每頁條數

   var result=db.Page<article>(1, 20,  "SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");

   /// PetaPoco 源碼中,返回的 Page 對象 的各個屬性   
/// <summary> /// Holds the results of a paged request. /// </summary> /// <typeparam name="T">The type of Poco in the returned result set</typeparam> public class Page<T> { /// <summary> /// The current page number contained in this page of result set /// </summary> public long CurrentPage { get; set; } /// <summary> /// The total number of pages in the full result set /// </summary> public long TotalPages { get; set; } /// <summary> /// The total number of records in the full result set /// </summary> public long TotalItems { get; set; } /// <summary> /// The number of items per page /// </summary> public long ItemsPerPage { get; set; } /// <summary> /// The actual records on this page /// </summary> public List<T> Items { get; set; } /// <summary> /// User property to hold anything. /// </summary> public object Context { get; set; } }
 
        

Query vs Fetch

 

  Database 對象有兩個獲取數據的方法:Query 和Fetch。這兩個方法非常相似,不同的是Fetch方法返回一個POCO類的List<>,而Query使用 yield return 迭代所有數據,這些數據並沒有加載到內存中。

        

  需要注意的是:應該小心再開始一個新的查詢之前完成和處理掉上一個查詢,否則會曝異常。所以這種情況下, 應該優先使用 Fetch。

 

  出現這個問題的時候,一直找不到原因,看了源碼注釋之后,才知道的。

 

執行非查詢的sql 語句

 

  使用Execute 方法執行一個不帶查詢的命令:

db.Execute("DELETE FROM articles WHERE draft<>0");

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM