ORM框架 Dapper

一,介紹:Dapper是一款輕量級ORM工具。如果你在小的項目中,使用Entity Framework、NHibernate 來處理大數據訪問及關係映射,未免有點殺雞用牛刀。你又覺得ORM省時省力,這時Dapper 將是你不二的選擇。

  ---ORM框架的核心思想是對象關係映射,ORM是將表與表之間的操作,映射成對象和對象之間的操作,就是通過操作實體類來達到操作表的目的。從數據庫提取的數據會自動按你設置的映射要求封裝成特定的對象。之後你就可以通過對對象進行操作來修改數據庫中的數據。這時候你面對的不是信息的碎片,而是一個形象鮮明的對象。

二,假如你喜歡原生的Sql語句,又喜歡ORM的簡單,那你一定會喜歡上Dapper,這款ROMDapper的優勢:

輕量。只有一個文件(SqlMapper.cs),編譯完成之後只有120k(好象是變胖了)
速度快。Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。
支持多種數據庫。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
可以映射一對一,一對多,多對多等多種關係。
性能高。通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象,性能不錯。
支持FrameWork2.0,3.0,3.5,4.0,4.5   

 

四,原生Dapper使用流程:

  0,兩種下載使用方法:

  (1),推薦下載方法(使用Nuget下載):

  ---Nuget是一個.NET平臺下的開源的項目,它是Visual Studio的擴展。在使用Visual Studio開發基於.NET Framework的應用時,Nuget能把在項目中添加、移除和更新引用的工作變得更加快捷方便。

---安裝成功以後,生成一下網站,項目bin目錄下,會生成幾個Dapper文件(主要是Dapper.dll,120k)。

  (2),可以在官網上下載Dapper源代碼,即SqlMapper.cs文件,在項目中App_Code文件夾中加入這個文件,就像Ado.net中的SqlHelper一樣。

  ---源文件地址:https://github.com/StackExchange/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

  1,下面可以在項目中開始使用Dapper了

  2,連接數據庫字符串。根據不同的數據庫進行相應設置,如下SQL和SQLite連接方式。

 

//sqlserver
 public class SqlDapperHelper
    {
        private static string GetConnectionString()
        {
            return @"Data Source=.;Initial Catalog=Test;Persist Security Info = True; User ID = sa;
                    Password = 123; Max Pool Size = 512;Connection Timeout=10000";
        }


        public static System.Data.IDbConnection CreateLocalConnection()
        {
            var connection = new System.Data.SqlClient.SqlConnection(GetConnectionString());
            connection.Open();
            return connection;
        }
    }

//sqlite
public  class SqliteDapperHelp
    {
        private static string CreateConnectionString(string ConnectString)
        {
            SQLiteConnectionStringBuilder connectionString = new SQLiteConnectionStringBuilder();
            connectionString.DataSource = ConnectString;
            string conStr = connectionString.ToString();
            return conStr;
        }

        private static IDbConnection CreateConnection(string serverName)
        {
            string connectionString = CreateConnectionString(serverName);
            SQLiteConnection conn = new SQLiteConnection(connectionString);
            conn.Open();
            return conn;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="aaa">數據庫文件位置  例:\\D:\Test.db</param>
        /// <returns></returns>
        public static IDbConnection CreateRemoteConnection(string aaa)
        {
            return CreateConnection(aaa);

        }
    }

手寫sql插入數據

using (System.Data.IDbConnection conn = DapperHelper.CreateLocalConnection())
            { 
                //查詢返回多條
                string rowsql="select * from Person";
                List<Tperson> list = dbConnection.Query<Tperson>(rowsql, null).ToList();
                //查詢返回第一條
                dynamic jktj = conn.Query<dynamic>("select * from Person ",null).FirstOrDefault(); 
                //返回首行首列
                string sql = "select count(*) from Person where  YEAR(創建時間) = DATEPART(year, GETDATE())";
              int 結果 = Convert.ToInt32(conn.ExecuteScalar(sql));
                string Name="張三";
                string sql = $"update Person set name={Name} where id=1";
                return conn.Execute(sql) > 0;
            }

dapper封裝方法      query   增刪  及事務

using Dapper;
using Dapper.Contrib.Extensions;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using WebApi;

namespace Test
{
    public class Test
    {
        public TPerson Getperson(string id)
        {
            using (System.Data.IDbConnection dbConnection = DapperHelper.CreateLocalConnection())
            {
                TPerson 人員 = dbConnection.Get<TPerson>(id);//通過id查詢表裏的數據   返回實體中所有字段
                //List<TPerson> 人員1 = dbConnection.GetAll<TPerson>().ToList();//返回所有的數據
                return 人員;
            }
        }
        [Table("表_Person")]//對應數據庫中的表名
        public class TPerson
        {
            [Key]//數據庫表中必須要有id   或者使用[ExplicitKey]
            public string id { get; set; }
            public string name { get; set; }
            public string sex { get; set; }
            public string age { get; set; }
            public string address { get; set; }

        }
        /// <summary>
        /// Insert    Update
        /// </summary>
        /// <returns></returns>
        public bool InsertResult()
        {
            using (System.Data.IDbConnection conn = DapperHelper.CreateLocalConnection())
            {
                try
                {
                    TPerson person = new TPerson();
                    person.id = "123";
                    person.name = "123";
                    person.sex = "123";
                    person.age = "123";
                    person.address = "123";
                    long aa = conn.Insert<TPerson>(person);
                    //bool bb= conn.Update<TPerson>(person);
                    if (aa > 0)
                    {
                        return true;
                    }
                    return false;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        /// <summary>
        /// 事務    
        /// </summary>
        /// <returns></returns>
        public bool Transaction()
        {
            using (System.Data.IDbConnection conn = DapperHelper.CreateLocalConnection())
            {
                List<string> strsql = new List<string>();
                strsql.Add("delete from  表_Person where id=123");
                strsql.Add("insert into 表_Person(id,name,sex,age,address) values(111,'asd','asd','asd','asd')");
                IDbTransaction transaction = conn.BeginTransaction();
                try
                {
                    for (int i = 0; i < strsql.Count; i++)
                    {
                        int aa = conn.Execute(strsql[i], null, transaction);
                    }
                    transaction.Commit();
                    return true;
                }
                catch (Exception exception)
                {

                    transaction.Rollback();
                    return false;
                }
            }

        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章