目錄
1.Dapper 簡介
2.Dapper 安裝
3.Dapper 使用
Dapper簡介
Dapper是一個輕量級的ORM框架,短小精悍,正如其名。對於小項目,使用EF,NHibernate這樣的重量級ORM框架,有點殺雞用牛刀的感覺,此時Dapper會是個很不錯的選擇。
Dapper優勢
- 輕量,Dapper.dll大小不到105KB。
- 快,讀取數據接近IDataReader。
- 支持大部分主流的數據庫,如:MS SQL,Oracle,MySQL,Sqlite等等。
- 支持映射一對一,一對多,多對多關系。
Dapper原理
Dapper實際上是擴展了IDbConnection,提供了一些的查詢和執行方法,對ADO.NET的訪問對象進行了最底層的封裝,所以性能接近ADO.NET。
Dapper安裝
通過NuGet包管理器,直接搜索Dapper,選擇搜索結果中的第一個,點擊安裝到項目中即可。
Dapper 使用
Dapper查詢結果支持強類型,同時也支持動態類型,在實際開發中我們建議使用強類型,方便以后維護。
實體類
示例中需要用到兩個實體類型,分別為Post.cs和User.cs。
public class Post { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public User User { get; set; } } public class User { public int Id { get; set; } public string Name { get; set; } }
創建表腳本:
CREATE TABLE [dbo].[Post]( [Id] [int] IDENTITY(1,1) NOT NULL, [Title] [nvarchar](50) NULL, [Content] [nvarchar](2000) NULL, [UserId] [int] NULL, CONSTRAINT [PK_Post] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] CREATE TABLE [dbo].[User]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](20) NULL, PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
輔助類
由於Dapper是IDbConnection.cs進行了擴展,所以我們自己要管理數據庫連接,本示例我封裝了一個簡單的DBHelper.cs用於管理數據庫連接的打開和關閉。
public class DBHelper { private static string strConn = "Data Source=2012-20130731KI;Initial Catalog=QYHDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False"; /// <summary> /// 打開鏈接 /// </summary> public static SqlConnection OpenConnection() { SqlConnection conn = new SqlConnection(strConn); conn.Open(); return conn; } public static void CloseConnection() { SqlConnection conn = new SqlConnection(strConn); if (conn.State != System.Data.ConnectionState.Closed) { conn.Close(); } } }
方法測試

/// <summary> /// Dapper示例 /// </summary> class Program { static void Main(string[] args) { SqlConnection conn = DBHelper.OpenConnection(); //示例1:簡單查詢,返回強類型列表 Console.WriteLine("示例1:簡單查詢,返回強類型列表:"); var result1 = conn.Query<Post>("select Id,Title,Content from Post"); foreach (var item in result1) { Console.WriteLine(item.Id + " " + item.Title + " " + item.Content); } //示例2:簡單查詢,返回動態列表 Console.WriteLine("示例2:簡單查詢,返回動態列表"); var result2 = conn.Query("select Id,Title,Content from Post"); foreach (var item in result1) { Console.WriteLine(item.Id + " " + item.Title + " " + item.Content); } //示例3:帶參數的查詢 Console.WriteLine("示例3:帶參數的查詢"); var result3 = conn.Query<Post>("select Id,Title,Content from Post where UserId=@UserId", new { UserId = 1 }); foreach (var item in result3) { Console.WriteLine(item.Id + " " + item.Title + " " + item.Content); } //示例4:執行沒有返回結果的命名 //Test04(conn); //示例5:執行多次腳本 //Console.WriteLine("示例5:執行多次腳本"); //conn.Execute("insert into [User](Name) values(@Name)", new[] { new { Name = "wangwu" }, new { Name = "zhouliu" }, new { Name = "chenqi" } }); ////示例6:返回多個結果 Console.WriteLine("示例6:返回多個結果"); string sql = @"select * from Post where Id=@Id select * from [User] where Id=@Id"; using (var multi = conn.QueryMultiple(sql, new { Id = 1 })) { Post post = multi.Read<Post>().Single(); User user = multi.Read<User>().Single(); } //示例7:執行存儲過程 Console.WriteLine("示例7:執行存儲過程"); var result7 = conn.Query<Post>("sp_GetPost", new { Id = 3 }, commandType: CommandType.StoredProcedure); foreach (var item in result7) { Console.WriteLine(item.Id + " " + item.Title + " " + item.Content); } // 示例8:一對多映射,返回的一行數據映射到數據庫多張表 Console.WriteLine("示例8:一對多映射"); string sqlOneToMulti = "select * from Post p inner join [User] u on p.UserId=u.Id"; //Query<TFirst, TSecond, TReturn> var data = conn.Query<Post, User, Post>(sqlOneToMulti, (post, user) => { post.User = user; return post; }); DBHelper.CloseConnection(); Console.Read(); } }