小巧方便的ORM類庫——PetaPoco


PetaPoco是一個簡單輕巧的orm開源類庫,全部功能只有一個文件,可以很方便集成到項目中。代替SqlHelper輔助類的不二選擇。。。

主要功能包括:
- 映射實體類,支持enum,Nullable等類型,可同時映射多個實例。
- 支持分頁
- 以@0等占位符代替SqlParameter,傳參更方便
- 帶有sql字符串構造器,構造條件查詢sql非常方便
- update支持指定字段更新
- 支持T4模板

使用示例: 使用前需要先new一個數據庫實例:

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

可以放心地把db實例設為static,因為實例中沒有SqlConnection的引用,連接每次執行完后,會自動關閉。 發現有人反映在web上使用static的db實例還是會有問題,具體可看鏈接(Link1),StackOverflow中推薦web中每個請求使用一個單獨的db實例(Link2). 1、取一條記錄

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

2、分頁

// 分頁實質在內部是用Row_Number()重寫了sql,支持join
var result=db.Page(1, 20, "SELECT * FROM articles WHERE category=@0 ORDER BY date_created DESC", "coolstuff");

上面的分頁sql,會被改寫為sql:

SELECT * FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY date_created DESC) peta_rn, * FROM articles WHERE category=@0 ) peta_paged
WHERE peta_rn>@1 AND peta_rn

3、部分更新

db.Update("articles", "article_id", new { title="New title" }, 123);

4、sql條件構造

var sql = PetaPoco.Sql.Builder
    .Append("SELECT * FROM articles")
    .Append("WHERE article_id=@0", id)
    .Append("WHERE date_created>=@0", start_date)
    .Append("WHERE date_created<=@0", end_date);
 
        

5、直接執行sql

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

6、調用存儲過程

//調用存儲過程
db.Execute("exec procSomeHandler @0, @1", 3, "2011-10-01");

//調用帶輸出(OUTPUT)參數的存儲過程, 寫的sql語句,@0參數后的“output”是關鍵
var param = new SqlParameter() { Direction = ParameterDirection.Output, SqlDbType = SqlDbType.Int };
db.Execute("exec procSomeHandler @0 OUTPUT", param);

7、代替返回值DataTable 有時,我們並不想每條執行的sql都需要創建對應的實體類,這樣會導致項目中存在過多的實體類,有方法能做到DataTable這樣靈活就最好了。在.net4.0中,PetaPoco可以返回dynamic類型,可以很好地解決這個問題,而在.net3.5中就沒辦法,不過可以通過修改PetaPoco代碼,實現使用Dictionary類型來代替dynamic動態類型的功能。改動代碼如下:https://github.com/cxfksword/PetaPoco/commit/e07746c06977f09ef8e7a0f81b718e520b4513ed

var list = db.Fetch>("select article_id,date_created from articles");

使用petapoco時有點需要注意,就是當數據庫字段數據類型是varchar等非unicode字符類型時,petapoco傳參需要把string轉換為AnsiString類型,否則會有性能問題。

Ansi String Support

DBA guru Rob Sullivan yesterday pointed out that SQL Server has pretty severe performance overhead if you try to query an index with varchar column using a unicode string parameter. To fix this the parameter needs to be bound as DbType.AnsiString. To facilitate this you can now wrap such string parameters in a new AnsiString class:

var a = db.SingleOrDefault("WHERE title=@0", new PetaPoco.AnsiString("blah"));

參考資料: http://code.google.com/p/dapper-dot-net/ http://www.toptensoftware.com/petapoco/


免責聲明!

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



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