zoukankan      html  css  js  c++  java
  • 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),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

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

  • 相关阅读:
    vb6 控件未注册问题解决
    Collection of algorithm for sorting. 常见排序算法集(二)
    Unity中uGUI的多分辨率处理
    大型站点技术架构PDF阅读笔记(一):
    GTK入门学习:glade的介绍
    java io (java输入输出流)具体解释
    python类的继承
    Python基础二--基本控制语句
    restlet Framework2.2和2.3版本号的对照
    crm创建团队设置团队的业务部门
  • 原文地址:https://www.cnblogs.com/qingyuan/p/1637769.html
Copyright © 2011-2022 走看看