DataRabbit 轻量的数据访问框架(00) -- 序
来源:互联网 发布:医学实验技术专业 知乎 编辑:程序博客网 时间:2024/05/29 13:03
(最新版本为DataRabbit 3.0,从此处下载。)
DataRabbit支持基于关系(Relation)的数据库操作和基于ORM的数据库操作,内置了对Oracle和SqlServer的支持,并且可以通过插件的方式对其它数据库类型提供支持。DataRabbit中的所有访问器(ITransactionAccesser)即可以在事务上下文中访问数据库,也可以在非事务中访问数据库。使用DataRabbit,几乎可以避免绝大多数的需要在程序中手写的Sql语句,这样,你的程序会更安全,并且更容易修改和维护。
在正式了解DataRabbit之前,也许先读一下《DataRabbit的背后(1)-―走进DataRabbit上下文》效果更好,这篇文章为了解DataRabbit做了一些必要的铺垫。
1.DataRabbit中的访问器
DataRabbit主要包含以下几种访问器:
(1)针对ORM的访问器(IOrmAccesser)(及 续篇)
(2)针对数据库的Relation访问器(IRelationAccesser)
(3)针对Table的Relation访问器(ITableAccesser)
(4)针对存储过程的访问器(ISPAccesser)
(5)基于ORM的对象关系加载器(IEntityRelationLoader)
(6)数据大纲访问器(IDataSchemaAccesser)
所有的访问器都向使用者屏蔽了地层的IDbCommand、IDbConnection等对象,使用者不必再关心打开连接、执行命令、关闭连接等繁琐底层的操作。这些访问器都从ITransactionAccesser接口继承,它们的类图如下所示:
DataRabbit的ORM非常轻量,它具有如下特点:
(1)使用反射与泛型技术实现ORM访问器(IOrmAccesser)。(最新的3.0版本基于泛型和Emit技术实现)
(2)使用ORM不需要任何配置文件(采用“约定”优于“配置”原则,Entity对象与数据表结构完全一致,可由工具自动生成)
(3)可以将数据库之间的主从表关系映射为Entity之间的关系,并可以依据主外键来加载Entity。
(4)对数据库表的结构没有任何要求。(比如,有的ORM框架要求数据表必须具有主键等)
2.大纲操作
3.数据分页
可以通过IPagerManager接口来进行数据分页操作(全部采用程序实现,不需要存储过程的支持)。
4.DataRabbit入口 -- IDataAccesser
上述的各种访问器、大纲操作者、分页管理器等等实例都可以通过IDataAccesser中的对应方法获得。
比如,获取针对表Student的ORM访问器:
注意,针对一个数据库,我们只需要维护一个IDataAccesser实例即可。
5.DataAccesserFactory
那么,从何处获取IDataAccesser实例了?答案是DataAccesserFactory。
DataRabbit支持基于关系(Relation)的数据库操作和基于ORM的数据库操作,内置了对Oracle和SqlServer的支持,并且可以通过插件的方式对其它数据库类型提供支持。DataRabbit中的所有访问器(ITransactionAccesser)即可以在事务上下文中访问数据库,也可以在非事务中访问数据库。使用DataRabbit,几乎可以避免绝大多数的需要在程序中手写的Sql语句,这样,你的程序会更安全,并且更容易修改和维护。
在正式了解DataRabbit之前,也许先读一下《DataRabbit的背后(1)-―走进DataRabbit上下文》效果更好,这篇文章为了解DataRabbit做了一些必要的铺垫。
1.DataRabbit中的访问器
DataRabbit主要包含以下几种访问器:
(1)针对ORM的访问器(IOrmAccesser)(及 续篇)
(2)针对数据库的Relation访问器(IRelationAccesser)
(3)针对Table的Relation访问器(ITableAccesser)
(4)针对存储过程的访问器(ISPAccesser)
(5)基于ORM的对象关系加载器(IEntityRelationLoader)
(6)数据大纲访问器(IDataSchemaAccesser)
所有的访问器都向使用者屏蔽了地层的IDbCommand、IDbConnection等对象,使用者不必再关心打开连接、执行命令、关闭连接等繁琐底层的操作。这些访问器都从ITransactionAccesser接口继承,它们的类图如下所示:
DataRabbit的ORM非常轻量,它具有如下特点:
(1)使用反射与泛型技术实现ORM访问器(IOrmAccesser)。(最新的3.0版本基于泛型和Emit技术实现)
(2)使用ORM不需要任何配置文件(采用“约定”优于“配置”原则,Entity对象与数据表结构完全一致,可由工具自动生成)
(3)可以将数据库之间的主从表关系映射为Entity之间的关系,并可以依据主外键来加载Entity。
(4)对数据库表的结构没有任何要求。(比如,有的ORM框架要求数据表必须具有主键等)
2.大纲操作
DataRabbit支持与数据大纲(DataSchema)相关的操作,比如提取某个数据库表的大纲,或者依据某个大纲创建对应的数据库表。这可以通过 IDataSchemaAccesser 接口来完成。与大纲操作相关的类图如下所示:
3.数据分页
可以通过IPagerManager接口来进行数据分页操作(全部采用程序实现,不需要存储过程的支持)。
4.DataRabbit入口 -- IDataAccesser
上述的各种访问器、大纲操作者、分页管理器等等实例都可以通过IDataAccesser中的对应方法获得。
比如,获取针对表Student的ORM访问器:
IOrmAccesser<Student> stuOrmAccesser = this.dataAccesser.GetOrmAccesser<Student>(null);
//获取所有年龄大于20岁的学生
IList<Student> stuList = stuOrmAccesser.GetMuch(new Filter(Student._Age, 20, ComparisonOperators.Greater));
//获取所有年龄大于20岁的学生
IList<Student> stuList = stuOrmAccesser.GetMuch(new Filter(Student._Age, 20, ComparisonOperators.Greater));
注意,针对一个数据库,我们只需要维护一个IDataAccesser实例即可。
5.DataAccesserFactory
那么,从何处获取IDataAccesser实例了?答案是DataAccesserFactory。
DataConfiguration config = new DataConfiguration(DataBaseType.SqlServer, "127.0.0.1", "sa", "chenqi", "AutoSchedulerSystem", null)
IDataAccesser dataAccesser = DataAccesserFactory.CreateDataAccesser(config);
IDataAccesser dataAccesser = DataAccesserFactory.CreateDataAccesser(config);
6.对N层架构的支持
DataRabbit如何更好地融合到N层架构中了?如何支持BL层、Data层、BEM层?
(1)TransactionScope,事务范围,从某个事务返回对象获取的各种访问器实例都工作于同一个事务上下文中。TransactionScope实例通常在Business Flow子层中创建。
(2)将DataRabbit融入架构
在后续的文章中,会逐一介绍上面提到的各个DataRabbit组件,下面给出DataRabbit框架的最新版本dll下载,以及一个非常简单的ORM示例源程序,大家可以仿这段程序尝试一下DataRabbit的ORM功能。
using DataRabbit;
using DataRabbit.Core;
using DataRabbit.ORM;
DataConfiguration config = new DataConfiguration(DataBaseType.SqlServer, "127.0.0.1", "sa", "chenqi", "AutoSchedulerSystem", null)
IDataAccesser dataAccesser = DataAccesserFactory.CreateDataAccesser(config);
IOrmAccesser<Student> stuOrmAccesser = dataAccesser.GetOrmAccesser<Student>(null);
//将ID为30的学生的Email更新
Student student = stuOrmAccesser.GetOne(new Filter(Student._ID, 30));
student.Email = "sky@299.com";
stuOrmAccesser.Update(student);
//插入一个新的Student
Student ss = new Student();
ss.ID = 90;
ss.Email = "sky.zhuwei@163.com";
stuOrmAccesser.Insert(ss);
//返回所有Age大于20岁且为男性的学生的DataSet,只需要ID、Name、Age等信息
IList<Filter> conditions = new List<Filter>();
conditions.Add(new Filter(Student._Age, 20, ComparisonOperators.Greater));
conditions.Add(new Filter(Student._IsBoy, true, ComparisonOperators.Equal));
IFilterTree conditionTree = new SimpleFilterTree(LogicType.And, conditions);
DataSet ds = stuOrmAccesser.GetDataSet(conditionTree, Student._ID ,Student._Name ,Student._Age);
using DataRabbit.Core;
using DataRabbit.ORM;
DataConfiguration config = new DataConfiguration(DataBaseType.SqlServer, "127.0.0.1", "sa", "chenqi", "AutoSchedulerSystem", null)
IDataAccesser dataAccesser = DataAccesserFactory.CreateDataAccesser(config);
IOrmAccesser<Student> stuOrmAccesser = dataAccesser.GetOrmAccesser<Student>(null);
//将ID为30的学生的Email更新
Student student = stuOrmAccesser.GetOne(new Filter(Student._ID, 30));
student.Email = "sky@299.com";
stuOrmAccesser.Update(student);
//插入一个新的Student
Student ss = new Student();
ss.ID = 90;
ss.Email = "sky.zhuwei@163.com";
stuOrmAccesser.Insert(ss);
//返回所有Age大于20岁且为男性的学生的DataSet,只需要ID、Name、Age等信息
IList<Filter> conditions = new List<Filter>();
conditions.Add(new Filter(Student._Age, 20, ComparisonOperators.Greater));
conditions.Add(new Filter(Student._IsBoy, true, ComparisonOperators.Equal));
IFilterTree conditionTree = new SimpleFilterTree(LogicType.And, conditions);
DataSet ds = stuOrmAccesser.GetDataSet(conditionTree, Student._ID ,Student._Name ,Student._Age);
Student表对应的Entity class如下(Entity class可以使用工具自动生成,比如我提供的EntityCreator工具,以后会给大家下载):
StudentEntity
#region StudentEntity
public class Student
{
#region Force Static Check
public const string TableName = "Student";
public const string _ID = "ID";
public const string _Name = "Name";
public const string _Age = "Age";
public const string _Email = "Email";
public const string _IsBoy = "IsBoy";
#endregion
#region IsBoy
private System.Boolean m_IsBoy = true;
public System.Boolean IsBoy
{
get { return m_IsBoy; }
set { m_IsBoy = value; }
}
#endregion
#region ID
private System.Int32 m_ID = 0;
public System.Int32 ID
{
get
{
return this.m_ID;
}
set
{
this.m_ID = value;
}
}
#endregion
#region MentorID
private System.Int32 m_MentorID = 0;
public System.Int32 MentorID
{
get
{
return this.m_MentorID ;
}
set
{
this.m_MentorID = value;
}
}
#endregion
#region Name
private System.String m_Name = "";
public System.String Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
#endregion
#region Age
private System.Int32 m_Age = 0;
public System.Int32 Age
{
get
{
return this.m_Age;
}
set
{
this.m_Age = value;
}
}
#endregion
#region Email
private System.String m_Email = "";
public System.String Email
{
get
{
return this.m_Email;
}
set
{
this.m_Email = value;
}
}
#endregion
}
#endregion
#region StudentEntity
public class Student
{
#region Force Static Check
public const string TableName = "Student";
public const string _ID = "ID";
public const string _Name = "Name";
public const string _Age = "Age";
public const string _Email = "Email";
public const string _IsBoy = "IsBoy";
#endregion
#region IsBoy
private System.Boolean m_IsBoy = true;
public System.Boolean IsBoy
{
get { return m_IsBoy; }
set { m_IsBoy = value; }
}
#endregion
#region ID
private System.Int32 m_ID = 0;
public System.Int32 ID
{
get
{
return this.m_ID;
}
set
{
this.m_ID = value;
}
}
#endregion
#region MentorID
private System.Int32 m_MentorID = 0;
public System.Int32 MentorID
{
get
{
return this.m_MentorID ;
}
set
{
this.m_MentorID = value;
}
}
#endregion
#region Name
private System.String m_Name = "";
public System.String Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
#endregion
#region Age
private System.Int32 m_Age = 0;
public System.Int32 Age
{
get
{
return this.m_Age;
}
set
{
this.m_Age = value;
}
}
#endregion
#region Email
private System.String m_Email = "";
public System.String Email
{
get
{
return this.m_Email;
}
set
{
this.m_Email = value;
}
}
#endregion
}
#endregion
资源下载:
1.DataRabbit 2.0下载 (最后一次更新时间:2007-03-23 09:40:00)
2.EntityCreator小工具:用于自动生成Entity Class
3. 2.0 Demo示例下载(由好友getsun提供)
4.最新版本DataRabbit 3.0下载!(2007.07.28)
其它文章:
(1)DataRabbit 3.0 ORM性能大幅度提升!
(2)DataRabbit 3.0 与 Linq to sql 性能比较
(3)Batch Insert 批插入!
可以加入QQ群:37677395 一起探讨DataRabbit
- DataRabbit 轻量的数据访问框架(00) -- 序
- DataRabbit 轻量的数据访问框架(12)-- 将DataRabbit融入架构
- DataRabbit 轻量的数据访问框架(08) -- DataRabbit 的入口点:TransactionScopeFactory和TransactionScope
- DataRabbit 轻量的数据访问框架(14)-- DataRabbit 3.0 与 Linq to sql 性能比较
- DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!
- DataRabbit 轻量的数据访问框架(15)-- IOrmAccesser的BatchInsert批量插入!
- DataRabbit 轻量的数据访问框架(03) -- IOrmAccesser(续)
- DataRabbit 轻量的数据访问框架(03) -- IOrmAccesser(续)
- DataRabbit 轻量的数据访问框架(02) -- IOrmAccesser
- DataRabbit 轻量的数据访问框架(04) -- IEntityRelationLoader
- DataRabbit 轻量的数据访问框架(05) -- ITableAccesser
- DataRabbit 轻量的数据访问框架(06) -- IRelationAccesser
- DataRabbit 轻量的数据访问框架(19)-- 读写分离与隔离级别
- DataRabbit 轻量的数据访问框架(10) -- IPagerManager
- DataRabbit 轻量的数据访问框架(09) -- IDataSchemaAccesser
- DataRabbit 轻量的数据访问框架(07) -- ISPAccesser
- DataRabbit 轻量的数据访问框架(06) -- IRelationAccesser
- DataRabbit 轻量的数据访问框架(05) -- ITableAccesser
- 也谈正则表达式
- JSF编程的一些笔记(摘抄)
- 初涉龙芯I/龙芯II
- 【C#】串口操作实用类
- 2007微软MVP获得连任
- DataRabbit 轻量的数据访问框架(00) -- 序
- CSDN技术大会
- .Net 平台SerialPort类内部实现探秘
- 简单生活.
- CSDN技术大会场记
- 原来不一样的2007是这样的不一样!
- JDBC连接数据库经验技巧集萃
- FTP数据上传及WinCE系统FTP根目录设定
- 使用正则表达式