一:優勢
1,Dapper是一個輕型的ORM類。代碼就一個SqlMapper.cs文件,編譯后就40K的一個很小的Dll.
2,Dapper很快。Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。
3,Dapper支持什么數據庫。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的數據庫,當然如果你知道原理也可以讓它支持Mongo db
4,Dapper的r支持多表並聯的對象。支持一對多 多對多的關系。並且沒侵入性,想用就用,不想用就不用。無XML無屬性。代碼以前怎么寫現在還怎么寫。 5,Dapper原理通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象。性能實在高高高。
6,Dapper支持net2.0,3.0,3.5,4.0。【如果想在Net2.0下使用,可以去網上找一下Net2.0下如何配置運行Net3.5即可。】 7,Dapper語法十分簡單。並且無須遷就數據庫的設計。
二:ASP .Net Core 中使用dapper可以很方便的操作mysql數據
需要安裝如下類庫 "Dapper": "1.50.2", "NETStandard.Library": "1.6.0", "SapientGuardian.MySql.Data": "6.9.813"
三:基於dapper的操作mysql的封裝類
/// <summary> ///作者: 逍遙帝君 /// 2016-10-26 /// </summary> public class DapperMySQLHelp { #region +ExcuteNonQuery 增、刪、改同步操作 /// <summary> /// 增、刪、改同步操作 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">鏈接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>int</returns> public int ExcuteNonQuery<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { int result = 0; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { result = con.Execute(cmd, param, null, null, CommandType.StoredProcedure); } else { result = con.Execute(cmd, param, null, null, CommandType.Text); } } return result; } #endregion #region +ExcuteNonQueryAsync 增、刪、改異步操作 /// <summary> /// 增、刪、改異步操作 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">鏈接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>int</returns> public async Task<int> ExcuteNonQueryAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { int result = 0; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { result = await con.ExecuteAsync(cmd, param, null, null, CommandType.StoredProcedure); } else { result = await con.ExecuteAsync(cmd, param, null, null, CommandType.Text); } } return result; } #endregion #region +ExecuteScalar 同步查詢操作 /// <summary> /// 同步查詢操作 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>object</returns> public object ExecuteScalar<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { object result = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { result = con.ExecuteScalar(cmd, param, null, null, CommandType.StoredProcedure); } else { result = con.ExecuteScalar(cmd, param, null, null, CommandType.Text); } } return result; } #endregion #region +ExecuteScalarAsync 異步查詢操作 /// <summary> /// 異步查詢操作 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>object</returns> public async Task<object> ExecuteScalarAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { object result = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { result = await con.ExecuteScalarAsync(cmd, param, null, null, CommandType.StoredProcedure); } else { result = con.ExecuteScalarAsync(cmd, param, null, null, CommandType.Text); } } return result; } #endregion #region +FindOne 同步查詢一條數據 /// <summary> /// 同步查詢一條數據 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>t</returns> public T FindOne<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { IDataReader dataReader = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure); } else { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text); } if (dataReader == null || !dataReader.Read()) return null; Type type = typeof(T); T t = new T(); foreach (var item in type.GetProperties()) { for (int i = 0; i < dataReader.FieldCount; i++) { //屬性名與查詢出來的列名比較 if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue; var kvalue = dataReader[item.Name]; if (kvalue == DBNull.Value) continue; item.SetValue(t, kvalue, null); break; } } return t; } } #endregion #region +FindOne 異步查詢一條數據 /// <summary> /// 異步查詢一條數據 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>t</returns> public async Task<T> FindOneAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { IDataReader dataReader = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.StoredProcedure); } else { dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.Text); } if (dataReader == null || !dataReader.Read()) return null; Type type = typeof(T); T t = new T(); foreach (var item in type.GetProperties()) { for (int i = 0; i < dataReader.FieldCount; i++) { //屬性名與查詢出來的列名比較 if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue; var kvalue = dataReader[item.Name]; if (kvalue == DBNull.Value) continue; item.SetValue(t, kvalue, null); break; } } return t; } } #endregion #region +FindToList 同步查詢數據集合 /// <summary> /// 同步查詢數據集合 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>t</returns> public IList<T> FindToList<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { IDataReader dataReader = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure); } else { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text); } if (dataReader == null || !dataReader.Read()) return null; Type type = typeof(T); List<T> tlist = new List<T>(); while (dataReader.Read()) { T t = new T(); foreach (var item in type.GetProperties()) { for (int i = 0; i < dataReader.FieldCount; i++) { //屬性名與查詢出來的列名比較 if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue; var kvalue = dataReader[item.Name]; if (kvalue == DBNull.Value) continue; item.SetValue(t, kvalue, null); break; } } if (tlist != null) tlist.Add(t); } return tlist; } } #endregion #region +FindToListAsync 異步查詢數據集合 /// <summary> /// 異步查詢數據集合 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>t</returns> public async Task<IList<T>> FindToListAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { IDataReader dataReader = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.StoredProcedure); } else { dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.Text); } if (dataReader == null || !dataReader.Read()) return null; Type type = typeof(T); List<T> tlist = new List<T>(); while (dataReader.Read()) { T t = new T(); foreach (var item in type.GetProperties()) { for (int i = 0; i < dataReader.FieldCount; i++) { //屬性名與查詢出來的列名比較 if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue; var kvalue = dataReader[item.Name]; if (kvalue == DBNull.Value) continue; item.SetValue(t, kvalue, null); break; } } if (tlist != null) tlist.Add(t); } return tlist; } } #endregion #region +FindToList 同步查詢數據集合 /// <summary> /// 同步查詢數據集合 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>t</returns> public IList<T> FindToListAsPage<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { IDataReader dataReader = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure); } else { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text); } if (dataReader == null || !dataReader.Read()) return null; Type type = typeof(T); List<T> tlist = new List<T>(); while (dataReader.Read()) { T t = new T(); foreach (var item in type.GetProperties()) { for (int i = 0; i < dataReader.FieldCount; i++) { //屬性名與查詢出來的列名比較 if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue; var kvalue = dataReader[item.Name]; if (kvalue == DBNull.Value) continue; item.SetValue(t, kvalue, null); break; } } if (tlist != null) tlist.Add(t); } return tlist; } } #endregion #region +FindToListByPage 同步分頁查詢數據集合 /// <summary> /// 同步分頁查詢數據集合 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>t</returns> public IList<T> FindToListByPage<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { IDataReader dataReader = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure); } else { dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text); } if (dataReader == null || !dataReader.Read()) return null; Type type = typeof(T); List<T> tlist = new List<T>(); while (dataReader.Read()) { T t = new T(); foreach (var item in type.GetProperties()) { for (int i = 0; i < dataReader.FieldCount; i++) { //屬性名與查詢出來的列名比較 if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue; var kvalue = dataReader[item.Name]; if (kvalue == DBNull.Value) continue; item.SetValue(t, kvalue, null); break; } } if (tlist != null) tlist.Add(t); } return tlist; } } #endregion #region +FindToListByPageAsync 異步分頁查詢數據集合 /// <summary> /// 異步分頁查詢數據集合 /// 作者: 逍遙帝君 /// 2016-10-26 /// </summary> /// <typeparam name="T">實體</typeparam> /// <param name="connection">連接字符串</param> /// <param name="cmd">sql語句</param> /// <param name="param">參數</param> /// <param name="flag">true存儲過程,false sql語句</param> /// <returns>t</returns> public async Task<IList<T>> FindToListByPageAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new() { IDataReader dataReader = null; using (MySqlConnection con = new MySqlConnection(connection)) { if (flag) { dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.StoredProcedure); } else { dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.Text); } if (dataReader == null || !dataReader.Read()) return null; Type type = typeof(T); List<T> tlist = new List<T>(); while (dataReader.Read()) { T t = new T(); foreach (var item in type.GetProperties()) { for (int i = 0; i < dataReader.FieldCount; i++) { //屬性名與查詢出來的列名比較 if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue; var kvalue = dataReader[item.Name]; if (kvalue == DBNull.Value) continue; item.SetValue(t, kvalue, null); break; } } if (tlist != null) tlist.Add(t); } return tlist; } } #endregion }
四:分頁查詢存儲過程
存儲過程 CREATE PROCEDURE page_getperson ( _pageIndex INT, _pageSize INT, out _pagecount int ) BEGIN
DECLARE startIndex int DEFAULT 0; DECLARE tcount int DEFAULT 0; set startIndex=(_pageIndex-1)*_pageSize; SELECT * from Person LIMIT startIndex,_pageSize; SELECT COUNT(id) into tcount from Person; set _pagecount=tcount; END
五:參數寫法
DynamicParameters param = new DynamicParameters(); param.Add("_pageIndex", 2); param.Add("_pageSize", 5); param.Add("_pagecount", dbType: DbType.Int32, direction: ParameterDirection.Output); var result = mysql.FindToListByPage<Person>(connection, "page_getperson", param);
//總條數 var count = param.Get<int>("_pagecount"); var kk = result;