什麼是Dapper? Dapper是一款輕量級的ORM框架,大名鼎鼎! 由谷歌Google 開發,在N款orm框架中 效率是最快的 最高的! 經過數據測試 比EF快 12-20 倍 國外最大的技術網站 stackoverflow 也是基於這個Orm框架開發的,並且非常簡單。 為什麼使用Dapper? ...
什麼是Dapper?
Dapper是一款輕量級的ORM框架,大名鼎鼎! 由谷歌Google 開發,在N款orm框架中 效率是最快的 最高的! 經過數據測試 比EF快 12-20 倍
國外最大的技術網站 stackoverflow 也是基於這個Orm框架開發的,並且非常簡單。
為什麼使用Dapper?
- 輕量。只有一個文件(SqlMapper.cs),編譯完成之後只有120k(好象是變胖了)
- 速度快。Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。
- 支持多種資料庫。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
- 可以映射一對一,一對多,多對多等多種關係。
- 性能高。通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象,性能不錯。
- 支持FrameWork2.0,3.0,3.5,4.0,4.5 .....
正文
對Dapper做了簡單介紹, 有關Dapper優點的文章網上一大堆, 這裡小編就不再贅述啦! 進入正題 相信很多園友的公司都使用過微軟的EF框架吧?
EF的優點太多了 “CodeFist代碼優先”、" 不需要為數據訪問編寫所有需要的ADO.NET管道代碼"、"使用C#代碼來編寫所有的數據訪問邏輯而不是編寫SQL查詢和存儲過程"等等....
但是最大的缺點就是過於臃腫 龐大 性能不咋地 ! 出於這個原因 ! 很多公司都放棄採用這個框架, 選擇使用自己封裝的SqlHelper類或其它第三方orm框架
但是由於被EF慣壞了 讓小弟覺得其它的ORM框架都沒EF便捷 快速 於是小弟想能不能把現今最流行的Dapper改成類似EF的調用模式! 所以這篇博客出來了!
先看幾個例子
操作數據表的數據
--------------------------例子(一)------------------------
//Dapper原生 根據Id獲取數據 string query = "SELECT * FROM Book WHERE id = @id"; book = conn.Query<Book>(query, new { id = id }).SingleOrDefault(); //經過小弟Dapper改裝後 var id = 0001;//根據Id查詢數據 T_Example entity=_repExample.GetById(id);
--------------------------例子(二)----------------------------
//Dapper原生 獲取數據表總項數 var count= conn.ExecuteScalar<int>("SELECT COUNT(*) FROM customers Where Type=A"); //經過小弟Dapper改裝後 //獲取數據表總數 var count01= _repExample.GetCount(); //不帶條件 var count02 =_repExample.GetCount(item => item.Age > 30 && item.CreateTime<new DateTime(2017,8,10));//帶條件
-------------------------例子(三)-------------------------------------
//Dapper原生獲取第一條數據 var entity= _Conn.QueryFirst<T_Example>("Select* from T_Example where Name==啊爆g");
//經過小弟Dapper改裝後 var entity = _repExample.GetFist(item => item.Name == "啊爆g");//使用lambda式
-------------------------------例子(四)--------------------------------------- //Dapper原生檢查數據是否存在 var count= conn.ExecuteScalar<int>("SELECT COUNT(*) FROM customers Where Type=A"); return count>0; //通過判斷count是否大於0 //經過小弟Dapper改裝後 bool IsExist= _repExample.Exists(item => item.Phone == "10086");
數據的 增刪改 操作
---------------------------例子(一)-------------------------------------------
//dapper原生Insert插入數據 Book book = new Book(); book.Name="C#本質論"; string query = "INSERT INTO Book(Name)VALUES(@name)"; //對對象進行操作 conn.Execute(query, book); //直接賦值操作 conn.Execute(query, new {name = "C#本質論"});
//經過小弟Dapper改裝後
T_Example item= _repExample.Insert(entity);//單挑插入 bool succ= _repExample.Insert(entityList);//批量插入 內置事物操作 失敗其中一條錯誤 全部回滾
--------------------------例子(二)-------------------------------------------
//daper原生Update更新數據 string query = "UPDATE Book SET Name=@name WHERE id =@id"; conn.Execute(query, book); //經過小弟Dapper改裝後
var entity = new T_Example() ; T_Example item= _repExample.Update(entity);//單條模型更新 bool succ= _repExample.Update(entityList);//批量更新 內置事物操作 失敗其中一條錯誤 全部回滾 bool succ = _repExample.Update(id,new { Name="張三",Age=22});//部分欄位更新
------------------------------例子(三)--------------------------------------------
//dapper原生Delete刪除數據 string query = "DELETE FROM Book WHERE id = @id"; conn.Execute(query, book); conn.Execute(query, new { id = id }); //經過小弟Dapper改裝後 var entity = new T_Example() ; T_Example item= _repExample.Delete(id);//刪除數據 單條 bool succ= _repExample.Delete(IEnumerable<object> ids);//批量刪除 內置事物操作 失敗其中一條錯誤 全部回滾
數據查詢操作實例
//dapper原生查詢 string query = "SELECT * FROM Book Where Name Like %C#%"; //無參數查詢,返回列表,帶參數查詢和之前的參數賦值法相同。 conn.Query<Book>(query).ToList(); //經過小弟改裝後
_repExample.GetAll();//獲取數據表所有數據 _repExample.GetAll(new { Name = true });//欄位排序true 升序 false降序 //根據條件獲取數據 _repExample.GetTableData(item => item.Age > 20 && item.Name.Contains("C#%")); //開頭模糊查詢 _repExample.GetTableData(item => item.Age > 20 && item.Name.Contains("%深入理解C#%"));//包含模糊查詢 _repExample.GetTableData(item => item.Age > 20 && item.Name.Contains("%Join Skeet"));//結尾模糊查詢 //分頁查詢 long pageTotal;//輸出當前表總項數 _repExample.GetPageData(1, 20, out pageTotal); _repExample.GetPageData(1, 20, out pageTotal, item => item.Age > 30);//根據條件分頁 //獲取視圖數據 _repExample.QueryView<ExampleBusinessModel>("View_視圖名稱"); _repExample.QuerySql<T_Example>("select Name,Age,Phone from T_Example");//執行原生Sql
多表事物操作實例
//dapper的事物處理就不貼出代碼了 //只貼小弟Dapper改裝過後的代碼 var succ=_repExample.Submit(tran => { //在這裡執行你具體的事物操作 _repExample.InsertTran(new T_Example(),tran);//A表插入一條數據 _repLog.DeleteTran(id, tran); //再刪除B表的數據 });
還有很多封裝方法 小弟還來沒有時間擴展 現在小弟把代碼開源 你可以根據自己的需求進行擴展
雖然小弟只有3年半 編程經驗 但是自認為代碼還是寫的規範 源碼都有註釋 很容易懂 有什麼意見歡迎質詢小弟 小弟QQ407015811