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;
 14 
 15 namespace CommonData.Data
 16 {
 17     public abstract class BaseEntityHelper
 18     {
 19         /// <summary>
 20         /// 根据反射类型获得相应实体的特性
 21         /// </summary>
 22         /// <param name="type">实体类型</param>
 23         /// <returns></returns>
 24         public TableInfo GetTableInfo(Type type)
 25         {
 26             TableInfo info = EntityTypeCache.Get(type);
 27             if (info == null)
 28             {
 29                 //获得表类型的特性集合
 30                 TableAttribute[] tableAttribute = type.GetCustomAttributes(typeof(TableAttribute),false) as TableAttribute[];
 31                 //获得列类型的特性集合
 32                 List<ColumnAttribute> listColumnAttribute = new List<ColumnAttribute>();
 33                 //获得主表类型的特性集合
 34                 List<LinkTableAttribute> listLinkTableAttribute = new List<LinkTableAttribute>();
 35                 //获得子表类型的特性集合
 36                 List<LinkTablesAttribute> listLinktablesAttribute = new List<LinkTablesAttribute>();
 37                 
 38                 //获得该类型实体的所有属性
 39                 PropertyInfo[] propertyInfo = type.GetProperties();
 40 
 41                 foreach (PropertyInfo property in propertyInfo)
 42                 {
 43                     //ColumnAttribute[] columnAttribute = property.GetCustomAttributes(typeof(ColumnAttribute), false) as ColumnAttribute[];
 44                     //LinkTableAttribute[] linkTableAttribute = property.GetCustomAttributes(typeof(LinkTableAttribute),false) as LinkTableAttribute[];
 45                     //LinkTablesAttribute[] linkTablesAttribute = property.GetCustomAttributes(typeof(LinkTablesAttribute), false) as LinkTablesAttribute[];
 46 
 47                     //if (columnAttribute.Length > 0)
 48                     //{
 49                     //    listColumnAttribute.Add(columnAttribute[0]);
 50                     //}
 51                     //if (linkTableAttribute.Length > 0)
 52                     //{
 53                     //    listLinkTableAttribute.Add(listLinkTableAttribute[0]);
 54                     //}
 55                     //if (linkTablesAttribute.Length > 0)
 56                     //{
 57                     //    listLinktablesAttribute.Add(linkTablesAttribute[0]);
 58                     //}
 59                     if (property.GetCustomAttributes(typeof(ColumnAttribute), false).Length > 0)
 60                     {
 61                         listColumnAttribute.Add(property.GetCustomAttributes(typeof(ColumnAttribute),false)[0] as ColumnAttribute);
 62                     }
 63                     if (property.GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
 64                     {
 65                         listLinkTableAttribute.Add(property.GetCustomAttributes(typeof(LinkTableAttribute),false)[0] as LinkTableAttribute);
 66                     }
 67                     if (property.GetCustomAttributes(typeof(LinkTablesAttribute), false).Length > 0)
 68                     {
 69                         listLinktablesAttribute.Add(property.GetCustomAttributes(typeof(LinkTablesAttribute),false)[0] as LinkTablesAttribute);
 70                     }
 71                 }
 72 
 73                 info = new TableInfo();
 74                 info.Table = tableAttribute[0];
 75                 info.Columns = listColumnAttribute.ToArray();
 76                 info.LinkTable = listLinkTableAttribute.ToArray();
 77                 info.LinkTables = listLinktablesAttribute.ToArray();
 78                 info.Properties = propertyInfo;
 79                 EntityTypeCache.InsertTableInfo(type,info);
 80             }
 81             return info;
 82         }
 83 
 84 
 85         /// <summary>
 86         /// 根据实体公共父接口获得特性信息
 87         /// </summary>
 88         /// <param name="entity">公共接口对象</param>
 89         /// <returns></returns>
 90         public TableInfo GetTableInfo(IEntity entity)
 91         {
 92             return GetTableInfo(entity.GetType());
 93         }
 94 
 95         /// <summary>
 96         /// 根据实体类型获得表的特性信息
 97         /// </summary>
 98         /// <returns></returns>
 99         public TableInfo GetTableInfo<T>()
100         {
101             Type type=typeof(T);
102             return GetTableInfo(type);
103         }
104 
105         /// <summary>
106         /// 更具实体公共接口获得列类型特新信息
107         /// </summary>
108         /// <param name="entity">公共实体接口</param>
109         /// <returns></returns>
110         public ColumnAttribute[] GetColumnAttribute(IEntity entity)
111         {
112             return GetTableInfo(entity).Columns;
113         }
114 
115         /// <summary>
116         /// 更具实体类型获得列类特性信息
117         /// </summary>
118         /// <param name="type">实体类类型</param>
119         /// <returns></returns>
120         public ColumnAttribute[] GetColumnAttribute(Type type)
121         {
122             return GetTableInfo(type).Columns;
123         }
124 
125         /// <summary>
126         /// 更具泛型类型获得列类型特性信息
127         /// </summary>
128         /// <typeparam name="T">泛型类型</typeparam>
129         /// <returns></returns>
130         public ColumnAttribute[] GetColumnAttribute<T>()
131         {
132             return GetTableInfo<T>().Columns;
133         }
134 
135         /// <summary>
136         /// 更具实体公共接口获得主表类型特性信息
137         /// </summary>
138         /// <param name="entity">公共实体接口</param>
139         /// <returns></returns>
140         public LinkTableAttribute[] GetLinkTableAttribute(IEntity entity)
141         {
142             return GetTableInfo(entity).LinkTable;
143         }
144 
145         /// <summary>
146         /// 更具实体类型获得主表特性信息
147         /// </summary>
148         /// <param name="type">实体类型</param>
149         /// <returns></returns>
150         public LinkTableAttribute[] GetLinkTableAttribute(Type type)
151         {
152             return GetTableInfo(type).LinkTable;
153         }
154 
155         /// <summary>
156         /// 更具泛型类型获得主表类型特性信息
157         /// </summary>
158         /// <typeparam name="T">泛型类型</typeparam>
159         /// <returns></returns>
160         public LinkTableAttribute[] GetLinkTableAttribute<T>()
161         {
162             return GetTableInfo<T>().LinkTable;
163         }
164 
165         /// <summary>
166         /// 更具实体公共接口来获得子表类型特性信息
167         /// </summary>
168         /// <param name="entity">公共接口</param>
169         /// <returns></returns>
170         public LinkTablesAttribute[] GetLinkTablesAttribute(IEntity entity)
171         {
172             return GetTableInfo(entity).LinkTables;
173         }
174 
175 
176         /// <summary>
177         /// 更具实体类型获得子表类型特性信息
178         /// </summary>
179         /// <param name="type">实体类型</param>
180         /// <returns></returns>
181         public LinkTablesAttribute[] GetLinkTablesAttribute(Type type)
182         {
183             return GetTableInfo(type).LinkTables;
184         }
185 
186         /// <summary>
187         /// 更具泛型获得子表类型特性信息
188         /// </summary>
189         /// <typeparam name="T">泛型类型</typeparam>
190         /// <returns></returns>
191         public LinkTablesAttribute[] GetLinkTablesAttribute<T>()
192         {
193             return GetTableInfo<T>().LinkTables;
194         }
195 
196         /// <summary>
197         /// 根据共同实体接口获得表特性信息
198         /// </summary>
199         /// <param name="entity">公共实体接口</param>
200         /// <returns></returns>
201         public TableAttribute GetTableAttribute(IEntity entity)
202         {
203             return GetTableInfo(entity).Table;
204         }
205 
206         /// <summary>
207         /// 根据实体类型获得实体特性信息
208         /// </summary>
209         /// <param name="type">实体类型</param>
210         /// <returns></returns>
211         public TableAttribute GetTableAttribute(Type type)
212         {
213             return GetTableInfo(type).Table;
214         }
215 
216         /// <summary>
217         /// 根据泛型类型获得实体特性信息
218         /// </summary>
219         /// <typeparam name="T">泛型类型</typeparam>
220         /// <returns></returns>
221         public TableAttribute GetTableAttribute<T>()
222         {
223             return GetTableInfo<T>().Table;
224         }
225 
226     }
227 }
228 

 

  BaseEntityHelper 这个类主要是为了解析实体类的特性信息。 public TableInfo GetTableInfo(Type type) 这个方法这个类中的核心,我们从Type 类型可以获得该类型的所有属性,方法和特性信息,同时我们也可以动态的从这个实体类中获得属性的值或者为这个属性赋值。反射可以保证我们在不知道实体相关信息的情况下获得实体的数据信息。这也是后面再组装sql语句赋值的核心

  同时这个类中大量重载了一小儿方法,包括泛型的重载方法。目的是为了体现程序的灵活性。

 

2.拓展类 DataExtension

代码

 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.Data;
13 
14 namespace CommonData.Data
15 {
16     public static class DataExtension
17     {
18         /// <summary>
19         /// 拓展方法,用于给执行语句添加参数
20         /// </summary>
21         /// <param name="paramenters">参数集合列表</param>
22         /// <param name="param">传递的参数值集合</param>
23         public static void AddRange(this IDataParameterCollection paramenters, params IDataParameter[] param)
24         {
25             if (param != null)
26             {
27                 foreach (IDbDataParameter p in param)
28                 {
29                     paramenters.Add(p);
30                 }
31             }
32         }
33     }
34 }
35 

 

  这个类拓展了一个借口IDataParameterCollection,.net 中的拓展方法可以说为.net 平台注入了新的血液,让程序更加生动和富有色彩。扩展方法不仅可以或者自己定义的类中的方法,而且可以更具需要扩展系统中的方法。其中这个类中的AddRange 方法是一个很好的例子,扩展了IDataParamterCollection 这个接口中的方法。扩展这份方法可以将占位符中的变量一次性赋值,而不用每次都去循环赋值。

  其实SqlParamters 这个类中是有AddRange 这个方法的,可以一次为占位符添加数组和集合,但是现在这个是它的父接口,没有提供这样的方法,因此我们扩展了这个方法。还要说明的是 这里使用接口而没有直接使用SqlParameters 这个类是因为当程序需要扩展的时候,我们不局限于sql数据库(可能是Oracle 数据库),我们只需要实现相应的接口即可,实现的过程可以任意调整,这样程序才具有灵活性。本人写的这个只是实现了sql server 数据

时间: 2024-09-09 08:51:06

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

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

  ORM(对象关系映射) ,在我们印象中Hibernate是体现的比较明显的.因为它的轻量级和低入侵式,得到很多IT人士的亲睐. 正是因为ORM 这种映射关系,使程序各个模块之间的耦合度大大降低,使得程序灵活多变..NET 在Linq 出现之前几乎没有看到什么ORM映射框架,今年自己也.net 方面下了一番苦功夫学习,有小小成果就是自己写了一个ORM映射框架.在2009年的最后一天与大家分享   程序总体设计思路:   姑且用上面的图来表示整个框架的流程.其实就是用一些特性来描述实体和数据库之

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.       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图: 图总是能给人最直观的感觉.从上面的图我们可以看出,这个分析器分为了几个过程: (