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<article>("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<article>("SELECT * FROM articles WHERE article_id=0", 123));
分页查询
PetaPoco 自带了分页功能,可以自动执行分页请求。
// <-- 1 和 20 分别是页码和每页条数
var result=db.Page<article>(1, 20, "SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");
/// PetaPoco 源码中,返回的 Page 对象 的各个属性 /// <summary> /// Holds the results of a paged request. /// </summary> /// <typeparam name="T">The type of Poco in the returned result set</typeparam> public class Page<T> { /// <summary> /// The current page number contained in this page of result set /// </summary> public long CurrentPage { get; set; } /// <summary> /// The total number of pages in the full result set /// </summary> public long TotalPages { get; set; } /// <summary> /// The total number of records in the full result set /// </summary> public long TotalItems { get; set; } /// <summary> /// The number of items per page /// </summary> public long ItemsPerPage { get; set; } /// <summary> /// The actual records on this page /// </summary> public List<T> Items { get; set; } /// <summary> /// User property to hold anything. /// </summary> 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");
作者:章为忠
如有问题,可以微信:18618243664 联系我,非常感谢。
关注我的微信公众号,获取相关的 源代码及视频资料。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?