其实市面上的orm框架多的是,而且成熟的比比皆是,没必要自己开发,sql的有Nhibernate,entity,notsql就不用说了,直接文档存储,方便的要死,可是我就不明白有许多的公司,热衷于自己写,而且写的真不怎么样,一定要用他的,参数传递,object数组,多了,少了,没提示,类型对与不对,也不知道,结果返回值,object,好嘛,一个对象在它里面装箱拆箱捣腾好几次,出来的还是他妈的object,或者类似List<object>的东西。当宝一样到处炫耀,这套框架如何的好,不用写sql语句,真的不用吗?复杂查询的时候还不是一样要拼sql语句。

        我写这个的目的其实没别的,就是证明随随便便一周时间就可以做一个比他更好的东西。

其实做法和思路都挺简单,最终还是通过sql对着sqlhelper来完成,我这里就直接用sqlhelper了,灵活。

前期准备,实体属性,通过实体属性标识字段,建立一个属性标识标识字段,PrimaryKeyAttribute

[System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple = true)]
    public class PrimaryKeyAttribute : System.Attribute
    {
        public PrimaryKeyAttribute(bool noIsIdentiy=false)
        {
            IsPrimary = true;
            NoIsIdentity = noIsIdentiy;
        }

        public bool IsPrimary { get; private set; }

        public bool NoIsIdentity { get; private set; }
    }

 

只要数据库字段与实体字段一致,那就不用另外写属性对应字段名啦。

 

实体插入,insert 首先获取insert的sql语句及参数列表

#region 获取插入语句
        /// <summary>
        /// 获取插入语句
        /// </summary>
        /// <param name="bean"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static string GetInsertSql(this BaseBean bean, out SqlParameter[] param)
        {
            List<string> keystrs = new List<string>();
            List<string> valstrs = new List<string>();
            List<SqlParameter> plist = new List<SqlParameter>();
            Type type = bean.GetType();
            string primaryKey = null;
            string listKey = null;
            foreach (var p in type.GetProperties())
            {
                foreach (var a in p.GetCustomAttributes(false))
                {
                    if (string.IsNullOrEmpty(primaryKey) && a.GetType() == typeof(PrimaryKeyAttribute))
                    {
                        PrimaryKeyAttribute primary = a as PrimaryKeyAttribute;
                        if (primary.IsPrimary && !primary.NoIsIdentity)
                            primaryKey = p.Name;
                        break;
                    }
                    else if (a.GetType() == typeof(MapAttribute))
                    {
                        MapAttribute primary = a as MapAttribute;
                        if (primary.IsMap)
                            listKey = p.Name;
                        break;
                    }
                }
                if (!p.Name.Equals(primaryKey) && !p.Name.Equals(listKey))
                {
                    var val = p.GetValue(bean, null);
                    if (val != null)
                    {
                        keystrs.Add(string.Format("[{0}]", p.Name));
                        valstrs.Add(string.Format("@{0}", p.Name));
                        SqlParameter par = new SqlParameter(string.Format("@{0}", p.Name), val);
                        foreach (var a in p.GetCustomAttributes(false))
                        {
                            if (a.GetType() == typeof(SqlDateTypeAttribute))
                            {
                                SqlDateTypeAttribute sqld = a as SqlDateTypeAttribute;
                                par.SqlDbType = sqld.SqlDbType;
                                break;
                            }
                        }
                        plist.Add(par);
                    }
                }
            }
            string tabelname = type.Name;
            foreach (var a in type.GetCustomAttributes(false))
            {
                if (a.GetType() == typeof(TableNameAttribute))
                {
                    TableNameAttribute tablename = a as TableNameAttribute;
                    if (!string.IsNullOrEmpty(tablename.TableName))
                        tabelname = tablename.TableName;
                    break;
                }
            }
            param = plist.ToArray();
            string keystr = string.Join(",", keystrs.ToArray());
            string valstr = string.Join(",", valstrs.ToArray());
            StringBuilder sql = new StringBuilder();
            sql.AppendFormat("INSERT INTO {0} ({1})VALUES({2}) SELECT @@IDENTITY", tabelname, keystr, valstr);
            return sql.ToString();
        } 
        #endregion

 

接下来就是sqlhelper的方法了

#region 添加一条新数据
        /// <summary>
        /// 添加一条新数据
        /// </summary>
        /// <param name="bean"></param>
        /// <param name="getPrimark"></param>
        /// <returns></returns>
        public static object Insert(this BaseBean bean, bool getPrimark)
        {
            try
            {
                SqlParameter[] param = null;
                string sql = bean.GetInsertSql(out param);
                if (getPrimark)
                {
                    return SqlHelper.ExecuteScalar(CommandType.Text, sql, param);
                }
                else
                {
                    return SqlHelper.ExecuteNonQuery(CommandType.Text, sql, param);
                }
            }
            catch (Exception)
            {
                
                throw;
            }
        } 
        #endregion

 

到此,凡是继承BaseBean的实体都可以用Insert的拓展方法了。

 

其他删改查还远吗?所以就不用细说了看代码吧!

 

#region 获取删除语句
        /// <summary>
        /// 获取删除语句
        /// </summary>
        /// <param name="bean"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static string GetDeleteSql(this BaseBean bean, out SqlParameter[] param)
        {
            string primaryKey = null;
            Type type = bean.GetType();
            SqlParameter par = null;
            foreach (var p in type.GetProperties())
            {
                if (string.IsNullOrEmpty(primaryKey))
                {
                    foreach (var a in p.GetCustomAttributes(false))
                    {
                        if (a.GetType() == typeof(PrimaryKeyAttribute))
                        {
                            PrimaryKeyAttribute primary = a as PrimaryKeyAttribute;
                            if (primary.IsPrimary)
                                primaryKey = p.Name;
                            break;
                        }
                    }
                    par = new SqlParameter(string.Format("@{0}", p.Name), p.GetValue(bean, null));
                    foreach (var a in p.GetCustomAttributes(false))
                    {
                        if (a.GetType() == typeof(SqlDateTypeAttribute))
                        {
                            SqlDateTypeAttribute sqld = a as SqlDateTypeAttribute;
                            par.SqlDbType = sqld.SqlDbType;
                            break;
                        }
                    }
                }
            }
            string tabelname = type.Name;
            foreach (var a in type.GetCustomAttributes(false))
            {
                if (a.GetType() == typeof(TableNameAttribute))
                {
                    TableNameAttribute tablename = a as TableNameAttribute;
                    if (!string.IsNullOrEmpty(tablename.TableName))
                        tabelname = tablename.TableName;
                    break;
                }
            }
            param = new SqlParameter[] { par };
            string sql = string.Format("DELETE {0} WHERE {1}=@{1} ", tabelname, primaryKey);
            return sql;
        } 
        #endregion

        #region 获取主键查询sql语句
        /// <summary>
        /// 获取主键查询sql语句
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="id"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static string GetSelectSql<T>(object id, out SqlParameter[] param) where T : BaseBean
        {
            string primaryKey = null;
            Type type = typeof(T);
            SqlParameter par = null;
            foreach (var p in type.GetProperties())
            {
                if (string.IsNullOrEmpty(primaryKey))
                {
                    foreach (var a in p.GetCustomAttributes(false))
                    {
                        if (a.GetType() == typeof(PrimaryKeyAttribute))
                        {
                            PrimaryKeyAttribute primary = a as PrimaryKeyAttribute;
                            if (primary.IsPrimary)
                                primaryKey = p.Name;
                            break;
                        }
                    }
                    par = new SqlParameter(string.Format("@{0}", p.Name), id);
                    foreach (var a in p.GetCustomAttributes(false))
                    {
                        if (a.GetType() == typeof(SqlDateTypeAttribute))
                        {
                            SqlDateTypeAttribute sqld = a as SqlDateTypeAttribute;
                            par.SqlDbType = sqld.SqlDbType;
                            break;
                        }
                    }
                }
            }
            string tabelname = type.Name;
            foreach (var a in type.GetCustomAttributes(false))
            {
                if (a.GetType() == typeof(TableNameAttribute))
                {
                    TableNameAttribute tablename = a as TableNameAttribute;
                    if (!string.IsNullOrEmpty(tablename.TableName))
                        tabelname = tablename.TableName;
                    break;
                }
            }
            param = new SqlParameter[] { par };
            string sql = string.Format("SELECT * FROM  {0} WHERE {1}=@{1} ", tabelname, primaryKey);
            return sql;
        } 
        #endregion

        #region 获取所有数据sql语句
        /// <summary>
        /// 获取所有数据sql语句
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="param"></param>
        /// <returns></returns>
        public static string GetSelectAllSql<T>() where T : BaseBean
        {
            Type type = typeof(T);
            string tabelname = type.Name;
            foreach (var a in type.GetCustomAttributes(false))
            {
                if (a.GetType() == typeof(TableNameAttribute))
                {
                    TableNameAttribute tablename = a as TableNameAttribute;
                    if (!string.IsNullOrEmpty(tablename.TableName))
                        tabelname = tablename.TableName;
                    break;
                }
            }
            string sql = string.Format("SELECT * FROM  {0} ", tabelname);
            return sql;
        }
        #endregion

        

 

唯一,update有点纠结,为什么呢,我们不能判断什么字段需要更新,什么字段不需要更新。

 

#region 通过id获取单个数据实体
        /// <summary>
        /// 通过id获取单个数据实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="id"></param>
        /// <returns></returns>
        public static T Get<T>(object id) where T : BaseBean
        {
            try
            {
                SqlParameter[] param = null;
                T t = null;//Activator.CreateInstance<T>();
                string sql = SqlService.GetSelectSql<T>(id, out param);
                using (SqlDataReader read = SqlHelper.ExecuteReader(CommandType.Text, sql, param))
                {
                    if (read.HasRows)
                    {
                        t = Activator.CreateInstance<T>();
                        Type type = t.GetType();
                        if (read.Read())
                        {

                            foreach (var p in type.GetProperties())
                            {
                                try
                                {
                                    object obj = read[p.Name];
                                    if (obj != null && !(obj is DBNull))
                                        p.SetValue(t, obj, null);
                                }
                                catch (IndexOutOfRangeException)
                                {
                                    //不做处理
                                }
                                catch (Exception)
                                {
                                    throw;
                                }
                            }
                        }
                    }
                }
                return t;
            }
            catch (Exception)
            {
                
                throw;
            }
        } 
        #endregion

 

其他就不用贴出来了吧。

 

下面我就将相关的几个文件共享出来,仅供参考

 

http://dl.vmall.com/c0nalvukhv

 

 

 

转载请注明出处:http://qinnailin.cn/article/65