ORM映射框架总结--数据操作(一)

 

  ORM(对象关系映射) ,在我们印象中Hibernate是体现的比较明显的。因为它的轻量级和低入侵式,得到很多IT人士的亲睐。

  正是因为ORM 这种映射关系,使程序各个模块之间的耦合度大大降低,使得程序灵活多变。.NET 在Linq 出现之前几乎没有看到什么ORM映射框架,今年自己也.net 方面下了一番苦功夫学习,有小小成果就是自己写了一个ORM映射框架。在2009年的最后一天与大家分享

 

  程序总体设计思路:

 

  姑且用上面的图来表示整个框架的流程。其实就是用一些特性来描述实体和数据库之间的关系,当程序首次加载的时候,程序会去读取这些实体特性,并缓存到内存当中(这里使用的静态类来存储这些信息)。当用户提交表单封装实体之后,后面的实体解析类会根据各个不同的实体特性来组装一些sql语句,查询数据库并封装成实体对象或集合返回个客户端。

 

1.表特性类 TableAttribute

代码

 1 /**
 2  * 
 3  * 2009-4-11
 4  * 
 5  * 
 6  * 表特性的信息
 7  * */
 8 using System;
 9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 
13 namespace CommonData.Model
14 {
15     public sealed class TableAttribute:Attribute
16     {
17         private string name;
18 
19         /// <summary>
20         /// 表名称
21         /// </summary>
22         public string Name
23         {
24             get { return name; }
25             set { name = value; }
26         }
27         private string information;
28 
29         /// <summary>
30         /// 表信息
31         /// </summary>
32         public string Information
33         {
34             get { return information; }
35             set { information = value; }
36         }
37         private bool isInternal;
38 
39         /// <summary>
40         /// 是否国际化
41         /// </summary>
42         public bool IsInternal
43         {
44             get { return isInternal; }
45             set { isInternal = value; }
46         }
47 
48         /// <summary>
49         /// 无参数构造方法
50         /// </summary>
51         public TableAttribute()
52         { 
53         }
54 
55         /// <summary>
56         /// 有参数构造方法
57         /// </summary>
58         /// <param name="name">表名称</param>
59         /// <param name="information">表信息</param>
60         /// <param name="isInternal">是否国际化</param>
61         public TableAttribute(string name, string information, bool isInternal)
62         {
63             this.name = name;
64             this.information = information;
65             this.isInternal = isInternal;
66         }
67     }
68 }

 

  Hibernate 中是使用xml文件来实现实体类和数据库之间的关联,我这里是使用.net中的特性,当时是为了巩固自己所学习的知识,于是选择了特性。其实使用xml来实现数据和实体之间的映射更具灵活性。使用xml在程序部署之后,如果修改映射关系就不用重新编译。

  TableAttribute 特性就是用来标识实体类和数据库表之间的关系的,表特性中包含了三个信息。以上代码都有说明,这里不再讲解。值得注意的是:这个类被sealed 修饰,说明这个类不能被继承。这里就将一定规则限制在某个范围内,避免不要的规则添加进来。

 

2. 列特性类 ColumnAttribute

代码

  1 /**
  2  * 
  3  * 2009-4-11
  4  * 
  5  * 
  6  * 字段的特性
  7  * */
  8 using System;
  9 using System.Collections.Generic;
 10 using System.Linq;
 11 using System.Text;
 12 
 13 namespace CommonData.Model
 14 {
 15     public sealed class ColumnAttribute:Attribute
 16     {
 17         private string name;
 18         /// <summary>
 19         /// 字段名称
 20         /// </summary>
 21         public string Name
 22         {
 23             get { return name; }
 24             set { name = value; }
 25         }
 26         private DataType type;
 27         /// <summary>
 28         /// 字段类型
 29         /// </summary>
 30         public DataType Type
 31         {
 32             get { return type; }
 33             set { type = value; }
 34         }
 35         private int length;
 36         /// <summary>
 37         /// 字段长度
 38         /// </summary>
 39         public int Length
 40         {
 41             get { return length; }
 42             set { length = value; }
 43         }
 44         private string instro;
 45         /// <summary>
 46         /// 字段介绍
 47         /// </summary>
 48         public string Instro
 49         {
 50             get { return instro; }
 51             set { instro = value; }
 52         }
 53         private bool canNull;
 54         /// <summary>
 55         /// 字段是否可以为空
 56         /// </summary>
 57         public bool CanNull
 58         {
 59             get { return canNull; }
 60             set { canNull = value; }
 61         }
 62         private object defaultValue;
 63         /// <summary>
 64         /// 默认值
 65         /// </summary>
 66         public object DefaultValue
 67         {
 68             get { return defaultValue; }
 69             set { defaultValue = value; }
 70         }
 71         private bool primaryKey;
 72         /// <summary>
 73         /// 是否为主键
 74         /// </summary>
 75         public bool PrimaryKey
 76         {
 77             get { return primaryKey; }
 78             set { primaryKey = value; }
 79         }
 80         private bool autoIncrement;
 81         /// <summary>
 82         /// 是否自动增长
 83         /// </summary>
 84         public bool AutoIncrement
 85         {
 86             get { return autoIncrement; }
 87             set { autoIncrement = value; }
 88         }
 89 
 90         /// <summary>
 91         /// 无参数构造方法
 92         /// </summary>
 93         public ColumnAttribute()
 94         { 
 95         }
 96 
 97         /// <summary>
 98         /// 
 99         /// </summary>
100         /// <param name="name">字段名称</param>
101         /// <param name="type">字段类型</param>
102         /// <param name="length">字段长度</param>
103         /// <param name="instro">字段介绍</param>
104         /// <param name="canNull">字段是否可以为空</param>
105         /// <param name="defaultValue">默认值</param>
106         /// <param name="primaryKey">是否为主键</param>
107         /// <param name="autoIncrement">是否自动增长</param>
108         public ColumnAttribute(string name,
109             DataType type,
110             int length,
111             string instro,
112             bool canNull,
113             object defaultValue,
114             bool primaryKey,
115             bool autoIncrement)
116         {
117             this.name = name;
118             this.type = type;
119             this.length = length;
120             this.instro = instro;
121             this.canNull = canNull;
122             this.defaultValue = defaultValue;
123             this.primaryKey = primaryKey;
124             this.autoIncrement = autoIncrement;
125         }
126     }
127 }

 

   这个特新用于修饰实体类的属性,映射表的各个字段。它和表特性是一样的,只不过修饰对象不同。表特性的各个字段属性在代码中都有说明。

 

3. 列特性类 LinkTableAttribute

 

代码

 1 /**
 2  * 
 3  * 2009-4-11
 4  * 贺     臣
 5  * 
 6  * 主表的特性
 7  * */
 8 using System;
 9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 
13 namespace CommonData.Model
14 {
15     public class LinkTableAttribute:Attribute
16     {
17         private string name;
18         /// <summary>
19         /// 主表的名称
20         /// </summary>
21         public string Name
22         {
23             get { return name; }
24             set { name = value; }
25         }
26         private string sqlPrefix;
27 
28         /// <summary>
29         /// 前缀
30         /// </summary>
31         public string SqlPrefix
32         {
33             get { return sqlPrefix; }
34             set { sqlPrefix = value; }
35         }
36 
37         private Type _tableType;
38 
39         /// <summary>
40         /// 父表对象类型
41         /// </summary>
42         public Type TableType
43         {
44             get { return _tableType; }
45             set { _tableType = value; }
46         }
47 
48         /// <summary>
49         /// 有参数构造方法
50         /// </summary>
51         /// <param name="name">主表的名称</param>
52         public LinkTableAttribute(string name)
53         {
54             this.name = name;
55         }
56 
57         /// <summary>
58         /// 无参数构造方法
59         /// </summary>
60         public LinkTableAttribute()
61         { 
62         }
63     }
64 }

 

这个特性也是用于修饰实体属性的,但是这个特性有些不同,它是用于修饰实体属性的。也就是某个数据库表对应的实体作为此实体的一个属性。利用该特性是使各个实体之间参数逻辑关系,用于替代数据库的物理逻辑关系。这里有个特殊的地方就是没有使用sealed 修饰这个特性类。因为维持实体之间的关系还有一个 1-N 得关系,也就是某个实体集合作为一个实体的一个属性。这样更能体现出数据结构之间的关系。

 

4. 列特性类 LinkTablesAttribute

代码

 1 /**
 2  * 
 3  * 2009-4-11
 4  *
 5  * 
 6  * 子表的特性
 7  * */
 8 using System;
 9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 
13 namespace CommonData.Model
14 {
15     public sealed class LinkTablesAttribute:LinkTableAttribute
16     {
17         /// <summary>
18         /// 无参数构造方法
19         /// </summary>
20         public LinkTablesAttribute()
21         { 
22         }
23 
24         /// <summary>
25         /// 有参数构造方法,调用父类的构造方法
26         /// </summary>
27         /// <param name="name">表名称</param>
28         public LinkTablesAttribute(string name)
29             : base(name)
30         { }
31     }
32 }
33 

 

   上面的代码可以看出,这个类继承了列特性 LinkTablesAttribute, 这也就是LinkTablesAttribute不适用sealed修饰的原意。两者本质区别在于一个修饰实体类,一个修饰实体类集合

时间: 2024-10-27 17:58:34

ORM映射框架总结--数据操作(一)的相关文章

ORM映射框架总结--数据操作(七)

2. 数据库操作实现类 SqlHelper 代码 /** *  * 2009-4-22 *  *  * 数据库操作的公共类 * */using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection;using System.Data;using System.Data.SqlClient;using CommonData.Model; namespac

ORM映射框架总结--数据操作(二)

  1.TableInfo 封装实体特性类 代码  1 /** 2  *  3  * 2009-4-11 4  *  5  *  6  * 表实体的特性信息 7  * */ 8 using System; 9 using System.Collections.Generic;10 using System.Linq;11 using System.Text;12 using System.Reflection;13 14 namespace CommonData.Model15 {16     

ORM映射框架总结--数据操作(四)

  1.BaseEntityHelper 解析实体类特性 代码   1 /**  2  *   3  * 2009-4-17  4  *   5  *   6  * 字段的特性  7  * */  8 using System;  9 using System.Collections.Generic; 10 using System.Linq; 11 using System.Text; 12 using System.Reflection; 13 using CommonData.Model;

ORM映射框架总结--数据库操作库(精修版)

1.       ORM数据库操作原理 前面已经介绍过了个人ORM映射框架中的三个核心库: 实体-数据库 映射特性关系: http://www.cnblogs.com/qingyuan/archive/2010/04/02/1702998.html 实体分析器: http://www.cnblogs.com/qingyuan/archive/2010/04/05/1704546.html Sql 语句生成组建: http://www.cnblogs.com/qingyuan/archive/20

ORM映射框架总结--代码生成器

年前发布了一些文章,是关于.NET数据操作(点击查看)的.刚开始学习编程的时候,总感觉Java中的Hibernate 功能好强大,现在也不可否认它的确强大,特别是它在数据关系处理上,却是那样的让人称叹.          当我那时还不知道.net 中的Linq的时候,一直想自己能够简单的写个ORM映射框架.去年花费了几个月的业务时间终于算是整出来了,一些基本操作都能够实现了,自己号称从数据库操作冗余代码中解脱出来,其实自己很天真,那个框架是多么的不完善.总结了一下,最近超体力透支的准备将其扩展,

ORM映射框架总结--映射桥梁

1.       感言 写博客之前先自我吹嘘一下,给这些文章来些自我介绍. 半年前自己借用了5个多月的业务时间写了一个个人ORM映射框架.在之前的博 客中也有过写过该框架的相关介绍.半年前的那个ORM只不过是自己想象的关系映射的一个雏形,那一段曾经让自己骄傲过得代码的确存在着太多的问题,但是我始终没有放弃过对它的修改.又过了半年,这个ORM映射框架在之前的基础上有了很大的改进.在此与大家分享一下,希望大家共同探讨,共同学习.   2.       框架整体介绍 说道这里,其实这个ORM框架仍然存

ODB——基于c++的ORM映射框架尝试(安装)

这篇博客应该是和之前的重拾cgi一起的.当时为了模仿java的web框架,从页面的模板,到数据库的ORM,都找个对应的库来进行尝试.数据库用的就是ODB,官方网站是http://www.codesynthesis.com/products/odb/. 1.安装 odb是直接提供源代码的,主要包含这几个部分:odb.libodb.libodb-sqlite等,用途分别是: odb是ODB编译器,类似于qt的moc,将c++源码中包含ODB特定宏的代码,生成对应的c++代码. libodb是运行时库

ORM映射框架总结--SQL 语句生成组件

 1.       SQL 语句生成组建 之前说过ORM框架中有一个非常重要的组件,那就是SQL语句生成组件.SQL语句生成组件,顾名思义就是用于生成sql语句的一个组件.之前的Attribute 是用于修饰实体信息,而上一章讲的实体分析器分析了实体信息,在很大一部分程度上,以上做工作就是为这个SQL语句生成组件服务的. 该组件的核心接口是IDbFactory,它实现了接口IDisposable 目前该ORM支持SQL Server 数据库的sql语句生成,在后期过程中会逐步实现对Oracle,

ORM映射框架总结--实体分析器

1.       什么是数据分析器 前面一篇文章讲到过数据分析器,什么是数据分析器.其实很容易理解,就是对数据进行分析采集的一个工具,说白了就是一个小程序,在本ORM框架中对实体对象进行必要的数据分析,获得实体对象的各种信息缓存,以便在后续的工作中直接提取数据.这个是相对去年写的那个ORM有所改进的,在缓存实体信息的时候,在一定程度上可以提高该框架的性能 2.       实体分析器的原理简单介绍 简单的UML图: 图总是能给人最直观的感觉.从上面的图我们可以看出,这个分析器分为了几个过程: (