SPL ORM 实现基本原理

 
spl包含Persisteraps(spl Persister kit)两部分内容。PersisterORM提供对象持久、关系对象查询、简单事务处理、简单异常管理等功能。数据持久包括一些对象的InsertDeleteUpdateFind等功能,关系对象查询则提供一些基于对象的复杂关系查询。APs是基于vs.net 2003开发的外接程序,职责是帮助开发人员快速映射关系数据库中的业务模型到符合Persister要求的映射实体类,理论上可以根据设置快速生成一个可以运行的web项目。
 
ORM实现的前期工作中,为了实现屏蔽各种数据库之间的操作差异,我们需要定义数据操作公有接口,封装基本的数据库InsertUpdateDeleteQuery等操作。
public sealed class DbHelper{
int ExecNonQuery(string cmdText);
int ExecDataSet(string cmdText,DataSet entity); 
object ExecScalar(string cmdText);

}

完成后,就是ORM主角——实体(Entity)的实现。ORM中实体的定义可以通过实体类自身包含数据模型元数据的方式实现,也可以通过定义XML的元描述实现。下面讲述了通过实体类自身映射的实现。
实体(Entity)是实际业务数据的载体,包含业务数据模型的元描述,可以直接由数据库中的某张表或视图生成,也可以根据需要手工创建。.NET中提供了System.Attribute,该类包含访问和测试自定义属性的简便方法。.NET Framework预定义了一些属性类型并使用它们控制运行时行为。我们可以通过继承System.Attribute基类自定义用于描述实体对象映射时所需要的数据模型元数据,包括表名,字段名,字段长度,字段类型等一些常用的数据
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class ClassAttribute: Attribute

AttributeUsage用来表示该自定义属性可以被绑定在什么样的对象上,这里表示应用在Class或者Struct之上。
定义一般字段所需要的自定义属性类。
[AttributeUsage(AttributeTargets.Property)]
public class PropertyAttribute: BaseFieldAttribute

定义关键字字段所需的自定义属性类。
[AttributeUsage(AttributeTargets.Property)]
public class KeyAttribute: BaseFieldAttribute
实体定义完成后,我们需要根据实体类中绑定的自定义属性构造出运行期需要的SQL语句,为了收集实体类定义中的数据结构描述,我们需要定义一个类来说明实体在运行期所引用到的所有关于数据持久的信息,包括关键字字段,一般字段等。
internal class EntityObjInfo
以上条件具备后,我们需要定义一个工厂类,负责转换数据的程序类型到数据库字段类型,并且构造出InsertUpdateDeleteQuery等操作所需要的SQL语句。
internal class SessionFactory

会话接口
public abstract class Session
以及会话的实现
public class SessionImp
会话实现时会将数据实体信息缓存在hashtable中,
//取得实体类型反射信息
EntityObjInfo eoi = SessionFactory.GetEOI(theClass);

这样我们就可以通过实体信息构造出实体对象,并依据绑定的属性执行
DbHelper中的操作。
DbHelper.ExecuteScalar(tx,CommandType.Text,sqls);
并将返回的数据保存在实体对象中
private object DataRowToEntityObject(DataRow row,Type theClass)
原文地址:https://www.cnblogs.com/sukyboor/p/372231.html