zoukankan      html  css  js  c++  java
  • .net core

    需要引入包:

    Dapper
    Dapper.Contrib
    

      

    接口代码:

    /// <summary>
    /// Dapper上下文
    /// </summary>
    public interface IDapperContext : IDisposable
    {
        /// <summary>
        /// 数据库连接对象
        /// </summary>
        IDbConnection Connection { get; }
    }
    
    /// <summary>
    /// 数据库CRUD等操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IRepository<T> where T : class
    {
        /// <summary>
        /// 连接
        /// </summary>
        IDbConnection Connection { get; }
    
        /// <summary>
        /// 上下文
        /// </summary>
        IDapperContext Context { get; }
    
        /// <summary>
        /// 设置上下文连接字符串
        /// </summary>
        /// <param name="connectionString">字符串</param>
        void SetContext(string connectionString);
    
        /// <summary>
        /// 重置上下文,用appSetting.json里的数据库连接串
        /// </summary>
        void ResetContext();
    
        /// <summary>
        /// 获取分页数据
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="criteria">查询设置</param>
        /// <param name="param"></param>
        /// <returns></returns>
        PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class;
    
    
        /// <summary>
        /// 根据主键获取数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        T GetByKey<T>(object key, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
    
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null);
    
        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        void Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null);
    
        /// <summary>
        /// 删除单条数据
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        void Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null);
    
        /// <summary>
        /// 根据主键获取数据
        /// </summary>
        /// <param name="key"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        T GetByKey(object key, IDbTransaction transaction = null, int? commandTimeout = null);
    
        /// <summary>
        /// 获取所有数据
        /// </summary>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null);
    
        /// <summary>
        /// 根据条件获取数据列表
        /// </summary>
        /// <param name="where"></param>
        /// <param name="order"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        IEnumerable<T> GetBy(object where = null, object order = null, IDbTransaction transaction = null, int? commandTimeout = null);
    
        IEnumerable<T> GetBy<T>(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
    
        T QuerySingleOrDefault<T>(string sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
    
        /// <summary>
        /// 查询数据列表
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        IEnumerable<dynamic> Query(string sql, IDbTransaction transaction = null, int? commandTimeout = null);
    
    
        /// <summary>
        /// 查询数据列表
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        IEnumerable<T> Query<T>(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
    
    
        /// <summary>
        /// 查询数据列表
        /// </summary>
        /// <typeparam name="TFirst"></typeparam>
        /// <typeparam name="TSecond"></typeparam>
        /// <typeparam name="TReturn"></typeparam>
        /// <param name="sql"></param>
        /// <param name="map"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>(string sql, Func<TFirst, TSecond, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
    
    
        IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(string sql, Func<TFirst, TSecond, TThird, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
    
        IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
    
        IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
    
        IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
        /// <summary>
        /// 查询数据列表
        /// </summary>
        /// <typeparam name="TFirst"></typeparam>
        /// <typeparam name="TSecond"></typeparam>
        /// <typeparam name="TThird"></typeparam>
        /// <typeparam name="TFourth"></typeparam>
        /// <typeparam name="TReturn"></typeparam>
        /// <param name="sql"></param>
        /// <param name="map"></param>
        /// <param name="param"></param>
        /// <param name="transaction"></param>
        /// <param name="splitOn"></param>
        /// <param name="commandTimeout"></param>
        /// <param name="commandType"></param>
        /// <returns></returns>
        IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
    
        /// <summary>
        /// 执行sql
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null);
    
        /// <summary>
        /// 返回单个参数
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        object ExcuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null);
    
        GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null);
    }
    

      

    实现:

    public class DapperContext : IDapperContext
    {
        /// <summary>
        /// 连接字符串
        /// </summary>
        private string _connectionString;
    
        private bool _useMiniProfiling;
    
        /// <summary>
        /// 连接
        /// </summary>
        private IDbConnection _connection;
    
        ///// <summary>
        ///// 节点对象
        ///// </summary>
        //private readonly AppSetting _appSetting;
    
        /// <summary>
        /// 构造函数注入IOptions
        /// </summary>
        /// <param name="appSetting"></param>
        public DapperContext(IConfiguration configuration)
        {
            _connectionString = configuration["AppSetting:ConnectionString"];
            _useMiniProfiling = bool.Parse(configuration["AppSetting.UseMiniProfiling"]);
        }
    
        /// <summary>
        /// 连接字符串,用于各个公司
        /// </summary>
        /// <param name="connectionString"></param>
        public DapperContext(string connectionString)
        {
            _connectionString = connectionString;
        }
    
        /// <summary>
        /// 获取连接
        /// </summary>
        public IDbConnection Connection
        {
            get
            {
                if (_connection == null || _connection.State == ConnectionState.Closed)
                {
                    if (_useMiniProfiling)
                    {
                        _connection = new ProfiledDbConnection(new SqlConnection(_connectionString), MiniProfiler.Current);
                    }
                    else
                    {
                        _connection = new SqlConnection(_connectionString);
                    }
                }
                if (_connection.State != ConnectionState.Open)
                {
                    //Console.WriteLine("数据库连接:" + _connectionString);
                    _connection.Open();
                }
                return _connection;
            }
        }
    
        /// <summary>
        /// 释放连接
        /// </summary>
        public void Dispose()
        {
            if (_connection != null && _connection.State == ConnectionState.Open)
                _connection.Close();
        }
    }
    

      

        public class Repository<T> : IRepository<T> where T : class
        {
            public IDbConnection Connection
            {
                get
                {
                    return Context.Connection;
                }
            }
    
            /// <summary>
            /// 存储appsetting.json里的数据库连接字符串
            /// </summary>
            private string _connectionString;
    
            public IDapperContext Context { get; private set; }
    
            public Repository(IDapperContext context)
            {
                Context = context;
                _connectionString = context.Connection.ConnectionString;
            }
    
            /// <summary>
            /// 设置上下文连接字符串
            /// </summary>
            /// <param name="connectionString"></param>
            public void SetContext(string connectionString)
            {
                Context.Dispose();
                Context = new DapperContext(connectionString);
            }
            
            /// <summary>
            /// 重置上下文,用appSetting.json里的数据库连接串
            /// </summary>
            public void ResetContext()
            {
                SetContext(_connectionString);
            }
    
            public PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class
            {
                var p = new DynamicParameters();
                string proName = "CCHRWebApiProcGetPageData";
                p.Add("TableName", criteria.TableName);
                p.Add("PrimaryKey", criteria.PrimaryKey);
                p.Add("Fields", criteria.Fields);
                p.Add("Condition", criteria.Condition);
                p.Add("CurrentPage", criteria.CurrentPage);
                p.Add("PageSize", criteria.PageSize);
                p.Add("Sort", criteria.Sort);
                p.Add("RecordCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
                var pageData = new PageDataView<TEntity>();
                int excuteTimes = 0;
                //QUERY:
                try
                {
                    pageData.Items = Connection.Query<TEntity>(proName, p, commandType: CommandType.StoredProcedure, commandTimeout:300).ToList();
                    pageData.TotalNum = p.Get<int>("RecordCount");
                    pageData.TotalPageCount = Convert.ToInt32(Math.Ceiling(pageData.TotalNum * 1.0 / criteria.PageSize));
                    pageData.CurrentPage = criteria.CurrentPage > pageData.TotalPageCount ? pageData.TotalPageCount : criteria.CurrentPage;
                }
                catch (Exception e)
                {
                    excuteTimes++;
                    if (e.Message.Contains("找不到存储过程 'CCHRWebApiProcGetPageData'") && excuteTimes <= 3)
                    {
                        FileStream fileStream = new FileStream(@"SqlCCHRWebApiProcGetPageData.sql", FileMode.Open);
                        StreamReader sr = new StreamReader(fileStream);
                        string sql = sr.ReadToEnd();
                        if (fileStream != null)
                            fileStream.Close();
                        if (sr != null)
                            sr.Close();
                        if (!string.IsNullOrEmpty(sql))
                        {
                            Connection.Execute(sql);
                           // goto QUERY;
                        }
                        throw;
                    }
                    else if ((e.Message.Contains("远程主机强迫关闭了一个现有的连接") || e.Message.Contains("指定的网络名不再可用")) && excuteTimes <= 3)
                    {
                        System.Threading.Thread.Sleep(excuteTimes * 1000);
                        //goto QUERY;
                    }
                    else
                    {
                        throw;
                    }
                }
                return pageData;
            }
    
            public virtual T GetByKey<T>(object id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
            {
                if (id == null)
                {
                    throw new ArgumentNullException("id");
                }
                return Connection.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout);
            }
    
            public long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity", "Add to DB null entity");
                }
                var res = Connection.Insert(entity, transaction: transaction, commandTimeout: commandTimeout);
                return res;
            }
    
            public virtual void Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity", "Update in DB null entity");
                }
                Connection.Update(entity, transaction: transaction, commandTimeout: commandTimeout);
            }
    
            public virtual void Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity", "Remove in DB null entity");
                }
                Connection.Delete(entity, transaction: transaction, commandTimeout: commandTimeout);
            }
    
            public virtual T GetByKey(object id, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                if (id == null)
                {
                    throw new ArgumentNullException("id");
                }
                return Connection.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout);
            }
    
            public virtual IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null)
            {
                return Connection.GetAll<T>(transaction: transaction, commandTimeout: commandTimeout);
            }
    
    
            public virtual T QuerySingleOrDefault<T>(string sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
            {
                return Connection.QuerySingleOrDefault<T>(sql, param, transaction: transaction, commandTimeout: commandTimeout);
            }
    
            public virtual IEnumerable<T> GetBy(object where = null, object order = null, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                return Connection.Query<T>(where.ToString(), commandTimeout:commandTimeout);
            }
    
            public virtual IEnumerable<T> GetBy<T>(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
            {
                return Connection.Query<T>(sql.ToString(), param: param, transaction: transaction, commandTimeout: commandTimeout);
            }
    
    
            public IEnumerable<dynamic> Query(string sql, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                return Connection.Query<dynamic>(sql);
            }
    
            public IEnumerable<T> Query<T>(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
            {
                return Connection.Query<T>(sql, param: param, transaction: transaction);
            }
    
            public IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>(string sql, Func<TFirst, TSecond, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
            {
                return Connection.Query<TFirst, TSecond, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
            }
            public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(string sql, Func<TFirst, TSecond, TThird, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
            {
                return Connection.Query<TFirst, TSecond, TThird, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
            }
    
            public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
            {
                return Connection.Query<TFirst, TSecond, TThird, TFourth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
            }
    
            public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
            {
                return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
    
            }
            public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
            {
                return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
            }
            public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
            {
                return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
            }
    
            public int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                return Connection.Execute(sql, param: param, transaction: transaction);
            }
            public object ExcuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
            {
                return Connection.ExecuteScalar(sql, param: param, transaction: transaction, commandTimeout: commandTimeout);
            }
    
            public GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) {
    
                return Connection.QueryMultiple(sql, param: param, transaction: transaction, commandTimeout: commandTimeout);
            } 
        }
    

      

  • 相关阅读:
    041_form表单重置数据reset()
    040_下拉列表的显示与提交数值时,需要用到转义字符
    039_如何选取checkbox的id值?
    011_表单数据非空验证
    010_@ResposBody错误
    010_页面单击按钮失灵
    使用Maven创建 web项目
    java设计模式(八) 适配器模式
    设计模式 6大设计原则
    Java设计模式(七) 模板模式-使用钩子
  • 原文地址:https://www.cnblogs.com/gygtech/p/13615065.html
Copyright © 2011-2022 走看看