zoukankan      html  css  js  c++  java
  • PetaPoco 笔记

    PetaPoco是一款适用于.Net 和Mono的微小、快速、单文件的微型ORM。

    PetaPoco有以下特色:

    • 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中。
    • 工作于严格的没有装饰的Poco类,和几乎全部加了特性的Poco类
    • Insert/Delete/Update/Save and IsNew 等帮助方法。
    • 分页支持:自动得到总行数和数据
    • 支持简单的事务
    • 更好的支持参数替换,包括从对象属性中抓取命名的参数。
    • 很好的性能,剔除了Linq,并通过Dynamic方法快速的为属性赋值
    • T4模板自动生成Poco类
    • 查询语言是Sql……不支持别扭的fluent或Linq语法(仁者见仁,智者见智)
    • 包含一个低耦合的Sql Builder类,让内联的Sql更容易书写
    • 为异常信息记录、值转换器安装和数据映射提供钩子。(Hooks for logging exceptions, installing value converters and mapping columns to properties without attributes.)
    • 兼容SQL Server, SQL Server CE, MySQL, PostgreSQL and Oracle。
    • 可以在.NET 3.5 或Mono 2.6或更高版本上运行
    • 在.NET 4.0 和Mono 2.8下支持dynamic
    • NUnit单元测试
    • 开源(Apache License)
    • 所有功能大约用了1500行代码

    可以从这里获得PetaPoco:

    创建PetaPoco对象,并执行查询:

    // Create a PetaPoco database object
    var db=new PetaPoco.Database("connectionStringName");
    
    // Show all articles    
    foreach (var a in db.Query<article>("SELECT * FROM articles"))
    {
        Console.WriteLine("{0} - {1}", a.article_id, a.title);
    }

      得到一个scalar:

    long count=db.ExecuteScalar<long>("SELECT Count(*) FROM articles");

      得到一行记录:

    var a = db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123));

    获取分页数据(将获取一个PageFetch对象):

      PetaPoco分页执行过程:

    var result=db.Page<article>(1, 20, // <-- page number and items per page
            "SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");

        1.生成并执行一个查询,获取匹配的数据行数。

        2.修改原始的查询语句,只能得到所有匹配的一个子集。

        pageFetch对象:一个展示单页数据和分页控制的类。

    public class Page<T> where T:new()
    {
        public long CurrentPage { get; set; }
        public long ItemsPerPage { get; set; }
        public long TotalPages { get; set; }
        public long TotalItems { get; set; }
        public List<T> Items { get; set; }
    }

    获取数据的方式Query 和 Fetch:

      Fetch返回一个一个POCO类的List<>,而Query使用迭代所有数据,但是这些数据没有被加载到内存中。 

      不带查询的命令:

    db.Execute("DELETE FROM articles WHERE draft<>0");

      Inserts、Updates 和 Deletes:

    // Create the article
    var a=new article();
    a.title="My new article";
    a.content="PetaPoco was here";
    a.date_created=DateTime.UtcNow;
    
    // Insert it
    db.Insert("articles", "article_id", a);
    
    // by now a.article_id will have the id of the new article
    // Get a record
    var a=db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123);
    
    // Change it
    a.content="PetaPoco was here again";
    
    // Save it
    db.Update("articles", "article_id", a);
    db.Update("articles", "article_id", new { title="New title" }, 123);
    // 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类:

    // Represents a record in the "articles" table
    [PetaPoco.TableName("articles")]
    [PetaPoco.PrimaryKey("article_id")]
    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; }
    } 

      简化后的insert、update、delete:

    // Insert a record
    var a=new article();
    a.title="My new article";
    a.content="PetaPoco was here";
    a.date_created=DateTime.UtcNow;
    db.Insert(a);
    
    // Update it
    a.content="Blah blah";
    db.Update(a);
    
    // Delete it
    db.Delete(a);

      delete和update的其它方式:

    // Delete an article
    db.Delete<article>("WHERE article_id=@0", 123);
    
    // Update an article
    db.Update<article>("SET title=@0 WHERE article_id=@1", "New Title", 123);

      忽略某列:

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

      使用类和列的属性来指明哪些列需要映射:

    // 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;}
    } 

    T4 模板:

    • PetaPoco.Core.ttinclude - includes all the helper routines for reading the DB schema(数据库模式)
    • PetaPoco.Generator.ttinclude - the actual template that defines what's generated(实体模板)
    • Database.tt - the template itself that includes various settings and includes the two other ttinclude files.(模板本身)

      use the template:

    1. Add the three files to you C# project
    2. Make sure you have a connection string and provider name set in your app.config or web.config file
    3. Edit ConnectionStringName property in Records.tt (ie: change it from "jab" to the name of your connection string)
    4. Save Database.tt.

    自动的Select语句:

      运行一个不以select开头的查询, PetaPoco会自动的将它加上。

    IsNew 和Save 方法:

      IsNew:检测是否为新增。

      Save:根据判断的结果执行Insert或Update。

    事务:

    using (var scope=db.Transaction)
    {
        // Do transacted updates here
    
        // Commit
        scope.Complete();
    }

    注意:为了使用事务,所有操作都需要相同的PetaPoco Database对象实例。

     

    只要心中有梦,不管什么天气都适合睡觉
  • 相关阅读:
    Python-异常处理机制
    递归函数——斐波那契数列j
    函数及相关操作
    字符串及相关操作
    集合及相关操作
    元组
    字典
    列表元素增删改排操作
    multiprocessing模块简单应用
    02 for循环创建进程
  • 原文地址:https://www.cnblogs.com/mmry/p/6239120.html
Copyright © 2011-2022 走看看