zoukankan      html  css  js  c++  java
  • ASP .Net Core 使用 Dapper 轻型ORM框架

    一:优势

    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;
  • 相关阅读:
    Vue根据URL传参来控制全局 console.log 的开关
    原来你是这样的毛玻璃
    CSS3边框会动的信封
    判断当前系统当前浏览器是否安装启用 Adobe Flash Player,检查在chrome中的状态
    随笔一个正则
    PHP实现栈数据结构
    php实现一个单链表
    php中按值传递和按引用传递的一个问题
    利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下
    php中DateTime、diff
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/6005771.html
Copyright © 2011-2022 走看看