ORM之輕量級框架--Dapper

1、什麼是Dapper?git

Dapper是一款輕量級Orm框架,它是屬於半自動的,它和Entity Framework和NHibernate不一樣,它只有一個單文件,沒有很複雜的配置,若是你喜歡原生Sql語句,並且又是喜歡Orm框架,那麼Dapper對於你來講是再適合不過了。github

2、Dapper優勢
我也是剛開始學習Dapper,讓我本身去總結它的優勢,可能也就還沒真正去體驗到帶來的好。因此我也是抱着學習的態度,去參考一些大佬給它總結的優勢:sql

一、輕量級、單文件。
二、支持多數據,並且性能優越。數據庫

三、Dapper原理經過Emit反射IDataReader的序列隊列,來快速的獲得和產生對象。app

3、例子演示框架

下面咱們經過一個簡單的例子來學習Dapper。性能

一、咱們經過VS2017 建立一個控制檯程序來進行咱們的學習,首先咱們建立一個項目,命名爲DapperTest。學習

二、首先咱們先創建一張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

三、接下來咱們建立一個數據表對應的實體對象。ui

 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; }
    }

三、咱們須要在咱們項目中添加Dapper  Nuget包,而後點擊安裝就能夠了。

四、咱們須要編寫一個增刪查改幫助類,你們也能夠不用按照我那樣。(我是爲了避免要把那些操做數據庫和業務邏輯代碼所有放到一塊兒)

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();

4、源碼

源碼我已經放到了Github上面了,你們有興趣能夠去看看,地址是:https://github.com/xiaoerhao/DapperTest

5、感覺

終於寫完了,這是我第一次認真去寫一篇博客,終於跨出了這一小步,大概花了四個多小時,不過我以爲挺值得的。主要也是爲了記錄一些本身的所學所收穫的東西分享給你們,和你們更好的交流,相互進步,因爲本身的能力和水平有限,因此有些地方理解的不夠透徹,寫出來的東西或許達不到你們的期許,但願你們可以理解和鼓勵,不過個人初衷就是但願一些剛上手Dapper的新手更好的入門和把本身所學的東西概括總結,若是可以幫到你們最好。

相關文章
相關標籤/搜索