本文只是对基本使用的一个心得,更多更详细的使用方法请参考官方博客教程: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对象,这样对线程访问就不会有数据库连接冲突。