首页 > 学院 > 开发设计 > 正文

.Net自己写个简单的ORM(练手)

2019-11-14 14:00:13
字体:
来源:转载
供稿:网友

   ORM 大家都知道, .Net 是EF  还有一些其他的ORM  从java 中移植过来的 有 , 大神自己写的也有 

   不管ORM 提供什么附加的 乱七八糟的功能  

   但是 最主要的 还是 关系映射 的事情。

   我自己一直在使用ORMDapper 这个很小的ORM  第一次看到这个ORM  是通过一个帖子中 有人搞了个常见ORM 效率排行榜 ,自己也试了试  然后就看上 ORMDapper 这个了

   这是把轻量级发挥到极致了! 只有一个 96KB 的 一个Class 文件。其中还有很多是空格和注释信息。 

   

    最近在学习研究JAVA   觉得JAVA 比.NET  有趣点。  也为了 以后 .NET 不行了  还能弄JAVA  

 

    直接上代码:

 

      

        PRivate static string ConnectionString = "**";                 /// <summary>        ///  更新数据   没有sql参数就直接执行          /// </summary>        /// <param name="sql"> 需要执行的 sql </param>        /// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>        /// <returns></returns>        public static int UpdateModel(string sql, object o)        {            var s = sql.Split('@');            return Update(sql, s.Length == 1 ? null : GetSqlParameters(o, s));        }        /// <summary>        ///  查询数据        /// </summary>        /// <typeparam name="T">映射的实体类</typeparam>        /// <param name="sql">执行的SQL语句</param>        /// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>        /// <returns></returns>        public static List<T> SeleteModel<T>(string sql, object o) where T : class, new()        {            var s = sql.Split('@');            return Select<T>(sql, s.Length == 1 ? null : GetSqlParameters(o, s));        }        /// <summary>        /// 动态创建SqlParameter 对象        /// </summary>        /// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>        /// <param name="s">切割后的SQL 语句</param>        /// <returns></returns>        private static SqlParameter[] GetSqlParameters(object o, string[] s)        {            s = s.Select(c => c.Split(' ')[0].Trim()).ToArray();             Type t = o.GetType();            if (t == typeof(object))                throw new Exception("UpdateModel  传递的类型是OBJECT 类型");            // 反射 读取字段 验证是否是 SQL 中的参数            var tlist =                t.GetFields(BindingFlags.Public | BindingFlags.Instance)                    .Where(c => c.GetValue(o) != null & s.FirstOrDefault(a => a.ToLower() == c.Name.ToLower()) != null)                    .ToList();            // 判断得到的数据 是否和 需要的数据 数量一致            if (tlist.Count() != s.Count() - 1)                throw new Exception("传递的实体中有值参数 和 sql 中需要的 数量不相等");            SqlParameter[] sp = new SqlParameter[tlist.Count()];            for (int i = 0; i < s.Length - 1; i++)            {                sp[i] = new SqlParameter(s[i + 1].Trim(), tlist.FirstOrDefault(c => c.Name.ToLower() == s[i + 1].ToLower()).GetValue(o));            }            return sp;        }        private static List<T> SeleteModel<T>(SqlDataReader data) where T : class, new()        {            // 获取列 个数            int iFieldCount = data.FieldCount;            List<T> list = new List<T>();            while (data.Read())            {                T tType = new T();                for (int i = 0; i < iFieldCount; i++)                {                    // 反射注入字段值                    string dataName = data.GetName(i);                    FieldInfo fie = tType.GetType().GetField(dataName);                    if (fie == null)                        continue;                    fie.SetValue(tType, data[dataName]);                }                list.Add(tType);            }            return list;        }        private static List<T> Select<T>(string sql, SqlParameter[] sp) where T : class, new()        {            using (SqlConnection conn = new SqlConnection(ConnectionString))            {                using (SqlCommand com = new SqlCommand(sql, conn))                {                    conn.Open();                    if (sp != null)                        com.Parameters.AddRange(sp);                    return SeleteModel<T>(com.ExecuteReader());                }            }        }        private static int Update(string sql, SqlParameter[] sp)        {            using (SqlConnection conn = new SqlConnection(ConnectionString))            {                using (SqlCommand com = new SqlCommand(sql, conn))                {                    conn.Open();                    if (sp != null)                         com.Parameters.AddRange(sp);                     return com.ExecuteNonQuery();                }            }        }

   调用示例:

  

 public class TestCalss    {        public static void Main()        {            string sql = @"SELECT TOP 1000 [ID]                           ,[ExpressID]                          ,[OrderID]                          ,[MailCode]                           ,[Sendxml]                          ,[SendFlag]                          ,[SendCount]                       FROM [SendStateTest]  where id=@id  and SendXML=@SendXML  ";            string sql2 = @"update [DangDang_SendStateTest] set  SendXML='0000' where id=@id     ";             int i = AdoConnection.UpdateModel(sql2, new Na() { ID = 1 });            List<Na> a = AdoConnection.SeleteModel<Na>(sql, new Na() { ID = 1, SendXML = "0000" });            Console.WriteLine(a);         }        public class Na        {             public int ID;             public string ExpressID;             public string OrderID;             public string MailCode;              public string SendXML;             public int SendFlag;             public int SendCount;        }     }

  

     只是提供一种自己做一个简单的 ORM 的方式  

     说实话,自己弄的在好,也不如 网上大家都在用的 ORM 框架

     可以在这个简单的ORM 上经行加工 拓展,  比如 支持存储过程  不限定数据库  SQL 语句 分类    等等  

     有兴趣的朋友可以自己做做 ,我就不弄了。

     

     


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表