自定义ORMapping—关系表转换为实体或实体集合对象

概述

ORMapping,中文翻译过来就是,关系对象的映射,他的作用就是使我们编程时,不用过多的关注持久层,只需要关注对象,关注业务就可以了。ORMapping主要完成两个功能:自动生成SQL语句和DataTable To Objects。

特性和反射

特性是用来描述元数据的,元数据就是源代码编译好后的代码。反射是运行时,获得对象或类的所有信息,通过这些信息,我们可以创建类获得特性信息等等

关系表转换为实体或实体集合对象的实现方式

对于关系表转换为实体或实体集合对象的实现方法可以有多种,这里说一下比较极端的两种。

关系表转换为实体集合,坏效果的方式是,针对于每个实体集合类型,我们创建一个类来实现相应关系和实体的转化,好效果的方式是,创建一个类,这个类实现所有实体集合类型的DataTable的转换,对于坏的方式这里不再提供代码,对于好的方式,提供如下代码。大家可以看看里面的实现。

自定义特性类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 集合.集合.自定义特性
{
    [AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=false)]
    public class ORMappingFieldAttribute:Attribute
    {
        private string _strFieldName;

        public ORMappingFieldAttribute(string _strFieldName)
        {
            this._strFieldName = _strFieldName;
        }

        public string strFieldName
        {
            get { return _strFieldName; }
        }
    }
}

实体类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using 集合.集合.自定义特性;

namespace TableToCollection.实体
{
    [ORMappingTable("T_Person")]
    public class Person
    {
        [ORMappingField("id")]
        public string strID { get; set; }

        [ORMappingField("name")]
        public string strName { get; set; }

        [ORMappingField("age")]
        public int intAge { get; set; }
    }

}

关系对象转换类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using 集合.数据库访问;
using 集合.集合.灵活性好的集合;
using System.Reflection;
using System.Data;
using 集合.集合.自定义特性;

namespace 集合.ORMapping.ORMapping
{
    public class ORMapping<T> where T:new()
    {
        private DataTable dt;

        public ORMapping() {
            dt = new DataTable();
        }

        public void GetDataTable()
        {
            PersonDLL personDLL = new PersonDLL();
            dt = personDLL.Query();
        }

        public void DataRowToTObject(T TObject,DataRow dr)
        {
            //得到entity类型
            Type type = TObject.GetType();
            //取得T类型的所有公共属性
            PropertyInfo[] allPropertyInfo = type.GetProperties();

            foreach (PropertyInfo item in allPropertyInfo)
            {
                //返回属性的自定义ORMappingFieldAttribute的所有特性
                object[] propertyCustomAttributes = item.GetCustomAttributes(typeof(ORMappingFieldAttribute), false);

                foreach (ORMappingFieldAttribute attribute in propertyCustomAttributes)
                {
                    if (dt.Columns.Contains(attribute.strFieldName))
                    {
                        object TObjectPropertyValue = dr[attribute.strFieldName];
                        if (TObjectPropertyValue == DBNull.Value)
                        {
                            continue;
                        }
                        #region 类型转化
                        if (item.PropertyType.Equals(typeof(string)))
                        {
                            TObjectPropertyValue = dr[attribute.strFieldName].ToString();
                        }
                        else if (item.PropertyType.Equals(typeof(int)))
                        {
                            TObjectPropertyValue = Convert.ToInt32(dr[attribute.strFieldName]);
                        }
                        else if (item.PropertyType.Equals(typeof(decimal)))
                        {
                            TObjectPropertyValue = Convert.ToDecimal(dr[attribute.strFieldName]);
                        }
                        else if (item.PropertyType.Equals(typeof(DateTime)))
                        {
                            TObjectPropertyValue = Convert.ToDateTime(dr[attribute.strFieldName]);
                        }
                        else if (item.PropertyType.Equals(typeof(double)))
                        {
                            TObjectPropertyValue = Convert.ToDouble(dr[attribute.strFieldName]);
                        }
                        else if (item.PropertyType.Equals(typeof(bool)))
                        {
                            TObjectPropertyValue = Convert.ToBoolean(dr[attribute.strFieldName]);
                        }
                        ///利用反射自动将value赋值给obj的相应公共属性
                        item.SetValue(TObject, TObjectPropertyValue, null);
                        #endregion
                    }
                }
            }
        }

        public void DataViewToCollection(BaseCollection<T> TCollection)
        {
            GetDataTable();
            for (int i = 0; i < dt.Rows.Count; i++)
	    {
                T TObject = new T();
                DataRowToTObject(TObject, dt.Rows[i]);
                TCollection.Add(TObject);
	    }
        }
    }
}

main函数里的核心代码

ORMapping<Person> ORMapping = new ORMapping<Person>();
PersonBaseCollection personBaseCollection = new PersonBaseCollection();
ORMapping.DataViewToCollection(personBaseCollection);

实现的大概思路

DataTable转换为实体集合对象,要想完成这个功能,必须将DataTable里的每个Row的每个cell的值,赋值给实体集合对象里的具体对象的具体属性上,对于上面说的坏的效果,我们可以非常简单的实现,但是,那种方式却是不可行的(具体不说了)。

对于上面好的效果是如何实现的呢?这个实现运用的知识为特性和反射,通过在实体类上使用自定义的特性,我们可以在程序运行的时候,通过反射,获得相应对象的所有信息,通过获取自定义的特性,我们可以得到,对象里属性和相应表中的字段的对象关系,通过反射,我们可以获得对象属性的类型,然后在进行相应的转换。

自定义特性类(实现类内属性和表的字段名的对应关系),实体类上应用自定义的特性,通过反射,获得实体对象的所有信息,取自定义特性信息,并实现表和对象的字段和属性的相互转换。

总结

自定义的ROMapping还差自动生成SQL这块功能,对于这块的实现,自己不是很清楚,相信会有清楚的那天,另外,LinQ的总结也欠着大家一些东西,因为这块的Demo还没有实现,后期也会补上相应的内容。

自定义ORMapping—关系表转换为实体或实体集合对象

时间: 2024-10-27 12:27:54

自定义ORMapping—关系表转换为实体或实体集合对象的相关文章

自定义ORMapping—动态生成SQL语句

概述 之前在自定义ORMapping--关系表转换为实体或实体集合对象中提到过ORMapping的东西,在那片博客中也有ORMapping实现的一个简单思路,当时只实现了关系表转换为实体或实体集合这个功能,没有实现动态生成SQL这个部分,本片博客就是完善之前的那片博客,实现动态生成SQL语句这么一个功能. 实现思路 1.创建两个自定义特性,分别为表特性和字段特性,目的就是给相应的实体类的类名和属性名,打上相应的特性,从而创建类名和表名,属性和表字段名之间的对应关系 2.创建一个特性解析类,用来解

PowerDesinger:实体关系图-&gt;物理数据模型(关系表)-&gt;sql语句-数据库

之前参加项目的时候,就听说过PowerDesinger,但一直都没有用到过,这次通过接手基础的选课模块终于有机会通过powerDesinger的CDM模型创建数据库了. PowerDesinger中存在几种数据模型分别是:M----Model, 概念数据模型(CDM)Conceptual Diagram Model 逻辑数据模型(LDM) 物理数据模型(PDM)Physical Diagram Model 面向对象模型(OOM) 业务流程模型(BPM) 抽象程度(依次降低): CDM->LDM-

数据库中的表转换为实体类(.java文件)

在Myeclipse中配置连接数据库,将表转换为.java文件,节约时间,提高编程效率. 在Myeclipse中 点击window -->open perspective -->other  -->Myeclipse  Hibernate  界面上会出现DB Broswer区域,在它的区域中点击右键 -->new 在DB Browser中会出现刚才注册的Drivername 找到需要的表,右键 -->Hibernate Reserve Engineering    -->

crmsql语句查询实体窗体实体字段关系信息

在crm里面如何用sql语句查询这些信息? 查询实体信息: --查询实体信息,实体名称:account select * from MetadataSchema.Entity where name= 'account' 查询窗体信息: --查询窗体信息,ObjectTypeCode: 实体的code select * from systemform where ObjectTypeCode = 1 查询视图信息: --查询视图信息,ReturnedTypeCode:实体的code select

mybatis根据数据库表结构自动生成实体类,dao,mapper

首先, pom需要引入 <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!-- mybatis--> <dependency> <group

将form表单元素转为实体对象 或集合 -ASP.NET C#

简介: 做WEBFROM开发的同学都知道后台接收参数非常麻烦 虽然MVC中可以将表单直接转为集实,但不支持表单转为 LIST<T>这种集合 单个对象的用法: 表单: <input name='id' value='1' > <input name='sex' value='男' > 后台: //以前写法 DLC_category d = new DLC_category(); d.sex = Request["sex"]; d.id = Conver

JPA实体继承实体的映射策略

注:这里所说的实体指的是@Entity注解的类 继承映射使用@Inheritance来注解,它的strategy属性的取值由枚举InheritanceType来定义(包括SINGLE_TABLE.TABLE_PER_CLASS.JOINED,分别对应三种继承策略).@Inheritance注解只能作用于继承结构的超类上.如果不指定继承策略,默认使用SINGLE_TABLE. JPA提供了三种继承映射策略: 1. 一个类继承结构一个表的策略.这是继承映射的默认策略.即如果实体类B继承实体类A,实体

实体、实体集及其运用

一.实体 实体 在C#中的写法 在C#中 写法(1): public class UserInfo { public int UserID { get; set; } } 写法(2): public class UserinfoEntity { private string userid; '定义字段名 public string ID '定义属性项 { get{return userid;} '取值[Get--End Get,是可省的] set{userid = value;} '赋值[Set

Datatable和实体还有实体集List的区别与转化

机房收费系统大家想必不是做完,就是已经在手上了,在一开始做的时候就明确规定,我们必须用实体,而不能使Datatable,因为说是Datatable直接面向了数据库,当时不是很明白,于是也没有再深究,就去实现代码部分了,现在终于把三层的机房收费系统做完了,回过头再看的时候,有了那么一点小认识. 去年的时候,师哥师姐们用的是Datatable,也都实现了三层,在网上查了一些小Dome,也都是datatable ,于是我们就会发现这样真的有意义吗. 那么我们先来看看Datatable和Dataset吧