小巧方便的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/

posted @ 2013-02-09 12:18 vento 阅读(...) 评论(...) 编辑 收藏