一个简单Net 类似ORM工具

来源:互联网 发布:软件行业研究报告 编辑:程序博客网 时间:2024/06/07 22:45

          微笑近期做项目,由于总要写烦人的Sql,就写了一个简单的ORM小工具,在数据缓存和事务处理还没怎么扩展,由于时间关系后续会补上嘀,废话少说了,看代码:

没有用Hibernate通过xml去动态生成数据库表字段,核心是通过反射取得实体对应数据库表的字段,这个字段可以加属性标识加以区分是否是数据库表字段。

1、实体基类,任何实体子类都要继承这个实体基类:

using System;using System.Collections.Generic;namespace SFDC.Model{    /// <summary>    /// 实体基类    /// </summary>    [Serializable]    public class BaseEntity    {        /// <summary>        /// 数据库操作方式:1-查询,2-新建,3-更新,4-删除。        /// </summary>        public int OperaMode{get;set;}        /// <summary>        /// 只返回需要的表字段,格式:field1,field2,...        /// </summary>        public string TableFields { get; set; }        /// <summary>        /// 实体中有关联的表子集合,[table,relatedID]        /// </summary>        public Dictionary<string, string> DicRelatedTable { get; set; }    }    /// <summary>    /// 数据库操作方式:1-查询,2-新建,3-更新,4-删除。    /// </summary>    public enum OperaEnum    {        Select=1,        Insert=2,        Update=3,        Delete=4,    }}

2、逻辑类图:

using System.Collections.Generic;using System.Reflection;using SFDC.Model;using System.Linq;using System;using System.Data.SqlClient;using SFDC.BLL.Helper;using System.Data;using SFDC.Common.Helper;namespace SFDC.BLL.DALCommon{    /// <summary>    /// 数据库DAL查询处理    /// </summary>    public class SelectProcessDAL : IProcessDAL    {        public string ProcessSingle<T>(T obj)        {            string tbFields = (obj as BaseEntity).TableFields;            string fields = string.IsNullOrWhiteSpace(tbFields) ? "*" : tbFields;            string sql = string.Format("select {0} from {1}", fields, obj.GetType().Name);            string whereSql = null;            PropertyInfo[] proInfos = obj.GetType().GetProperties();            List<SqlParameter> paras = new List<SqlParameter>();            foreach (var p in proInfos)            {                if (p.DeclaringType.Name.Equals("BaseEntity", StringComparison.OrdinalIgnoreCase))                {                    continue;                }                object val = p.GetValue(obj, null);                if( val!= null && !string.IsNullOrWhiteSpace(val.ToString()))                {                    whereSql += string.Format("{0}=@{1} and ", p.Name, p.Name);                    SqlParameter para = new SqlParameter(string.Format("@{0}", p.Name), val);                    paras.Add(para);                }            }            whereSql = string.IsNullOrWhiteSpace(whereSql) ? null : string.Format(" where {0}", whereSql.Substring(0, whereSql.Length - 5));            sql = string.Format("{0} {1};", sql, whereSql);            IList<T> source = DBHelper.FillCollectionDataReader<T>(sql, CommandType.Text, paras.ToArray());            return JsonHelper.JsonSerializer(source);        }        public string ProcessCollection<T>(List<T> obj)        {            return null;        }    }}

可以看到,只要把实体值填充了需要处理的字段会自动生成sql,子表集合可以在这里配置。


using System.Collections.Generic;using System.Reflection;using System.Data.SqlClient;using SFDC.BLL.Helper;using System.Data;using System.Text;using System;namespace SFDC.BLL.DALCommon{    /// <summary>    /// 数据库DAL增加处理    /// </summary>    public class InsertProcessDAL : IProcessDAL    {        public string ProcessSingle<T>(T obj)        {            return DBHelper.ExecuteQuery(GetSingleSql(obj), CommandType.Text, null);        }        public string ProcessCollection<T>(List<T> obj)        {            StringBuilder sb = new StringBuilder();            foreach (var v in obj)            {                sb.Append(GetSingleSql(v));            }            return DBHelper.ExecuteQuery(sb.ToString(), CommandType.Text, null);        }        private string GetSingleSql<T>(T obj)        {            string sql = string.Format("insert into {0}", obj.GetType().Name);            string fields = null;            string values = null;             PropertyInfo[] proInfos = obj.GetType().GetProperties();            foreach (var p in proInfos)            {                if (p.DeclaringType.Name.Equals("BaseEntity", StringComparison.OrdinalIgnoreCase))                {                    continue;                }                object val = p.GetValue(obj, null);                if (val != null && !string.IsNullOrWhiteSpace(val.ToString()))                {                    fields += string.Format("{0},", p.Name);                    values += string.Format("'{0}',", val);                }            }            sql = string.Format("{0} ({1}) values ({2}); ", sql, fields.Substring(0, fields.Length - 1), values.Substring(0, values.Length - 1));            return sql;        }    }}

可以看到处理简单的增、删、改、查在后台是不用再写句代码的,也不需要配置xml文件,还算方便的,后续会加上事务处理和缓存,如果想要代码的可以留言,在CSDN不知道怎么上传代码,惭愧!(之前也写过CSDN的用户体验,可能是我这个用户笨了哈),欢迎指点出不足,谢谢!


0 0
原创粉丝点击