三方ORM库PetaPoco使用总结

本文只是对基本使用的一个心得,更多更详细的使用方法请参考官方博客教程:http://www.toptensoftware.com/petapoco/

PetaPoco是一个轻量级的数据库访问库,从网上下载下来的是一个 .cs 文件直接放入你的项目中就可以使用。如果不满足于PetaPoco的使用,可以看看它的一个发行版本NPoco是否满足你的需要。

使用须知

PetaPoco的类限定均是 internal,注意使用范围

主要类为 PetaPoco.Database

PetaPoco是一个ORM,需要与数据库表相互映射的实体类,并为其添加属性。所以PetaPoco所有操作都是围绕着实体类进行的。

基本使用

* 后面的代码都是项目部分代码,并不能直接运行,只是拿来讲解对照的。

1.编写与表对应的类,并添加描述属性

[PetaPoco.TableName("personinfo")]
[PetaPoco.PrimaryKey("ID", autoIncrement = false)]
public class PersonInfo
{
    public string ID { get; set; }
    
    public string Name { get; set; }
    
    [PetaPoco.ResultColumn]
    public string FeatureUrl { get; set; }
    
    [PetaPoco.Ignore]
    public int MaxScore { get; set; }
}

PetaPoco.TableName(); 方法,设置实体类所对应的数据表。

PetaPoco.PrimaryKey(); 方法,设置实体类中与表中的主键字段所对应的属性。

PetaPoco.ResultColume 属性,标识该属性不属于映射的数据表,但作为某些连表查询所返回的数据表外字段,在其他操作时忽略这个属性。

PetaPoco.Ignore 属性,标识实体类该属性不属于映射的数据表,在表操作映射时忽略这个属性。

2.普通数据库操作

string sqlConnectionString = "Server=localhost;Database=facepro;Uid=root;Pwd=root;Port=3306;pooling=true;charset=utf8";
using(Database db = new Database(sqlConnectionString, "MySql.Data.MySqlClient"))
{
    // 增删查改等操作
    ...
}

3.带事务的数据库操作

了解数据库的都知道,事务作为失败回滚等有很好的应用性。PetaPoco也支持事务,只需要给数据库对象添加一个事务即可。

string sqlConnectionString = "Server=localhost;Database=facepro;Uid=root;Pwd=root;Port=3306;pooling=true;charset=utf8";
using(Database db = new Database(sqlConnectionString, "MySql.Data.MySqlClient"))
{
    // 两种添加事务的方式
    Transaction  t = db.GetTransaction();
    //Transaction t = new Transaction(db);
    
    // 增删查改等查询操作
    ...
    
    //完成事务操作
    t.Complete();
}

4.数据库操作

PetaPoco中DataBase类查询操作非常丰富,可以使用Execute();方法执行完整的sql语句。也可以使用很多封装后的各种查询方法,以下代码使用的就是这类方法中的一部分。

这里需要注意的是,PetaPoco是将实体类的映射,转换成对表操作的sql语句,所以在操作中有时需要添加一定的sql代码。

比较厉害的就是它往往只需要你添加最主要,其他的它能够自动生成与拼接。

db.Insert(personInfo);// 插入一个已经实例化并包含数据的PersonInfo类对象

//按主键删除
db.Delete<PersonInfo>(ID);// 在表中删除一个指定类型的主键为变量ID值的记录
//按非主键删除
db.Delete<PersonInfo>("where Name=@0;", "zhangsan");

关于查的操作方法非常丰富,这里是其中几种。

Query();‍‍和‍‍Fetch();是对表进行遍历查询,返回的结果是一个枚举型的集合,根据存在记录的条数,集合为空或者包含1~N个对象

Single();或者SingleOrDefault();均是单个查询,

// sql查询字符串查询
string sql = "select ID,Name from personinfo where Name = 'zhangsan'";
db.Query<PersonInfo>(sql);

// 使用sql组合工具类
Sql sql = Sql.Builder
                .Select("ID,Name")
                .From("personinfo")
                .Where("ID = @0", ID);
db.Query<PersonInfo>(sql);

// 单个查询
db.Single<PersonInfo>(sql);// 未查到,会抛出异常InvalidOperationException
db.SingleOrDefault<PersonInfo>(sql);// 未查到为查询的泛型类型的default

db.Update(person);// 在表中更新与该对象对应的记录,在使用对象更新的时候会将对象所有表中字段对应的属性值都更新,即使是空值或者默认值。
db.Update<PersonInfo>(sql); // 在更新部分字段的时候就可以使用这个重载。

分页

想要使用PetaPoco查询到页面长度为X的第N页的数据时,使用Page();这个方法。

Page<PersonInfo> p = db.Page<PersonInfo>(page, pageLength, sql);
// 参数中Page为需要查询的页码,从1开始,PageLength为每页长度,sql为查询字符串或者sql类对象
p.TotalPages;// 总页数
p.TotalItems;// 总记录数
p.ItemsPerPage;// 当前页记录数
p.Items;// 当前页的记录
p.CurrentPage;// 当前页码

* 因为前面提到PetaPoco的类都是internal,所以在其他项目中要使用page的信息的话,还需要自己编写一个另一个page的实体类。

问题

1.GUID支持问题

在老版本中,PetaPoco是不支持GUID转换的,也就是实体对象中不能有GUID类型的属性,不然会出现异常。

2.多线程并发问题

因为PetaPoco是有连接池的,所以理所应当的就在类中只实例化了一个DataBase对象,但是在对线程的时候还是会出现数据库连接已存在的异常。

不知道是使用方式问题还是其他原因,多次不同场景实验失败后,发现了相对保守的多线程访问方法。在每次查询的时候才实例化DataBase对象,这样对线程访问就不会有数据库连接冲突。

    原文作者:术士冲前面
    原文地址: https://www.jianshu.com/p/6f3253d356fe
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞