|
构造我自己的ORM
通过前面两章的描述,我相信很多朋友都已经明白我了下面将要讨论到的ORM的实现方法了,那就是根据自定义Attribute来定义O/R Mapping规则,然后通过反射来动态获取此规则,动态构造SQL语句。
由于这个小东西(ORM)出生在深圳,所以我想来想去,她应该有个深圳的名字,所以我就叫她“MiniORM”。不知道各位认为如何?
MiniORM采用的是ONE_INHERIT_TREE_ONE_CLASS(一个继承树对应于一个表)的结构,虽然这种结构容易导致数据冗余,但是这种结构很简单。另,本MiniORM 仅仅考虑一个表一个PK,一个FK的情况。
MiniORM结构如下,为了更便于理解和使用,我使用了3个类:
1、OrmWriter:负责将实体对象(比如前面章节说的Person)插入数据库和修改数据库中对应的记录。
2、OrmRemover:负责根据实体对象,删除指定的记录;
3、OrmReader:负责根据实体对象,读取指定的记录;

上面就是MiniORM的3个主要类。下面我们就详细地根据前面的描述一步步构造她。我们这里还是以前面说的Person为例进行说明。
通过本系列第一章,我们知道,对象不但存在继承关系,特别在实际的应用中还存在包含关系,比如一个Person包含两个Hand(手)类,包含一个Head(头)类等,我们的Person在数据库中应该有一个ID,为了更加方便使用和讨论,此ID在MiniORM中是一个int以及自动增长类型(ID INDENTITY(1,1))。这些都是我们的MiniORM应该考虑的范围。
我们对我们的Person做修改:
<div class="highlighter">
- [DataObjectAttribute("Person")]
- publicclassPerson
- {
- privateint_ID;
- privatestring_Name;
- privateint_Age;
- privatestring_Sex;
- privateHead_Head;
- privateHand_LeftHand;
- privateHand_RightHand;
- publicintID
- {
- get{return_ID;}
- set{_ID=value;}
- }
- publicHeadHead
- {
- get{return_Head;}
- set{_Head=value;}
- }
- publicHandLeftHand
- {
- get{return_LeftHand;}
- set{_LeftHand=value;}
- }
- publicHandRightHand
- {
- get{return_RightHand;}
- set{_RightHand=value;}
- }
- [DataFieldAttribute("name","NvarChar")]
- publicstringName
- {
- get{returnthis._Name;}
- set{this._Name=value;}
- }
- [DataFieldAttribute("age","int")]
- publicintAge
- {
- get{returnthis._Age;}
- set{this._Age=value;}
- }
- [DataFieldAttribute("sex","NvarChar")]
- publicstringSex
- {
- get{returnthis._Sex;}
- set{this._Sex=value;}
- }
- }
|
|