PetaPoco 使用总结(二)

 

  接着上一篇,上一篇主要介绍了PetaPoco 基本情况,优缺点和基本的查询功能,所以这篇主要介绍的是PetaPoco 的增,删,改等功能。PetaPoco提供了完整的增,删,改,查功能。是代替SqlHelper辅助类的不二选择。

  插入对象:需要指定的表和它的主键。

var a=new article();
a.title
="My new article"; a.content="PetaPoco was here"; a.date_created=DateTime.UtcNow;
db.Insert(
"articles", "article_id", a);

 

  如果是T4模板自动生存的Poco 对象,直接  a.Insert() 即可 。

  更新一条数据或是更新某个字段:

a.content="Balah balah";
db.Update(a);

  

  删除

// Delete an article extracting the primary key from a record
db.Delete("articles", "article_id", a);

 
// Or if you already have the ID elsewhere
db.Delete("articles", "article_id", null, 123);

 

  定义Poco类,或者通过T4模板生成,这样增删改查会更加简单:

// Represents a record in the "articles" table
[PetaPoco.TableName("articles")]
[PetaPoco.PrimaryKey("article_id")]
[PetaPoco.ExplicitColumns]
public class article
{

    [PetaPoco.Column]publiclong article_id { get; set;}

    [PetaPoco.Column]publicstring title { get; set;}

    [PetaPoco.Column]publicDateTime date_created { get; set;}

    [PetaPoco.Column]public bool draft { get; set;}

    [PetaPoco.Column]publicstring content { get; set;}

}

 

  增加

var a=new article();

a.title="My new article";

a.content="PetaPoco was here";

a.date_created=DateTime.UtcNow;

db.Insert(a);

 

 

  修改

a.content="Blah blah";

db.Update(a);

 

 

  删除对象

db.Delete(a);

 

  删除某条或多条记录

db.Delete
("WHERE article_id=@0", 123);

 

  修改一个对象的单独几个字段:

db.Update
("SET title=@0 WHERE article_id=@1", "New Title", 123);

 

  同时,你可以告诉PetaPoco 忽略某个字段,给该字段加上 PetaPoco.Ignore 特性 即可

public class article
{
    [PetaPoco.Ignore]
    public long SomeCalculatedFieldPerhaps
    {
        get; set;
    }
}

 

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
(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
(“SELECT * FROM articles WHERE article_id=0”, 123));

 

分页查询

PetaPoco 自带了分页功能,可以自动执行分页请求。

// <– 1 和 20 分别是页码和每页条数

   var result=db.Page
(1, 20, SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC, coolstuff);
/// PetaPoco 源码中,返回的 Page 对象 的各个属性   
/// /// Holds the results of a paged request. ///

 

/// The type of Poco in the returned result set public class Page { /// /// The current page number contained in this page of result set ///

 

public long CurrentPage { get; set; } /// /// The total number of pages in the full result set ///

 

public long TotalPages { get; set; } /// /// The total number of records in the full result set ///

 

public long TotalItems { get; set; } /// /// The number of items per page ///

 

public long ItemsPerPage { get; set; } /// /// The actual records on this page ///

 

public List Items { get; set; } /// /// User property to hold anything. ///

 

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");