本文只是对基本使用的一个心得,更多更详细的使用方法请参考官方博客教程:http://www.toptensoftware.com/petapoco/
PetaPoco是一个轻量级的数据库访问库,从网上下载下来的是一个 .cs 文件直接放入你的项目中就可以使用。
PetaPoco的类限定均是 internal,注意使用范围
主要类为 PetaPoco.Database
PetaPoco是一个ORM,需要与数据库表相互映射的实体类,并为其添加属性。所以PetaPoco所有操作都是围绕着实体类进行的。
* 后面的代码都是项目部分代码,并不能直接运行,只是拿来讲解对照的。
[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 属性,标识实体类该属性不属于映射的数据表,在表操作映射时忽略这个属性。
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")) { // 增删查改等操作 ... }
了解数据库的都知道,事务作为失败回滚等有很好的应用性。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(); }
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的实体类。
在老版本中,PetaPoco是不支持GUID转换的,也就是实体对象中不能有GUID类型的属性,不然会出现异常。
因为PetaPoco是有连接池的,所以理所应当的就在类中只实例化了一个DataBase对象,但是在对线程的时候还是会出现数据库连接已存在的异常。
不知道是使用方式问题还是其他原因,多次不同场景实验失败后,发现了相对保守的多线程访问方法。在每次查询的时候才实例化DataBase对象,这样对线程访问就不会有数据库连接冲突。