ORM框架Dapper詳細教程


1,為什么要使用dapper:

性能優越: 其實在各大網站上,我們大概都會看到這樣的一個對比效果圖,在超過500次poco serialization的過程中所表現的性能,我們發現dapper是第二名

支持多數據庫: 支持多數據庫的本質是因為Dapper是對IDBConnection接口進行了方法擴展,比如我下面聲明的擴展類 ,SqlConnection,MysqlConnection,OracleConnection都是繼承於DBConnection,而DBConnection又是實現了IDBConnection的接口 下面實例是以sql server開發。

輕量級:通過實現IDBConnection的擴展方法 所有實例方法需要自己寫 它是通過sql與表的映射功能

2 實例

首先創建一個.net core項目

Nuget安裝dapper

新加一個類 調用dapper的幫助類

 public class DapperHelper
    {
        private string connectionStr;
        public DapperHelper()
        {
            //連接數據庫的字符串 這里是sql server數據庫
            connectionStr = "Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=LocalDB;Data Source=.";
        }
        public SqlConnection GetSqlConnection()
        {
            //連接 連接字符串 開啟連接
            SqlConnection conn = new SqlConnection(connectionStr);
            conn.Open();
            return conn;
        }

        public List<T> Query<T>(string sql, List<T> model = null)
        {
            using (IDbConnection connection = GetSqlConnection())
            {
                return connection.Query<T>(sql, model).ToList();
            }
        }

        public List<T> QueryInid<T>(string sql, string[] c_ids)
        {
            var maxParametersSize = 2000;
            var c_idsReplace = c_ids.ToList().Distinct().ToArray();
            using (IDbConnection connection = GetSqlConnection())
            {
                if (c_ids.Length > maxParametersSize)
                {
                    List<T> res = new List<T>();

                    var roundNumber = c_ids.Length / maxParametersSize + 1;
                    for (int i = 0; i < roundNumber; i++)
                    {
                        c_ids = c_idsReplace.Skip(maxParametersSize * i).Take(maxParametersSize).ToArray();
                        res.AddRange(connection.Query<T>(sql, new { c_ids }));
                    }

                    return res;
                }
                else
                {
                    return connection.Query<T>(sql, new { c_ids }).ToList();
                }
            }
        }

        /// <summary>
        ///根據sql查詢 
        /// </summary>
        /// <typeparam name="T">查詢語句需要映射的類</typeparam>
        /// <param name="sql">查詢語句</param>
        /// <returns></returns>
        public T Select<T>(string sql)
        {
            using (IDbConnection connection = GetSqlConnection())
            {
                //前面的控制器使用了該方法 為什么可以  直接使用QueryFirstOrDefault  
                //是因為dapper方法繼承了this IDbConnection connection的參數
                //該dapper聲明的方法 屬於IDbConnection的擴展方法
                return connection.QueryFirstOrDefault<T>(sql);
            }
        }
        /// <summary>
        /// 查詢sql返回的行數
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int Exec(string sql)
        {
            using (IDbConnection connection = GetSqlConnection())
            {
                return connection.Execute(sql);
            }
        }

        public int Exec(string sql, object model)
        {
            using (IDbConnection connection = GetSqlConnection())
            {
                return connection.Execute(sql, model);
            }
        }
        /// <summary>
        /// 是否需要執行事務 
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="model"></param>
        /// <param name="useTransaction"></param>
        /// <returns></returns>
        public int Exec(string sql, object model, bool useTransaction = false)
        {
            using (IDbConnection connection = GetSqlConnection())
            {
                if (useTransaction)
                {
                    var tran = BeginTransaction(connection);
                    return connection.Execute(sql, model, tran);
                }
                else
                {
                    return connection.Execute(sql, model);
                }

            }
        }


        /// <summary>
        /// 必須是  string @c_ids
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="c_id"></param>
        /// <returns></returns>
        public List<T> QueryIn<T>(string sql, string[] c_ids)
        {
            using (IDbConnection connection = GetSqlConnection())
            {
                return connection.Query<T>(sql, new { c_ids }).ToList();
            }
        }

        /// <summary>
        /// 必須是 int @ids
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public List<T> QueryIn<T>(string sql, int[] ids)
        {
            using (IDbConnection connection = GetSqlConnection())
            {
                return connection.Query<T>(sql, new { ids }).ToList();
            }
        }
        /// <summary>
        /// 執行事務
        /// </summary>
        /// <param name="conn"></param>
        /// <returns></returns>
        private IDbTransaction BeginTransaction(IDbConnection conn)
        {
            IDbTransaction tran = conn.BeginTransaction();
            return tran;
        }
        /// <summary>
        /// 擴展方法 插入表  在進行數據批量導庫的時候 比單次一條條存庫 (單次導入 需要每次都開啟數據庫連接 )速度提高
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="tablename"></param>
        public void InsertTable(DataTable dt, string tablename)
        {
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionStr))
            {
                bulkCopy.DestinationTableName = tablename;
                bulkCopy.BatchSize = dt.Rows.Count;
                bulkCopy.WriteToServer(dt);
            }
        }
    }

使用 在控制器中實現的代碼塊 下面主要舉例了兩種方法 一個是基礎查詢 還有一個是批量插入庫

           #region 調用dapper
            //數據庫  普通查詢
            var Orm = new DapperHelper();
            var locallist = Orm.Select<Local>("select * from Local");


            //調用擴展 使用SqlBulkCopy 批量存庫
            List<Local> ts = new List<Local>();
            Local locala = new Local();
            locala.ID = Guid.NewGuid();
            locala.sendtime = "kanfkasf";
            locala.backtime = "kanfkasf";
            locala.status = 0;
            Local localb = new Local();
            localb.ID = Guid.NewGuid();
            localb.sendtime = "dfafaf";
            localb.backtime = "dfssfd";
            localb.status = 2;
            ts.Add(locala);
            ts.Add(localb);
            Orm.InsertTable(ListToDataTable(ts), "Local");
            #endregion

上面的批量入庫的方法中調用了 List轉datatable的方法

     /// <summary>
        /// list轉table
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entitys"></param>
        /// <returns></returns>
        public static DataTable ListToDataTable<T>(List<T> entitys)
        {

            //檢查實體集合不能為空
            if (entitys == null || entitys.Count < 1)
            {
                return new DataTable();
            }

            //取出第一個實體的所有Propertie
            Type entityType = entitys[0].GetType();
            PropertyInfo[] entityProperties = entityType.GetProperties();

            //生成DataTable的structure
            //生產代碼中,應將生成的DataTable結構Cache起來,此處略
            DataTable dt = new DataTable("dt");
            for (int i = 0; i < entityProperties.Length; i++)
            {
                Type colType = entityProperties[i].PropertyType;
                if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    colType = colType.GetGenericArguments()[0];
                }
                //dt.Columns.Add(entityProperties[i].Name, entityProperties[i].GetMethod);
                dt.Columns.Add(entityProperties[i].Name, colType);
            }

            //將所有entity添加到DataTable中
            foreach (object entity in entitys)
            {
                //檢查所有的的實體都為同一類型
                if (entity.GetType() != entityType)
                {
                    throw new Exception("要轉換的集合元素類型不一致");
                }
                object[] entityValues = new object[entityProperties.Length];
                for (int i = 0; i < entityProperties.Length; i++)
                {
                    entityValues[i] = entityProperties[i].GetValue(entity, null);

                }
                dt.Rows.Add(entityValues);
            }
            return dt;
        }


免責聲明!

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



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