ORM系列之三:Dapper


目錄

1.Dapper 簡介

2.Dapper 安裝

3.Dapper 使用

 

 

 

 

 

 

Dapper簡介  

         Dapper是一個輕量級的ORM框架,短小精悍,正如其名。對於小項目,使用EF,NHibernate這樣的重量級ORM框架,有點殺雞用牛刀的感覺,此時Dapper會是個很不錯的選擇。 

Dapper優勢  

  1. 輕量,Dapper.dll大小不到105KB。
  2. 快,讀取數據接近IDataReader。
  3. 支持大部分主流的數據庫,如:MS SQL,Oracle,MySQL,Sqlite等等。
  4. 支持映射一對一,一對多,多對多關系。 

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();
        }
    }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM