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ǔ)句 分類 等等
有興趣的朋友可以自己做做 ,我就不弄了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注