PetaPoco是一个轻量级的ORM(对象关系映射)框架,用于在.NET平台上进行数据访问和持久化操作。它提供了简单、快速、灵活的方式来与数据库进行交互,支持多种数据库类型,包括SQL Server、MySQL、SQLite、Oracle等。本文主要介绍PetaPoco的特点及优势,以及相关示例代码。

1、PetaPoco的特点及优势

PetaPoco是一个功能强大且易于使用的ORM框架,适用于.NET开发人员在各种项目中进行高效的数据访问。它的简洁性、轻量级和高性能使得它成为.NET开发社区中备受欢迎的选择之一。

1)简单易用

PetaPoco的API设计简洁,学习和使用都很容易。它提供了一套简单而直观的方法来执行数据库查询、插入、更新和删除等操作。

2)轻量级

PetaPoco是一个轻量级的框架,不依赖于复杂的配置和大量的依赖项。它的核心库非常小巧,对系统资源的消耗也很低,适用于各种规模的项目。

3)高性能

PetaPoco执行数据库操作的速度非常快,与其他ORM框架相比具有较低的性能开销。它采用了轻量级的对象映射机制,避免了过多的ORM特性和复杂的查询生成器。

4)灵活性

PetaPoco提供了灵活的查询和映射选项,可以满足各种复杂的数据访问需求。开发人员可以自由地编写SQL查询语句,并通过简单的映射机制将查询结果映射到对象模型中。

5)跨数据库支持

PetaPoco支持多种主流数据库类型,包括SQL Server、MySQL、SQLite、Oracle等,使开发人员能够在不同的数据库平台上进行统一的数据访问操作。

代码地址:https://github.com/CollaboratingPlatypus/PetaPoco

2、安装引用PetaPoco

可以通过NuGet包管理器在Visual Studio中安装PetaPoco。打开项目,右键点击项目,选择“Manage NuGet Packages”,搜索PetaPoco并安装。

相关文档:VS(Visual Studio)中Nuget的使用

3、PetaPoco使用示例代码

//初始化数据库连接
var db=new PetaPoco.Database("connectionStringName");


//查询单个值
long count=db.ExecuteScalar<long>("SELECT Count(*) FROM ShelfMissionInfo");


//返回一条记录
var a = db.SingleOrDefault<ShelfMissionInfo>("SELECT * FROM ShelfMissionInfo WHERE =@0", 1));

//返回一条记录,可以省略select,用where开头,会自动查询出全部字段(不是*号)
var a=db.SingleOrDefault<ShelfMissionInfo>("WHERE id=@0", 123);

//返回一条记录,可以From开头,会自动查询出全部字段(不是*号)
var a = db.SingleOrDefault<ShelfMissionInfo>("FROM whatever WHERE id=@0", 123);

//如果有主键,可以这样写
var a = db.SingleOrDefault<ShelfMissionInfo>(some_id);

//分页,分页的代码会自动生成
var result=db.Page<ShelfMissionInfo>(1, 20,"SELECT * FROM ShelfMissionInfo WHERE category=@0 ORDER BY date_posted DESC", "data");

var result = db.Page<ShelfMissionInfo>(pageNumber, pageSize, sql, args);
var totalNumber = result.TotalItems;//所有数据条数
var data = result.Items;//查询返回的数据
// 逐行查询每条记录,一次只从数据库表中取一条数据
foreach (var a in db.Query<ShelfMissionInfo>("SELECT * FROM ShelfMissionInfo"))
{
    Console.WriteLine("{0} - {1}", a.id, a.title);
}

//动态查询,返回dynamic,这种方式不支持自动添加Select
foreach (var a in db.Fetch<dynamic>("SELECT * FROM ShelfMissionInfo"))
{
    Console.WriteLine("{0} - {1}", a.id, a.title);
}
//查询单个字段,返回非Poco对象,支持所有的Type.IsValueType,字符串和byte数组
foreach (var x in db.Query<long>("SELECT id FROM ShelfMissionInfo"))
{
    Console.WriteLine("ShelfMissionInfo ID: {0}", x);
}

//检查主键是否存在
if (db.Exists<ShelfMissionInfo>(23)) 
    db.Delete <ShelfMissionInfo>(23);



//执行Sql,不返回值
db.Execute("DELETE FROM ShelfMissionInfo WHERE draft<>0");

//插入记录
// Create the ShelfMissionInfo
var a=new ShelfMissionInfo();
a.title="My new ShelfMissionInfo";
a.content="PetaPoco was here";
a.CreateTime=DateTime.UtcNow;
// Insert it
db.Insert(a);



//修改记录
// Get a record
var a=db.SingleOrDefault<ShelfMissionInfo>("SELECT * FROM ShelfMissionInfo WHERE id=@0", 123);
// Change it
a.content="PetaPoco was here again";
// Save it
db.Update(a);

//修改一个属性更简洁的写法
db.Update("ShelfMissionInfo", "id", new { ProductName="apple" }, 123);

//更新的另一种写法
db.Update<ShelfMissionInfo>("SET title=@0 WHERE id=@1", "apple", 123);

//更新指定的字段
a.Update(new string[] { "title" });
//也可以这样更新
db.Update<user>(u, new string[] { "title" });


//删除记录
//通过主键删除
db.Delete(a);

//自定义删除
db.Delete<ShelfMissionInfo>("WHERE id=@0", 123);


//事务,而且事物可以嵌套哦
using(var scope = db.GetTransaction())
{
    //todo: Do transacted updates here

    // Commit
    scope.Complete();

}


//支持存储过程,还不支持out 参数?
db.Query<type>("CALL storedproc")     // MySQL stored proc
db.Query<type>("EXECUTE myproc")        // MySQL prepared statement
db.Query<type>("EXECUTE storedproc")  // SQL Server


//执行Sql
databaseQuery.Execute("insert into temp1 (t) values (@0)", 
                new SqlParameter() { SqlDbType = SqlDbType.VarBinary, Value = DbNull.Value });




//组装Sql
var id=123;
var a=db.Query<ShelfMissionInfo>(PetaPoco.Sql.Builder
    .Append("SELECT * FROM ShelfMissionInfo")
    .Append("WHERE id=@0", id)
    .Append("AND CreateTime<@0", DateTime.UtcNow)
)


//动态组装Sql
var id=123;
var sql=PetaPoco.Sql.Builder
    .Append("SELECT * FROM ShelfMissionInfo")
    .Append("WHERE id=@0", id);

if (start_date.HasValue)
    sql.Append("AND CreateTime>=@0", start_date.Value);

if (end_date.HasValue)
    sql.Append("AND CreateTime<=@0", end_date.Value);

var a=db.Query<ShelfMissionInfo>(sql)

//通过命名的参数来组装Sql
sql.Append("AND CreateTime>=@start AND CreateTime<=@end", 
                new 
                { 
                    start=DateTime.UtcNow.AddDays(-2), 
                    end=DateTime.UtcNow 
                }
            );

//组装Sql还可以这样
var sql=PetaPoco.Sql.Builder()
            .Select("*")
            .From("ShelfMissionInfo")
            .Where("CreateTime < @0", DateTime.UtcNow)
            .OrderBy("CreateTime DESC");

//还可以更复杂
var sql = Sql.Builder
    .Select("*")
    .From("ShelfMissionInfo")
    .LeftJoin("Products").On("ShelfMissionInfo.id=Products.id");

推荐文档