现在有不少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] 可以不要
之后留在下一篇