一个简单Net 类似ORM工具

本文介绍了一款简易的ORM工具的设计与实现,该工具通过反射获取实体类对应的数据库表字段,并支持基本的数据库操作如增、删、改、查,无需编写SQL语句或配置XML文件。

          微笑近期做项目,由于总要写烦人的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文件,还算方便的,后续会加上事务处理和缓存,如果想要代码的可以留言,在优快云不知道怎么上传代码,惭愧!(之前也写过优快云的用户体验,可能是我这个用户笨了哈),欢迎指点出不足,谢谢!


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值