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


       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” 的  方式   (没有连接池  还得写Sql   )  

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

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

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

         如果你使用过多种ORM 你就会发现 越是功能全 越是强大的ORM 效率就越低    因为不管是哪个ORM 最后还是对JDBC/ADO.NET 的加工封装 。 

         EF 效率是低  但是 他的 是 我弄过的一下ORM框架中 是功能最全 除去效率外 其他都很强大。

         

  • 相关阅读:
    【leetcode】Edit Distance (hard)
    【leetcode】 Interleaving String (hard)
    【leetcode】Regular Expression Matching (hard) ★
    【leetcode】Wildcard Matching(hard) ★ 大神太牛了
    【leetcode】 Longest Valid Parentheses (hard)★
    【leetcode】 Scramble String (hard)★
    【leetcode】Maximal Rectangle (hard)★
    【leetcode】 Unique Binary Search Trees (middle)☆
    【计算机网络】应用层1
    【leetcode】Minimum Path Sum(easy)
  • 原文地址:https://www.cnblogs.com/atliwen/p/4807303.html
Copyright © 2020-2023  润新知