`
yyliuliang
  • 浏览: 5522 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

自己动手写个orm实现(1)

    博客分类:
  • .NET
阅读更多

最近公司项目开动了,出于各种考虑还是相对保守的采用 .NET 2.0 + 企业库 + SQLSERVER的大体框架.

为了封装单个实体对象的CRUD操作,遂自己动手写了一个orm实现的工具类库.
-------------------------------------------------------------------------------------------------------
首先,我们声明一个实体接口  IEntity

public interface IEntity : ICloneable
{
    
int ID getset; }
    
bool IsPersisted get; }
    IEntity 
get; }
}




根据图示, IEntity接口实现ICloneable接口, 并且有三个属性
ID : 对应每个实体类型所对应的数据库表的主键ID  (有一个前言约定: 所有表的主键id均为自增标识)
IsPersisted : 指示对象是否已持久化(对应到数据库表的一条记录)
Raw : 返回对象实例的已持久化的原始状态

有了实体,如何mapping到具体哪个数据表呢 ?
"约定优于配置", 因此我们直接使用Attribute来实现

public class EntityMappingAttribute : Attribute
    
{
        
private string _tableName;        
        
public string TableName
        
{
            
get return _tableName; }
            
set { _tableName = value; }
        }
        

        
public EntityMappingAttribute(string tableName)
        
{
            TableName 
= tableName;
        }


    }


同理,为了建立实体Property到数据表字段的对应关系我们新建PropertyMappingAttribute类

public class PropertyMappingAttribute : Attribute
    
{
        
private string _fieldName;

        
public string FieldName
        
{
            
get return _fieldName; }
            
set { _fieldName = value; }
        }


        
public PropertyMappingAttribute() { }

        
public PropertyMappingAttribute(string fieldName)
        
{
            FieldName 
= fieldName;
        }


    }


经过上述处理, 一个十分简单的面向对象实体(Object)到关系型数据表(Relationship)的映射(Mapping)就已经声明完毕了.


既然前面声明了IEntity接口, 理所当然的我们应该实现它

public abstract class EntityBase : IEntity
    
{
        
private IEntity _raw;
        
private int _id;
        
private bool _isPersisted = false;

        
IEntity Members#region IEntity Members
        
/**//// <summary>
        
/// ID
        
/// </summary>

        public virtual int ID
        
{
            
get return _id; }
            
set { _id = value; }
        }



        
public virtual IEntity Raw
        
{
            
get return _raw; }
            
protected set { _raw = value; }
        }



        
/**//// <summary>
        
/// 该对象是否已持久化
        
/// </summary>

        public virtual bool IsPersisted
        
{
            
get return _isPersisted; }
            
protected set { _isPersisted = value; }
        }

        
#endregion



        
ICloneable Members#region ICloneable Members

        
public object Clone()
        
{
            Type type 
= this.GetType();

            
object obj = Activator.CreateInstance(type);

            
foreach (PropertyInfo p in type.GetProperties())
            
{
                
object value = p.GetValue(this,null);
                p.SetValue(obj, value, 
null);
            }


            
return obj;
        }


        
#endregion

    }


由于IEntity 实现了ICloneable接口, 实际上肩负重任的抽象类EntityBase需要实现两个接口.
因为我们不能向外界暴露设置实体是否持久化和原始状态的信息的设置器, 我们把set修饰为protected.
而实现ICloneable比较简单,就是利用反射构造出一个当前实体对象实例的拷贝.


基础工作差不多了, 让我们我们新建一个User

[Serializable]
[EntityMapping(
"t_user")]
public class User : EntityBase
{
    [PropertyMapping]
    
public string Name get;set;}
    
    
public string Hello 
    

2
0
分享到:
评论
2 楼 yyliuliang 2008-05-31  
ls朋友谈下企业库如何蹩脚啊
1 楼 yza0088 2008-05-27  
.Net领域的ORM已经很完善了。例如ActiveRecord和NHibernate。大可不必自己写。况且个人感觉企业库一直比较蹩脚....

相关推荐

    自己动手做框架——ORM,MVC,IOC框架

    1. 设计ORM框架:定义接口或抽象类,用于表示数据库操作,然后创建具体的实现类,如实体类、数据访问对象(DAO)。接着,实现数据绑定和查询功能。 2. 实现MVC架构:创建模型类来处理业务逻辑,视图类用于展示结果...

    手写orm

    1. **源码**:表明这篇博客可能包含了一些ORM实现的代码示例,读者可以通过阅读源码来学习和理解ORM的工作方式。 2. **工具**:暗示这可能是一种自定义的开发工具,用于数据库操作,类似于现成的ORM框架,如...

    自己动手写轻量级ORM(C#)

    我的目标就是在数据库中建个表,在项目中写个模型,然后用上这个ORM工具,就能实现数据库的基本增删改查。 上面的代码实现了最基本的单条纪录的增删改查,其中最麻烦的是查,最简单的是删。 其中的db变量是数据库...

    (转载)自己动手写一个spring

    《自己动手写一个Spring》这篇文章主要探讨了Spring框架的核心概念,并通过模拟其实现来帮助读者深入理解其工作原理。Spring是Java开发中最流行的框架之一,它以依赖注入(Dependency Injection,DI)和面向切面编程...

    自己动手建设ORM框架--IntegORM1

    IntegORM1的源代码分为多个模块,如核心模块(包含基本的ORM逻辑)、数据库适配器模块(可能包括对多种数据库的支持,如MySQL、Oracle、PostgreSQL等)、分页模块(实现分页查询功能)等。每个模块都有清晰的职责...

    自己动手模仿Hibernate写数据库框架

    【标题】"自己动手模仿Hibernate写数据库框架"揭示了本次讨论的核心内容——尝试构建一个类似于Hibernate的数据库操作框架。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库与Java对象之间的...

    轻松实现Grove.ORM

    ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术,用于将关系数据库的数据模型映射到面向...同时,实践是最好的老师,动手创建一个简单的项目并应用这些知识,你会对Grove.ORM有更深入的理解。

    自己动手建设ORM框架--IntegORM1(基本功能)

    本文我们将探讨一个自建的ORM框架——IntegORM1,它是作者为提高开发效率和灵活性而设计的。 IntegORM1的核心特性在于它的分页查询功能和良好的扩展性。分页查询是大数据量场景下必备的功能,它可以帮助我们有效地...

    ORM实验(超级详细!)(期末复习很管用!!!).zip

    1. **对象关系映射基础**:了解ORM的基本概念,理解对象模型与关系模型之间的转换机制,如何通过ORM实现对象与数据库表的对应关系。 2. **ORM框架分类**:学习多种ORM框架,如Hibernate、MyBatis等,对比它们的设计...

    java一个简单的orm框架开发可以参考写习用

    通过自己动手开发一个简单的ORM框架,你能更好地理解这些高级特性的工作方式,为今后使用现有的ORM框架打下坚实基础。同时,这也是一个很好的学习和实践Java编程、设计模式和数据库交互的好机会。

    Node.js-自己动手写框架基于Koa2

    描述中的“自己动手写框架”是指开发者将学习如何从零开始构建一个框架,理解框架的基本结构和工作原理。这通常包括路由处理、中间件的编写和组织、错误处理、中间件的顺序控制等。通过这种方式,开发者不仅能更好地...

    自己动手写网络爬虫.pdf.zip

    通过阅读《自己动手写网络爬虫》这本书,你将全面了解网络爬虫的原理和实现,从零开始构建自己的爬虫项目,开启数据探索之旅。书中详细讲解的案例和实践指导,将帮助你逐步提升技能,实现从理论到实践的飞跃。

    7days-golang:从头开始的7天golang程序(Web框架Gee,分布式缓存GeeCache,对象关系映射ORM框架GeeORM,rpc框架GeeRPC等)7天用Go动手写从零实现系列

    第三天: |第四天: |第五天: |第六天: |第七天: |7天用Go从零实现分布式缓存GeeCache 是一个模仿实现的分布式缓存系统第一天: |第二天:|第三天: |: |第五天:预算|第六天:|第七天:|7天用Go从零实现ORM框架...

    Python Web开发动手练习项目V2.0 学生管理系统

    本系列课程为练手项目实战:学生管理系统的开发,项目包含了如下几个内容:项目的总体介绍、项目的数据库、ORM模型访问数据的实现过程、ORM实现数据库访问的优势、完成ORM连接数据库的类、实现学生信息的增删改查、...

    自己动手编写SQL注入漏洞扫描工具

    标题中的“自己动手编写SQL注入漏洞扫描工具”指的是创建一个能够自动检测Web应用程序是否存在SQL注入漏洞的软件。SQL注入是一种常见的网络安全威胁,攻击者通过在输入字段中插入恶意的SQL语句来操纵数据库,获取...

    手写springboot

    本教程旨在带领大家深入了解SpringBoot的工作原理,并尝试自己动手实现一个简易的SpringBoot框架。通过这个过程,我们将深入理解Spring Boot的核心组件和设计理念,提升我们的编程技艺。 一、SpringBoot概述 ...

    7天用Go从零实现Web框架Gee教程.zip

    分享个 Go 语言教程,教你如何用 Go 在 7 天...7 days golang apps from scratch (web framework Gee, distributed cache GeeCache, object relational mapping ORM framework GeeORM etc) 7天用Go动手写/从零实现系列

    自己写的标准三层留言本

    【标题】:“自己写的标准三层留言本” 在IT行业中,三层架构是一种常见的软件设计模式,尤其在Web开发中被广泛采用。本项目“ASP.NET标准三层留言本”就是基于这种架构实现的一个简单应用,旨在帮助开发者理解并...

    jfinal简单实例,可实现对数据的增删改查操作,有详细的代码解释,sql文件(MySQL)

    5. **动手实践**:尝试修改代码,进行数据的增删改查操作,观察结果,加深理解。 这个实例的价值在于它提供了实际操作的机会,帮助初学者快速上手 JFinal 和 MySQL 的配合使用。通过这个实例,你可以学习到如何在 ...

    openjpa 写的一个例子

    OpenJPA,全称Open Java Persistence API,是Java平台上的一个开源对象关系映射(ORM)框架,它实现了Java Persistence API(JPA),用于管理Java应用程序中的持久化数据。在这个"openjpademo"示例中,我们将会探讨...

Global site tag (gtag.js) - Google Analytics