珂珂的个人博客 - 一个程序猿的个人网站

自己来写ORM框架(一)

自己来写ORM框架(一)

自己来写ORM框架(二)

自己来写ORM框架(三)

现在有不少ORM 框架了,不过本着学习知识的精神,来自己动手写一个简单的ORM框架,暂时不考虑多表的关联,因为有时候我们就是需要单表的操作,多表的话也可以分成多个单表操作 然后写个事务嘛. 原理很简单,就是根据POJO 来生成增删改查的sql,当然这其中需要用到反射的相关知识.

这个库自己用过,经过了很多次大改版。。所以说开发还是要先做好需求和架构,然后理清总体思路。最开始我定义了一个表属性TableAttribute和一个列属性ColumnAttribute   到最后为了纯pojo 我想办法去掉了这两个,不过要求数据操作类实现2个接口,一个是获取表名  一个是获取主键名。

先来看TableAttribute的定义

using System;

namespace FYJ.Data.Entity
{
    ////// 提供对实体类的特性装饰
    ///[AttributeUsage(AttributeTargets.Class,Inherited = true)]
    public class TableAttribute : Attribute
    {         

        ////// 以表名初始化特性
        //////表的名称///是否获取表名前缀///主键名///时间戳名public TableAttribute(string name,bool isGetDbPre,string pkName,string dateName)
        {
            this.IsGetTbPre = isGetDbPre;   
            this.Name = name;
            this.PkName = pkName;
            this.DateName = dateName;
        }

        public TableAttribute(string name, bool isGetDbPre)
        {
            this.IsGetTbPre = isGetDbPre;
            this.Name = name;
        }

        ////// 表名
        ///public string Name
        {
            get;
            set;
        }
        ////// 是否获取表名前缀
        ///public bool IsGetTbPre
        {
            get;
            set;
        }

        ////// 主键名
        ///public string PkName
        {
            get;
            set;
        }

        ////// 时间戳名
        ///public string DateName
        {
            get;
            set;
        }
    }
}

接下来是列ColumnAttribute属性定义


using System;
using System.Data;
using System.Data.Common;

namespace FYJ.Data.Entity
{
    ////// 提供对实体类属性的特性装饰
    ///[AttributeUsage(AttributeTargets.Property,Inherited = true)]
    public class ColumnAttribute : Attribute
    {        
        ////// 以列名、数据类型、参数前标记、是否主键初始化特性
        //////可选参数:列名///可选参数:列的数据类型///可选参数:是否主键///可选参数:默认值 只对添加有用///public ColumnAttribute(string name = "", DbType dataType = DbType.Object, bool isPrimarykey = false,object defaultData=null)
        {
            this.Name = name;
            this.DataType = dataType;
            this.IsPrimaryKey = isPrimarykey;
        }
        
        ////// 列名
        ///public string Name { get; set; }

        ////// 列数据类型
        ///public DbType DataType { get; set; }

        ////// 列是否是主键
        ///public bool IsPrimaryKey { get; set; }
        ////// 默认值
        ///public object DefaultData { get; set; }
    }
}
POJO这样写



using System;
using System.Data;
using FYJ.Data.Entity;

namespace Blogs.Model
    {

    [Serializable]
    [Table("blog_tb_comment",false)]
    public  class Comment
        {

        
            ////// 
            ///[Column("commentID", DbType.String, true, null)]
            public String commentID {get;set;}
            

            ////// 
            ///[Column("parentID", DbType.String, false, null)]
            public String parentID {get;set;}
            

            ////// 
            ///[Column("articleID", DbType.String, false, null)]
            public String articleID {get;set;}
            

            ////// 
            ///[Column("userID", DbType.String, false, null)]
            public String userID {get;set;}
            

            ////// 
            ///[Column("commentIP", DbType.String, false, null)]
            public String commentIP {get;set;}
            
                ////// 
            ///[Column("commentCity", DbType.String, false, null)]
            public String commentCity {get;set;}

            ////// 
            ///[Column("commentCountry", DbType.String, false, null)]
            public String commentCountry {get;set;}

            ////// 
            ///[Column("commentContent", DbType.String, false, null)]
            public String commentContent {get;set;}

            ////// 
            ///[Column("commentText", DbType.String, false, null)]
            public String commentText { get; set; }
            ////// 
            ///[Column("commentState", DbType.Int32, false, null)]
            public int? commentState { get; set; }

            ////// 
            ///[Column("floor", DbType.Int32, false, null)]
            public int? floor { get; set; }

            ////// 
            ///[Column("ADD_DATE", DbType.DateTime, false, null)]
            public DateTime? ADD_DATE { get; set; }

            ////// 
            ///[Column("UPDATE_DATE", DbType.DateTime, false, null)]
            public DateTime? UPDATE_DATE { get; set; }

        }
    }


[Serializable] 可以不要

之后留在下一篇


上一篇:URL 签名验证

下一篇:个人代码全部开源


0 评论

查看所有评论

给个评论吧