国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

2019-11-14 14:00:13
字體:
供稿:網(wǎng)友

   ORM 大家都知道, .Net 是EF  還有一些其他的ORM  從java 中移植過來的 有 , 大神自己寫的也有 

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

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

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

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

   

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

 

    直接上代碼:

 

      

        PRivate static string ConnectionString = "**";                 /// <summary>        ///  更新數(shù)據(jù)   沒有sql參數(shù)就直接執(zhí)行          /// </summary>        /// <param name="sql"> 需要執(zhí)行的 sql </param>        /// <param name="o">傳遞的實(shí)體類對(duì)象 要求該類中字段必須和 sql參數(shù)名稱一致 不區(qū)分大小寫 </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語句</param>        /// <param name="o">傳遞的實(shí)體類對(duì)象 要求該類中字段必須和 sql參數(shù)名稱一致 不區(qū)分大小寫 </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ū)分大小寫 </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 類型");            // 反射 讀取字段 驗(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 的方式  

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

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

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

     

     


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 肥城市| 汉中市| 东明县| 敦煌市| 甘泉县| 北宁市| 斗六市| 茶陵县| 顺义区| 保靖县| 荔浦县| 乌拉特中旗| 沽源县| 循化| 璧山县| 北流市| 遵义县| 阿坝县| 乐业县| 太谷县| 巴南区| 吴忠市| 武鸣县| 化隆| 辽阳县| 灵宝市| 探索| 高尔夫| 崇左市| 丁青县| 九江市| 那坡县| 衡阳市| 南汇区| 微山县| 嘉义市| 原阳县| 达日县| 涡阳县| 丹阳市| 连江县|