查漏補缺系列之dapper初體驗


什么是dapper

在維護一些較老的項目的時候,往往我們會用很多sql那么這個時候我們要考慮優化這些項目的時候,我們就可以使用dapper

dapper 是一款輕量級的ORM框架,它的優勢很多輕量級,速度快,而且還支持不同的數據庫,github地址如下:
https://github.com/StackExchange/Dapper

准備工作

本次為了演示,我們引用NUnit做單測,通過SQL Server Profiler來監控生成的sql語句。

dapper引用也特別方面我們可以通過NuGet下載引用dapper程序包,然后我們在類里引用using Dapper;就可以了。

數據庫表結構如下:

另外我們還要創建一個名為DapperTestModel 的實體

public class DapperTestModel
    {
         public int Id { get; set; }
         public  string Message { get; set; }
    }

讓我們准備好鏈接字符串開始本次演示吧

private string connString =
            System.Configuration.ConfigurationManager.ConnectionStrings["sqlConnectionString"].ConnectionString;

編輯

編輯代碼如下,我們把新增和修改的方法寫在一起,通過判斷ID是否為0來覺得是新增還是修改。首先我們演示新增方法

        [Test]
        public void Edit()
        {
            int ID = 0;
            string sql = "insert into dappertest([Message])values(@Message)";
            using (IDbConnection conn = new SqlConnection(connString))
            {
                if (ID > 0)
                {
                    sql = "update dappertest set [Message]=@Message where Id=@ID";
                    conn.Execute(sql, new {ID = ID, Message = "修改這句話"});
                }
                else
                {
                    conn.Execute(sql, new { Message = "添加一句話" });
                }
            }

        }

這里我們看到dapper很方便的一點就是我們可以使對象來代替參數,這里我們就可以通過匿名對象來傳遞參數

好了我們執行單測,看看數據庫中執行的語句

exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'添加一句話'

我們在去數據庫中查看一下數據

接着我們去修改ID來看看修改方法

exec sp_executesql N'update dappertest set [Message]=@Message where Id=@ID',N'@ID int,@Message nvarchar(4000)',@ID=10,@Message=N'修改這句話'

我們再去數據庫中查看一下數據情況

查詢

dapper的查詢功能也很靈活,比如我們需要獲取一個list列表,如果換成使用DBHelper類,我們可能需要先查詢一個DateSet然后再將其轉成list,那么使用dapper我們可以直接轉成list,我們來看看具體的實現代碼

        [Test]
        public void GetList()
        {
            using (IDbConnection conn = new SqlConnection(connString))
            {
                string sql = "select ID,[Message] from dappertest";
                List<DapperTestModel> dapperList = conn.Query<DapperTestModel>(sql).ToList();
            }
        }

我們在看看數據庫中的執行情況

select ID,[Message] from dappertest

刪除

刪除和新增修改的方式一致,代碼如下

        [Test]
        public void Delete()
        {
            int ID = 10;
      
            using (IDbConnection conn = new SqlConnection(connString))
            {
                int retrunCount = 0;
                string sql = "delete from dappertest where id=@ID";
                    retrunCount = conn.Execute(sql, new { ID = ID });
            }
      
        }

同樣的我們看看數據庫中的執行語句

exec sp_executesql N'delete from dappertest where id=@ID',N'@ID int',@ID=10

我們再查詢看看

存儲過程

我們再來看看存儲過程的調用,首先我們在數據庫中添加一個簡單的存儲過程

CREATE PROCEDURE DapperInsert
@Message nvarchar(200)
AS
insert into dappertest([message])
values(@Message)

然后我們去調用這個存儲過程

        [Test]
        public void PInsert()
        {
            using (IDbConnection conn = new SqlConnection(connString))
            {
                conn.Execute("DapperInsert",new {Message="這是存儲過程新增的"}, null, null,CommandType.StoredProcedure);
            }
        }

同樣的我們看看數據庫中的執行情況

exec DapperInsert @Message=N'這是存儲過程新增的'

事務

在平常的業務系統中,我們或多或少會用到事務,那么接下來我們演示一下在dapper中事務的調用

       [Test]
        public void Insert()
        {
            using (IDbConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                //開始事務
                IDbTransaction transaction = conn.BeginTransaction();
                try
                {
                    string sql = "insert into dappertest([Message])values(@Message)";
                    string sql2 = "insert into dappertest([Message])values(@Message)";
                     conn.Execute(sql, new { Message ="再次新增一句話" }, transaction);
                     conn.Execute(sql2, new { Message=""}, transaction);
                    //提交事務
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    //出現異常,事務Rollback
                    transaction.Rollback();
                    throw new Exception(ex.Message);
                }
            }
        }

我們故意使其在第二次新增的時候報錯

我們看看數據庫中的執行情況,這里數據庫會執行了兩次
第一次

exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'再次新增一句話'

第二次

insert into dappertest([Message])values()

這里我們失敗回滾了,我們在看看數據庫中的情框

我們看到數據庫中果然沒有新增數據,我們目的也達到了。

總結

本次我給大家帶來了一些dapper的簡單應用包括簡單邏輯調用存儲過程的調用,以及事務的調用,從我們的簡單示例中我們看到,dapper是一款十分優秀的輕量級的ORM框架,如果我們需要維護那種sql語句特別多的項目時,可以考慮使用dapper,使用dapper我們可以通過對象很靈活的去給我們的sql語句或者存儲過程傳遞參數,也可以很靈活的轉換類型。


免責聲明!

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



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