麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

.Net自己寫(xiě)個(gè)簡(jiǎn)單的ORM(練手)

2019-11-14 14:00:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

   ORM 大家都知道, .Net 是EF  還有一些其他的ORM  從java 中移植過(guò)來(lái)的 有 , 大神自己寫(xiě)的也有 

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

   但是 最主要的 還是 關(guān)系映射 的事情。

   我自己一直在使用ORMDapper 這個(gè)很小的ORM  第一次看到這個(gè)ORM  是通過(guò)一個(gè)帖子中 有人搞了個(gè)常見(jiàn)ORM 效率排行榜 ,自己也試了試  然后就看上 ORMDapper 這個(gè)了

   這是把輕量級(jí)發(fā)揮到極致了! 只有一個(gè) 96KB 的 一個(gè)Class 文件。其中還有很多是空格和注釋信息。 

   

    最近在學(xué)習(xí)研究JAVA   覺(jué)得JAVA 比.NET  有趣點(diǎn)。  也為了 以后 .NET 不行了  還能弄JAVA  

 

    直接上代碼:

 

      

        PRivate static string ConnectionString = "**";                 /// <summary>        ///  更新數(shù)據(jù)   沒(méi)有sql參數(shù)就直接執(zhí)行          /// </summary>        /// <param name="sql"> 需要執(zhí)行的 sql </param>        /// <param name="o">傳遞的實(shí)體類對(duì)象 要求該類中字段必須和 sql參數(shù)名稱一致 不區(qū)分大小寫(xiě) </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>        ///  查詢數(shù)據(jù)        /// </summary>        /// <typeparam name="T">映射的實(shí)體類</typeparam>        /// <param name="sql">執(zhí)行的SQL語(yǔ)句</param>        /// <param name="o">傳遞的實(shí)體類對(duì)象 要求該類中字段必須和 sql參數(shù)名稱一致 不區(qū)分大小寫(xiě) </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>        /// 動(dòng)態(tài)創(chuàng)建SqlParameter 對(duì)象        /// </summary>        /// <param name="o">傳遞的實(shí)體類對(duì)象 要求該類中字段必須和 sql參數(shù)名稱一致 不區(qū)分大小寫(xiě) </param>        /// <param name="s">切割后的SQL 語(yǔ)句</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 類型");            // 反射 讀取字段 驗(yàn)證是否是 SQL 中的參數(shù)            var tlist =                t.GetFields(BindingFlags.Public | BindingFlags.Instance)                    .Where(c => c.GetValue(o) != null & s.FirstOrDefault(a => a.ToLower() == c.Name.ToLower()) != null)                    .ToList();            // 判斷得到的數(shù)據(jù) 是否和 需要的數(shù)據(jù) 數(shù)量一致            if (tlist.Count() != s.Count() - 1)                throw new Exception("傳遞的實(shí)體中有值參數(shù) 和 sql 中需要的 數(shù)量不相等");            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()        {            // 獲取列 個(gè)數(shù)            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();                }            }        }

   調(diào)用示例:

  

 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;        }     }

  

     只是提供一種自己做一個(gè)簡(jiǎn)單的 ORM 的方式  

     說(shuō)實(shí)話,自己弄的在好,也不如 網(wǎng)上大家都在用的 ORM 框架

     可以在這個(gè)簡(jiǎn)單的ORM 上經(jīng)行加工 拓展,  比如 支持存儲(chǔ)過(guò)程  不限定數(shù)據(jù)庫(kù)  SQL 語(yǔ)句 分類    等等  

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

     

     


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品一区二av18款 | 毛片在线免费视频 | 免费a级黄色片 | 成人福利在线播放 | 欧美成人se01短视频在线看 | 成人三级电影网址 | 黄色一级片在线观看 | 亚洲综合一区在线观看 | 亚洲人成免费 | 亚洲日本欧美 | 久久吊| 国产盼盼私拍福利视频99 | 成人aaaaa片毛片按摩 | h网站在线观看 | 久草在线资源观看 | 成熟女人特级毛片www免费 | 91伊人久久| 国产一区精品在线观看 | 羞羞视频在线免费 | 亚洲精品aa| 伊人一二三四区 | 国产精品av久久久久久网址 | 国产一级www | 午夜男人免费视频 | 法国性xxx精品hd | 国产人成免费爽爽爽视频 | 插插操 | 一区二区三区欧美在线 | 国产一区视频在线免费观看 | 国产精品99久久久久久久女警 | 亚洲成人黄色片 | 国产午夜精品久久久久婷 | 污污黄 | 99精品视频在线看 | 毛片免费观看完整版 | 日日爱影院 | 黄色毛片免费看 | 国产羞羞视频在线观看免费应用 | 婷婷亚洲一区二区三区 | 欧美日韩专区国产精品 | 婷婷中文字幕一区二区三区 |