我以前发布过这个数据层的介绍,一直没有做细致的说明,这次分几部分好好介绍。
(一)简单介绍:http://www.cnblogs.com/qingdie/p/3803696.html
(二)使用说明:http://www.cnblogs.com/qingdie/p/3803710.html
(三)开发实例:http://www.cnblogs.com/qingdie/p/3803745.html
以下是使用说明文档:
倾蝶网络科技 |
倾蝶数据层 |
倾蝶数据层1.4 |
目录
Qingdiedb使用说明... 2
1.4.1版更新说明... 2
1、 摘要... 2
本次版本的功能概要:... 2
几点说明:... 2
2、 准备工作... 4
2.1类库引用... 4
2.2 DbConfig配置... 4
2.3持久化维护... 5
3、 数据库操作... 5
3.1查询操作... 6
3.2删除操作... 7
3.3更新操作... 8
3.4添加操作... 8
3.5事务处理... 8
3.6创建数据库... 9
3.7创建表... 9
4、 数据迁移插件... 9
5、 后续开发... 10
1. 增加数据库支持... 10
2. 增加新方法... 10
Qingdiedb使用说明
1.4.1版更新说明
本次更新代码进了重构,实现前所未有的功能突破,经过几个项目的实际开发,实用性更加强大,使用更加灵活.
1) 增加几个数据库的支持
经过测试,sqlserver,access,sqlite,oracle可以很好的灵活切换.
2) 抽象了数据操作
3) 增加了一个数据迁移插件,可以方便地将数据在各数据库直接迁移,如:可以将数据从sqlite迁移到sqlserver或其他数据库
4) 添加了一个lambda表达式条件动态构造类,可以更加简洁的构造查询条件。
此次版本后不再建立实体操作类进行数据操作,所有数据操作由数据上下文DbContext实例完成,使用Using语句可对资源释放。具体操作见下面的详细介绍。
1、摘要
本类库目前可以实现sqlserver、access、mysql、oracle、sqlite数据库CRUD基本操作(增、删、改、查)和持久化生成。适用于安装了Microsoft.net framework3.5的windows环境。提供源代码和类库文件,你可以使用本类库进行各种开发和传播,但请保持本代码的完整性。
本次版本的功能概要:
- 支持sqlser,Access,Oracle,sqlite,mysql数据库
- 支持并发
- 支持数据缓存
- 支持外键检测和主键信息读取
- 支持数据排序,
- 支持指定列数据读取
几点说明:
1. 实体类结构
所有持久化类,即在数据库中有 对应表的类必须按照以下格式
1)实体类名为数据库表名
2)属性名为字段名
3)数值类型必须可空即为int? 、float?、datetime?
4)属性配置了Identity=true的字段支持自增,不支持的数据库如oracle有数据层辅助实现。可以放心使用
2. 配置信息
1)使用前必须配置
2)添加了新数据库支持的必须配置dbAssembly
1) 和ADO.net的linq to sql的对比
时间均为毫秒
时间对比:数据量小时第一次查询时间只是ADO.net的linq to sql的时间的进三分之一。
程序 |
最大时间 |
最小时间 |
平均 |
数据量 |
|||
link to sql |
620 |
424 |
576 |
数据库2条 返回1条 |
|||
Qingdiedb |
225 |
146 |
196 |
||||
link to sql |
1057 |
609 |
692 |
数据库6331 返回10条 |
|||
Qingdiedb |
330 |
314 |
324 |
||||
连续查询 |
|||||||
程序 |
第一次 |
第二次 |
第三次 |
数据量 |
|||
Qingdiedb |
321 |
332 |
263 |
数据库6331 返回10条 |
|||
link to sql |
989 |
59 |
35 |
||||
根据数据显示,link to sql 使用了数据缓存技术将数据缓存于内存以消耗内存为代价减少了反复查询的时间。数据量少是本程序速度明显比link to sql快。而连续查询link to sql明显比本程序快。连续查询时间都减少了,我想 sqlserver做了一些处理。
内存对比:
我在6300条数据中进行查询10条数据,本程序查询过程中消耗内存12.2Mb如图1-1
而link to sql在查询过程中消耗内存为31.1MB如图1-2
图1-1本程序内存消耗图截图是在查询结果返回时设置断点。
图1-2 link to sql内存消耗图
CPU对比
从图1-1和1-2对比明显发现本程序消耗的CPU明显比link to sql少,
此截图为在查询过程中抓截的,为执行语句时的资源消耗。
2) 和ADO.net的linq to sql的对比(1.2.0版本)
连续查询 |
||||
程序 |
第一次 |
第二次 |
第三次 |
数据量 |
link to sql |
846 |
48 |
46 |
数据库1079 返回10条 |
Qingdiedb |
719 |
0 |
0 |
可明显看到在加入数据缓存后连续查询基本不消耗时间
2、准备工作
2.1类库引用
在项目文件上右击添加引用Qingdiedb.dll如图2-1
特别说明:Qingdiedb.XML和Qingdiedb.dll在同一目录下添加应用才可在开发时有代码提示如图2-2
图2-1添加应用
2.2 DbConfig配置
实例化DbConfig进行配置如:
var backup = new DbConfig
{
DbType = "access",
DbAssembly = "AccessDataContext",
DataBase = new DataBaseInfo
{
Database = "backup.mdb",
User = "admin",
Password = "ping"
},
};
backup.Dbconnstring = Database.GetConnectionString(backup);
属性 |
是否可选 |
Value |
说明 |
dbType |
否 |
Sqlserver |
Sqlserver数据库 |
Access |
Access数据库 |
||
Oracle |
Oracle数据库 |
||
|
|
Sqlite |
Sqlite数据库 |
Cache |
否 |
True |
启用数据缓存 |
False |
不用数据缓存 |
||
不配置 |
启用数据缓存 |
||
cachetime |
是 |
整数 分钟 |
设置数据缓存的时间 |
不配置 |
默认为10分钟 |
||
Relate |
是 |
True |
启用外键关联数据读取 |
False |
不用外键关联数据读取 |
||
不配置 |
启用外键关联数据读取 |
||
dbAssembly |
是 |
不配置 |
为默认类库Qingdiedb |
新加数据类库名称 |
配置为新加数据类库名称 |
2.3持久化维护
从实体到生成数据库,采用标准sql语句进行数据库表字段约束等生成。这要求先建立好实体,类前加标签Entity表示为持久化类必须指明主键,属性前可加标签Property指定持久化信息,加Relationship标签表名为关联类,如:
[Entity("UserID")]
public class UserInfo
{
[Property(Identity = true)]
public int? UserID { get; set; }
public string UserName { get; set; }
public string PassWord { get; set; }
[Relationship]
public EUserState State { get; set; }
public string Portrait { get; set; }
public DateTime? Regtime { get; set; }
public string ConfigJson { get; set; }
public string TrueName { get; set; }
[Property(IsNull = false)]
public bool? IsAdmin { get; set; }
}
实例化DbCreate对象,如果已经配置了DBConfig,则用默认构造函数实例化DbCreate对象否则传入DbInfo对象实例化如:
var db = new Database(config);
创建数据库:db.CreateDb();
创建表:db.CreateTables(typeof(UserInfo).Assembly);
3、数据库操作
进行数据库操作时先实例化数据库实体化类的对象。
所有条件均以lambda表达式表示。
如:
DbContext db = new DbContext ();
以下操作均使用db对象进行
3.1查询操作
1)单条数据查询
如要查询表tb_user里的一条数据
首先实例化tb_user的对象user
然后调用db的tb_user的Select()方法对其赋值。
具体使用如:
using (var db = new DbContext())
{
UserInfo user= db.Singordefault<UserInfo>(d => d.UserID == 4);
}
其中d为参数=>后为一布尔型表达式
2)多条数据查询
此查询返回的是一list类型的值,故需实例类的list对象
如:
using (var db = new DbContext())
{
List< UserInfo > users = db. Select < UserInfo > (d => d.Sex=="女");
}
users即为查询到的所有性别为女的用户信息
3)模糊查询
查询以指定字符开始的数据
如查询姓张的用户
using (var db = new DbContext())
{
List<UserInfo> users = db.Select<UserInfo>(d => d.UserName.StartsWith("张"));
}
查询包含指定字符的数据
如查询用户名包含中国的用户
using (var db = new DbContext())
{
List< UserInfo > articles = db.Select< UserInfo >(d=>d. UserName.Contains("中国"));
}
查询指定字符结束的数据
如查询用户名以明结尾的用户
using (var db = new DbContext())
{
List< UserInfo > users = db.Select< UserInfo >(d => d. UserName.EndsWith("明"));
}
4)指定字段查询
如只查询用户表里的姓名和密码并过滤相同项
List< UserInfo > users = db. Select< UserInfo >(null,d=>d. UserName,d=>d. PassWord);
查询后的数据只有属性UserName和PassWord有值其他均为null
List< UserInfo > users = db. Select< UserInfo >(null,d=>d. State);
List< UserInfo > users = db. Select< UserInfo >(null,d=>d. State. StateID);
以上两个查询结果不一样,第一个查询结果属性State对象的每个属性都有值,而第二个State的属性只有StateID有值。
3.2删除操作
此操作返回成功删除的行数
如删除所有性别为男的用户
int users = db. Delete< UserInfo >(d=>d.sex=="男");
3.3更新操作
此操作返回更新的行数,参数为更新的对象和条件
如更新姓名为xueping的用户电话为13188509182
UserInfo user=new UserInfo ();
user.tell="13188509182";
using (var db = new DbContext())
{
int users = db. Update(user, d => d.name = ="xueping");
}
3.4添加操作
有2个函数可以实现添加其中
Insert()操作返回添加成功数据的第一行第一列的值通常为主键
Add()无返回值,失败引发异常。
如添加用户xueping:
UserInfo user=new UserInfo ();
user. UserName = "xueping";
user.Email = "xueping@qingdie.net";
using (var db = new DbContext())
{
var userid=(int)db.Insert(user);
}
3.5事务处理
事务处理对所有操作均适用,调用BeginTransaction()操作开始事务,调用Commit();提交事务。在出现错误时自动回滚所有操作,并引发异常。
如:
UserInfo user = db.Singordefault<UserInfo>(d => d.UserID == 4);//取得用户
using (var db = new DbContext())
{
db.BeginTransaction();//开始事务
db.Delete<usermoney >(d=>d.userid==user.userid);//删除用户金额信息
db.Delete< UserInfo >(d => d.name == "xueping");//删除用户
db.Commit();//提交事务
}
如果在删除用户时发生错误,则自动回滚删除用户金额信息,即用户金额信息也不会被删除。
3.6创建数据库
var db = new Database(config);
if (!db.ExistDb())db.CreateDb();
3.7创建表
db.CreateTables(typeof(UserInfo).Assembly);
4、数据迁移插件
此次增加了对数据迁移的插件,使用此插件可以轻松对数据库进行备份还原,
以下为详细用法。迁移组件为:Qingdie.DataMigration.dll
var backup = new DbConfig
{
DbType = "access",
DbAssembly = "AccessDataContext",
DataBase = new DataBaseInfo
{
Database = "back.mdb",
User = "admin",
Password = "ping"
},
};
var database = new DbConfig().GetConfig();
using (var m = new Migration(database, backup, typeof(UserInfo).Assembly))
{
m.StartMigration();
}
即可将数据库备份到backup
5、组合条件构造
此次版本新增加的功能,用于更加简洁的构造组合查询条件,
如:
Var ids=new List<int>{1,2};
var lambda = Lambda.GetLambda< UserInfo >(d => d. userid.Include(ids));
if(disable) lambda = lambda.AndAlso(d=>d.State.Isable);
List< UserInfo > users = db. Select (lambda);
等同于var users = db. Select< UserInfo >(d => d. userid.Include(ids)&& d.State.Isable);
6、后续开发
1. 增加数据库支持
1)要增加一数据库的支持需要从类BaseDataContext继承,且类名为数据库类型加DataContext如果增加对mysql的支持需实现类
public class mysqlDataContext : BaseDataContext
需要进行DbConfig程序集名称配置参加2.2
在配置数据库类型时dbType的值为mysql
实现abstract class BaseDataContext,interface IMapping abstract class Query即可增加对新数据库的支持。
2. 增加新方法
要增加新的数据库操作方法,只需可以在类DbContext里实现要增加的方法即可
如添加一个新的查询操作SelectAll()此操作查询所有信息没有指定任何条件
namespace Qingdiedb
{
public class xxDbContext : DbContext
{
public List<T> SelectAll()
{
return (List<T>)Internal.Select<T>(null);
}
}
}