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