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