ORM映射框架总结--数据操作(四)-阿里云开发者社区

开发者社区> 贺臣情缘> 正文

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

简介: 1.BaseEntityHelper 解析实体类特性 代码   1 /**  2  *   3  * 2009-4-17  4  *   5  *   6  * 字段的特性  7  * */  8 using System;  9 using System.
+关注继续查看

 

1.BaseEntityHelper 解析实体类特性

img_405b18b4b6584ae338e0f6ecaf736533.gif代码
  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),falseas 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)[0as ColumnAttribute);
 62                     }
 63                     if (property.GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
 64                     {
 65                         listLinkTableAttribute.Add(property.GetCustomAttributes(typeof(LinkTableAttribute),false)[0as LinkTableAttribute);
 66                     }
 67                     if (property.GetCustomAttributes(typeof(LinkTablesAttribute), false).Length > 0)
 68                     {
 69                         listLinktablesAttribute.Add(property.GetCustomAttributes(typeof(LinkTablesAttribute),false)[0as 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

img_405b18b4b6584ae338e0f6ecaf736533.gif代码
 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 数据

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
kbmmw 中JSON 操作入门
现在各种系统中JSON 用的越来越多。delphi 也自身支持JSON 处理。 今天简要说一下kbmmw 内部如何使用和操作JSON。 kbmmw 中json的操作是以TkbmMWJSONStreamer 为基础,要导入、导出JSON字符串, 首先要创建TkbmMWJSONStreamer.  然后是 TkbmMWJSONObject和 TkbmMWJSONArray。
961 0
intellij idea搭建ssh开发框架之绑定数据源
原文: intellij idea搭建ssh开发框架之绑定数据源 在intellij idea中绑定数据源并生成hibernate实体对象。
1255 0
kbmmw 中XML 操作入门
delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使用。
809 0
Angular4总结(四)—— 数据绑定,响应式,管道
数据绑定 angular4中默认的数据绑定都是单向的。可分为: 插值表达式形式(Dom属性绑定) <p>{{test}}<p> Dom 属性绑定流程: 控制器中定义了一个属性,值发生了改变 对应的dom的value被附上改变了的值 渲染后的页面上也会出现刚刚的值 这一切操作都和html属性不发生任何关系 html属性绑定,使用中括号 <img [src]="imgUrl"/> //如果没有写这个方括号,angular会把属性右侧的值作为字符串进行赋值,而非表达式 基本Html属性绑定 CSS属性绑定 这种形式是全有或者全无的。
1204 0
使用iOS原生sqlite3框架对sqlite数据库进行操作(一)
使用iOS原生sqlite3框架对sqlite数据库进行操作
36 0
使用iOS原生sqlite3框架对sqlite数据库进行操作(五)
使用iOS原生sqlite3框架对sqlite数据库进行操作
23 0
【我们一起写框架】MVVM的WPF框架(三)—数据控件
这世上,没人能一次性写出完美无缺的框架;因为,任何一个框架都需要项目的淬炼,然后才能升华,趋近完美。 所以,框架是个反复修改的东西,最终形成的东西。 如果你学了一点技术,觉得自己可以写出框架了,觉得自己有架构师的能力,然而自己总是怀才不遇——那一定是你的错觉。
952 0
Elasticsearch 跨集群数据迁移方案总结
Elasticsearch 跨集群数据迁移方案总结 -- elasticsearch-dump、reindex、snapshot、logstash
203 0
+关注
贺臣情缘
游历IT界多年颇有心得,非传说中的技术大牛。致力于仓储管理软件方面的开发
200
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载