现在有不少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] 可以不要
之后留在下一篇
珂珂的个人博客 - 一个程序猿的个人网站