一、什麼是Dapper? Dapper是一款輕量級Orm框架,它是屬於半自動的,它和Entity Framework和NHibernate不同,它只有一個單文件,沒有很複雜的配置,如果你喜歡原生Sql語句,而且又是喜歡Orm框架,那麼Dapper對於你來說是再適合不過了。 二、Dapper優點我也是 ...
一、什麼是Dapper?
Dapper是一款輕量級Orm框架,它是屬於半自動的,它和Entity Framework和NHibernate不同,它只有一個單文件,沒有很複雜的配置,如果你喜歡原生Sql語句,而且又是喜歡Orm框架,那麼Dapper對於你來說是再適合不過了。
二、Dapper優點
我也是剛開始學習Dapper,讓我自己去總結它的優點,可能也就還沒真正去體驗到帶來的好。所以我也是抱著學習的態度,去參考一些大佬給它總結的優點:
1、輕量級、單文件。
2、支持多數據,而且性能優越。
3、Dapper原理通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象。
三、例子演示
下麵我們通過一個簡單的例子來學習Dapper。
1、我們通過VS2017 創建一個控制台程式來進行我們的學習,首先我們創建一個項目,命名為DapperTest。
2、首先我們先建立一張UserInfo表,我使用的是Sql Server創建。
CREATE TABLE [dbo].[UserInfo]( [uID] [int] NOT NULL, [uLoginName] [nvarchar](60) NULL, [uLoginPWD] [nvarchar](60) NULL, [uRealName] [nvarchar](60) NULL, [uStatus] [int] NOT NULL, [uRemark] [nvarchar](max) NULL, [uCreateTime] [datetime] NOT NULL, CONSTRAINT [PK_dbo.sysUserInfo] PRIMARY KEY CLUSTERED ( [uID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
3、接下來我們創建一個數據表對應的實體對象。
public class UserInfo { //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime /// <summary> /// 主鍵 /// </summary> public int uID { get; set; } /// <summary> /// 用戶名 /// </summary> public string uLoginName { get; set; } /// <summary> /// 密碼 /// </summary> public string uLoginPWD { get; set; } /// <summary> /// 真實名字 /// </summary> public string uRealName { get; set; } /// <summary> /// 狀態,0表示正常,1表示刪除 /// </summary> public int uStatus { get; set; } /// <summary> /// 備註 /// </summary> public string uRemark { get; set; } /// <summary> /// 創建時間 /// </summary> public DateTime uCreateTime { get; set; } }
3、我們需要在我們項目中添加Dapper Nuget包,然後點擊安裝就可以了。
4、我們需要編寫一個增刪查改幫助類,大家也可以不用按照我那樣。(我是為了不要把那些操作資料庫和業務邏輯代碼全部放到一起)
public class DapperHelper {
}
5.1新增,插入一條數據。
先看DapperHelper中代碼:
string sqlConnstr= "Data Source=.;Initial Catalog=TestDb;User Id=sa;Password=123"; /// <summary> /// 新增 /// </summary> /// <param name="user"></param> /// <returns></returns> public int UserInsert(UserInfo user) { using (var db=new SqlConnection(sqlConnstr)) { //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime string query = "INSERT INTO USERINFO VALUES(@uLoginName, @uLoginPWD, @uRealName, @uStatus, @uRemark, @uCreateTime)"; return db.Execute(query, user); } }
接下來我們來看看調用代碼和調用結果。
#region 1.0插入數據 UserInfo user = new UserInfo { uLoginName = "xiaoxiao", uLoginPWD = "123", uStatus = 0, uRealName = "小小", uRemark = "Test01", uCreateTime = DateTime.Now }; DapperHelper helper = new DapperHelper(); int i = helper.UserInsert(user); if (i > 0) { Console.WriteLine("插入成功"); } Console.ReadLine(); #endregion
上面兩張圖中已經顯示我們數據插入成功,接著我們來看看插入多條數據。
5.2批量插入
先看DapperHelper中代碼:
/// <summary> /// 批量插入數據 /// </summary> /// <param name="ulist"></param> /// <returns></returns> public int MultInsertUser(List<UserInfo> ulist) { using (var db = new SqlConnection(sqlConnstr)) { string query = "INSERT INTO USERINFO VALUES(@uLoginName, @uLoginPWD, @uRealName, @uStatus, @uRemark, @uCreateTime)"; return db.Execute(query,ulist); } }
接著我們來看看調用的代碼
#region 2.0批量插入 List<UserInfo> ulist = new List<UserInfo> { new UserInfo(){uLoginName = "xiaohu", uLoginPWD = "555",uStatus = 0 ,uRealName = "小虎", uRemark = "Test01",uCreateTime = DateTime.Now}, new UserInfo(){uLoginName = "yangyang", uLoginPWD = "888",uStatus = 0 ,uRealName = "楊楊", uRemark = "Test01",uCreateTime = DateTime.Now}, }; DapperHelper helper = new DapperHelper(); int i = helper.MultInsertUser(ulist); if (i > 0) { Console.WriteLine("批量數據插入成功"); } Console.ReadLine(); #endregion
接著我們來看看執行結果和資料庫中的結果:
5.3接著我們來看看刪除一條數據
先看DapperHelper中代碼:
/// <summary> /// 刪除 /// </summary> /// <param name="Uid"></param> /// <returns></returns> public int UserDelete(int Uid) { using (var db=new SqlConnection(sqlConnstr)) { string query = "DELETE USERINFO WHERE uID=@Uid"; var param = new DynamicParameters(); param.Add("Uid", Uid); return db.Execute(query,param); } }
接著看看調用代碼:
#region 3.0刪除數據 DapperHelper helper = new DapperHelper(); int uid = 7; int i = helper.UserDelete(uid); if (i > 0) { Console.WriteLine("刪除成功"); } Console.ReadLine(); #endregion
執行結果和資料庫中數據如下:
我們可以從資料庫中看到uID=7的數據已經被刪除。
5.4接著我們來看看批量刪除操作:
先看DapperHelper中代碼:
public int MultDeleteUser(List<UserInfo> ulist) { using (var db=new SqlConnection(sqlConnstr)) { string query = "DELETE USERINFO WHERE uID=@Uid"; return db.Execute(query, ulist); } }
接著看看調用代碼:
List<UserInfo> ulist = new List<UserInfo> { new UserInfo(){uID=8}, new UserInfo(){uID=9}, }; DapperHelper helper = new DapperHelper(); int i = helper.MultDeleteUser(ulist); if (i > 0) { Console.WriteLine("批量刪除成功"); } Console.ReadLine();
我們可以從資料庫截圖中看到uID=8和uID=9的數據已經被刪除。
5.5接下來我們來看看修改的操作。
先看DapperHelper代碼
public int UserUpdate(UserInfo user) { //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime using (var db=new SqlConnection(sqlConnstr)) { string query= "UPDATE USERINFO SET uLoginName=@uLoginName,uLoginPWD=@uLoginPWD,uRealName=@uRealName,uStatus=@uStatus,uRemark=@uRemark,uCreateTime=@uCreateTime WHERE uID=@uID";return db.Execute(query, user); } }
接下來看看調用代碼:
UserInfo user = new UserInfo
{
uID = 2,
uLoginName = "xiaomogu",
uLoginPWD = "555555",
uStatus = 0,
uRealName = "蘑菇",
uRemark = "測試",
uCreateTime = DateTime.Now
};
DapperHelper helper = new DapperHelper();
int i = helper.UserUpdate(user);
if (i > 0)
{
Console.WriteLine("修改成功");
}
Console.ReadLine();
從資料庫圖中我們已經可以看到我們已經將uID=2的數據修改成功。
5.6接下來我們來看看查詢所有數據操作。
先看DapperHelper代碼
public List<UserInfo> GetAll() { using (var db = new SqlConnection(sqlConnstr)) { string query = "SELECT * FROM USERINFO"; return db.Query<UserInfo>(query).ToList(); } }
接著我們來看看調用的代碼和執行結果:
DapperHelper helper = new DapperHelper(); var list = helper.GetAll(); foreach (var item in list) { Console.WriteLine("用戶名:{0},密碼:{1}", item.uLoginName, item.uLoginPWD); } Console.ReadLine();
5.7最後我們來看看查詢多條指定數據的操作:
先看看DapperHelper代碼:
/// <summary> /// 查詢多條指定的數據 /// </summary> /// <param name="uids">查詢條件</param> /// <returns></returns> public List<UserInfo> GetAllIn(int[] uids) { using (var db=new SqlConnection(sqlConnstr)) { string query = "SELECT * FROM USERINFO WHERE uID IN @uids"; return db.Query<UserInfo>(query, new { uids= uids }).ToList(); } }
接著我們來看看調用代碼和執行結果。
int[] ids = new int[] { 10, 11 }; DapperHelper helper = new DapperHelper(); var list = helper.GetAllIn(ids); foreach (var item in list) { Console.WriteLine("用戶名:{0},密碼:{1}", item.uLoginName, item.uLoginPWD); } Console.ReadLine();
四、源碼
源碼我已經放到了Github上面了,大家有興趣可以去看看,地址是:https://github.com/xiaoerhao/DapperTest
五、感受
終於寫完了,這是我第一次認真去寫一篇博客,終於跨出了這一小步,大概花了四個多小時,不過我覺得挺值得的。主要也是為了記錄一些自己的所學所收穫的東西分享給大家,和大家更好的交流,相互進步,由於自己的能力和水平有限,所以有些地方理解的不夠透徹,寫出來的東西或許達不到大家的期許,希望大家能夠理解和鼓勵,不過我的初衷就是希望一些剛上手Dapper的新手更好的入門和把自己所學的東西歸納總結,如果能夠幫到大家最好。