一、了解Dapper

我们都知道,ORM全称是,Object Relationship Mapper,即,对象关系映射。也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架叫做dapper,而且被称为the king of ORM。

  市场上,也有一些其他的ORM,比如EF Core,NHibernate 、FreeSQL等等,来处理大数据访问及关系映射。既然官方推出了EF Core,说明其对框架的支持会很友好,为什么又会有那么多的ORM框架供我们使用呢?其实,每一个框架都有其适用的场景。如果你在小的项目中,使用Entity Framework、Entity Framework Core、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。其实,Entity Framework Core的性能并不是很高,当对性能有要求的时候,一般公司都会自己封装一套ORM。

为什么选择Dapper?

  1. 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
  2. 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
  3. 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  4. 可以映射一对一,一对多,多对多等多种关系。
  5. 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
  6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

二、使用Dapper

在这里,我们在dotnet core下面使用Dapper操作MySQL。

首先,就先创建一个core webapi的项目,基于core3.1版本创建一个项目。

Dapper安装,使用NuGet来安装Dapper程序包

Install-Package Dapper -Version 2.0.30

Install-Package Dapper.Contrib -Version 2.0.30

使用NuGet安装MySQL.Data的程序包

安装这些程序包之后,在appsettings.json文件中添加链接数据库的字符串:

"ConnectionStrings": {"DefaultConnection": "server=服务器;port=端口号;database=regatta{0};SslMode=None;uid=userName;pwd=passWord;Allow User Variables=true"}

然后,封装一个工具类,来获得我们的连接字符串,和管理连接池。

IDapperContext:

    /// <summary>/// Dapper上下文/// </summary>public interface IDapperContext : IDisposable{/// <summary>/// 数据库连接对象/// </summary>IDbConnection ReadConnection { get; }/// <summary>/// 数据库连接对象/// </summary>IDbConnection WriteConnection { get; }}

DapperContext:

    public class DapperContext : IDapperContext{/// <summary>/// 读连接字符串/// </summary>private string _readConnectionString;/// <summary>/// 写连接字符串/// </summary>private string _writeConnectionString;private bool _useMiniProfiling;/// <summary>/// 读连接/// </summary>private IDbConnection _readConnection;/// <summary>/// 写连接/// </summary>private IDbConnection _wrteConnection;/// <summary>/// 配置/// </summary>private readonly AppSetting _appSetting;/// <summary>/// 构造函数注入IOptions/// </summary>/// <param name="appSetting"></param>public DapperContext(IOptions<AppSetting> appSetting){_appSetting = appSetting.Value;_readConnectionString = _appSetting.ReadOnlyConnectionString;_writeConnectionString = _appSetting.SetConnectionString;_useMiniProfiling = _appSetting.UseMiniProfiling;}/// <summary>/// 连接字符串/// </summary>/// <param name="connectionString"></param>public DapperContext(string connectionString){_readConnectionString = connectionString;}#region 读/// <summary>/// 获取连接/// </summary>public IDbConnection ReadConnection{get{if (_readConnection == null || _readConnection.State == ConnectionState.Closed){if (_useMiniProfiling){_readConnection = new ProfiledDbConnection(new MySqlConnection(_readConnectionString), MiniProfiler.Current);}else{_readConnection = new MySqlConnection(_readConnectionString);}}if (_readConnection.State != ConnectionState.Open){_readConnection.Open();}return _readConnection;}}/// <summary>/// 释放连接/// </summary>public void Dispose(){if (_readConnection != null && _readConnection.State == ConnectionState.Open)_readConnection.Close();if (_wrteConnection != null && _wrteConnection.State == ConnectionState.Open)_wrteConnection.Close();}#endregion 读#region 写/// <summary>/// 获取连接/// </summary>public IDbConnection WriteConnection{get{if (_wrteConnection == null || _wrteConnection.State == ConnectionState.Closed){if (_useMiniProfiling){_wrteConnection = new ProfiledDbConnection(new MySqlConnection(_writeConnectionString), MiniProfiler.Current);}else{_wrteConnection = new MySqlConnection(_writeConnectionString);}}if (_wrteConnection.State != ConnectionState.Open){_wrteConnection.Open();}return _wrteConnection;}}#endregion 写}

创建一个仓储,用来存放数据库CRUD等操作

IRepository:

    /// <summary>/// 数据库CRUD等操作/// </summary>/// <typeparam name="T"></typeparam>public interface IRepository<T> where T : class{/// <summary>/// 上下文/// </summary>IDapperContext Context { get; }/// <summary>/// 只读连接/// </summary>IDbConnection ReadConnection { get; }/// <summary>/// 读写连接/// </summary>IDbConnection WriteConnection { get; }/// <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="TEntity"></typeparam>/// <param name="criteria"></param>/// <param name="param"></param>/// <returns></returns>PageDataView<TEntity> GetAllData<TEntity>(PageCriteria criteria, object param = null) where TEntity : 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>/// <returns></returns>long BatchAdd(IEnumerable<T> list, IDbTransaction transaction = null, int? commandTimeout = null);/// <summary>////// </summary>/// <param name="entity"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>bool Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null);/// <summary>/// 删除单条数据/// </summary>/// <param name="entity"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>bool Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null);/// <summary>/// 批量删除/// </summary>/// <param name="list"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>/// <returns></returns>bool BatchRemove(IEnumerable<T> list, 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="sql"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>/// <returns></returns>IEnumerable<T> GetBy(object sql = null, 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>IEnumerable<dynamic> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null);/// <summary>/// 多对象查询/// </summary>/// <param name="sql"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, 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="sqlStr">查询(例:SELECT COUNT(1)  FROM XXX )</param>/// <returns></returns>bool Exists(string sqlStr, object param = null);}

Repository:

    public class Repository<T> : IRepository<T> where T : class{public Repository(IDapperContext context){Context = context;}public IDapperContext Context { get; private set; }public IDbConnection ReadConnection => Context.ReadConnection;public IDbConnection WriteConnection => Context.WriteConnection;public PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class{var p = new DynamicParameters();string proName = "ProcGetPageData";p.Add("_tables", criteria.TableName);p.Add("_fields", criteria.Fields);p.Add("_where", criteria.Condition);p.Add("_pageIndex", criteria.CurrentPage);p.Add("_pageSize", criteria.PageSize);p.Add("_orderby", criteria.Sort);p.Add("_totalcount", dbType: DbType.Int32, direction: ParameterDirection.Output);p.Add("_pagecount", dbType: DbType.Int32, direction: ParameterDirection.Output);var pageData = new PageDataView<TEntity>();pageData.Items = ReadConnection.Query<TEntity>(proName, p, commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();pageData.TotalNum = p.Get<int>("_totalcount");pageData.TotalPageCount = p.Get<int>("_pagecount"); //Convert.ToInt32(Math.Ceiling(pageData.TotalNum * 1.0 / criteria.PageSize));pageData.CurrentPage = criteria.CurrentPage > pageData.TotalPageCount ? pageData.TotalPageCount : criteria.CurrentPage;return pageData;}public PageDataView<TEntity> GetAllData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class{var p = new DynamicParameters();string proName = "ProcGetAllData";p.Add("_tables", criteria.TableName);p.Add("_fields", criteria.Fields);p.Add("_where", criteria.Condition);p.Add("_orderby", criteria.Sort);p.Add("_totalcount", dbType: DbType.Int32, direction: ParameterDirection.Output);var pageData = new PageDataView<TEntity>();pageData.Items = ReadConnection.Query<TEntity>(proName, p, commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();pageData.TotalNum = p.Get<int>("_totalcount");return pageData;}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 = WriteConnection.Insert(entity, transaction: transaction, commandTimeout: commandTimeout);return res;}public long BatchAdd(IEnumerable<T> list, IDbTransaction transaction = null, int? commandTimeout = null){if (list == null){throw new ArgumentNullException("list", "BatchAdd to DB null entity");}var res = WriteConnection.Insert(list, transaction: transaction, commandTimeout: commandTimeout);return res;}public virtual bool Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null){if (entity == null){throw new ArgumentNullException("entity", "Update in DB null entity");}return WriteConnection.Update(entity, transaction: transaction, commandTimeout: commandTimeout);}public virtual bool Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null){if (entity == null){throw new ArgumentNullException("entity", "Remove in DB null entity");}return WriteConnection.Delete(entity, transaction: transaction, commandTimeout: commandTimeout);}public bool BatchRemove(IEnumerable<T> list, IDbTransaction transaction = null, int? commandTimeout = null){if (list == null){throw new ArgumentNullException("list", "BatchAdd to DB null entity");}return WriteConnection.Delete(list, transaction: transaction, commandTimeout: commandTimeout);}public virtual T GetByKey(object queryId, IDbTransaction transaction = null, int? commandTimeout = null){if (queryId == null){throw new ArgumentNullException("queryId");}return ReadConnection.Get<T>(queryId, transaction: transaction, commandTimeout: commandTimeout);}public virtual IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null){return ReadConnection.GetAll<T>(transaction: transaction, commandTimeout: commandTimeout);}public virtual IEnumerable<T> GetBy(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null){return ReadConnection.Query<T>(sql.ToString(), param, commandTimeout: commandTimeout);}public IEnumerable<dynamic> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null){return ReadConnection.Query<dynamic>(sql, param);}public GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null){return ReadConnection.QueryMultiple(sql, param, transaction, commandTimeout, commandType);}public int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null){return WriteConnection.Execute(sql, param, transaction: transaction);}public bool Exists(string sqlStr, object param = null){return ReadConnection.Query<dynamic>(sqlStr, param).Count() > 0 ? true : false;}}

利用工厂模式创建仓库

IFactoryRepository:

    /// <summary>/// 创建仓库接口/// </summary>public interface IFactoryRepository{/// <summary>/// 创建仓库/// </summary>/// <typeparam name="T"></typeparam>/// <param name="context"></param>/// <returns></returns>IRepository<T> CreateRepository<T>(IDapperContext context) where T : class;}

FactoryRepository:

    /// <summary>/// 工厂/// </summary>public class FactoryRepository : IFactoryRepository{/// <summary>/// 创建Repository/// </summary>/// <typeparam name="T"></typeparam>/// <param name="context"></param>/// <returns></returns>public IRepository<T> CreateRepository<T>(IDapperContext context) where T : class{IRepository<T> repository = new Repository<T>(context);return repository;}}

相关文章:

**Dapper的基本使用

NetCore+Dapper WebApi架构搭建(一):基本框架

NetCore+Dapper WebApi架构搭建(二):底层封装

NetCore+Dapper WebApi架构搭建(三):添加实体和仓储

NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入

.NET Core学习——Dapper相关推荐

  1. .NET Core 学习资料精选:进阶

    2019.09月就要正式发布.NET 3.0了,对于前一篇博文<.NET Core 学习资料精选:入门>大家学的可还开心?这是本系列的第二篇文章:进阶篇,喜欢的园友速度学起来啊. 对于还在 ...

  2. Nancy in .Net Core学习笔记 - 初识Nancy

    原文:Nancy in .Net Core学习笔记 - 初识Nancy 前言 去年11月份参加了青岛MVP线下活动,会上老MVP衣明志介绍了Nancy, 一直没有系统的学习一下,最近正好有空,就结合. ...

  3. .NET Core 使用Dapper 操作MySQL

    MySQL官方驱动:http://www.cnblogs.com/linezero/p/5806814.html .NET Core 使用Dapper 操作MySQL 数据库, .NET Core 使 ...

  4. .NET Core 学习资料精选:入门

    开源跨平台的.NET Core,还没上车的赶紧的,来不及解释了-- 本系列文章,主要分享一些.NET Core比较优秀的社区资料和微软官方资料.我进行了知识点归类,让大家可以更清晰的学习.NET Co ...

  5. ASP.NET Core学习资源汇总

    ASP.NET Core入门学习资源汇总篇幅比較長,分为七个部分. (一)认识.NET Core (二)Vistual Studio安装.调试 (三)Asp.Net Core入门指南与学习路线 (四) ...

  6. autofac 作用域_C#编程之.Net Core 学习之路-AutoFac的使用

    本文主要向大家介绍了C#编程之.Net Core 学习之路-AutoFac的使用,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. 本文不介绍IoC和DI的概念,如果你对Ioc之前没有了解的 ...

  7. orchard mysql_Orchard Core学习一

    Orchard Core学习一 Orchard Core是ASP.NET Core上Orchard CMS的重新开发. Orchard Core由两个不同的目标组成: Orchard核心框架:用于在A ...

  8. OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现

    最近趁着不忙,在构思一个搭建一个开源的完整项目,至于原因以及整个项目框架后边文章我再说明.既然要起一个完整的项目,那么数据仓储访问就必不可少,这篇文章我主要介绍这个新项目(OSS.Core)中我对仓储 ...

  9. Nancy in .Net Core学习笔记 - 视图引擎

    前文中我们介绍了Nancy中的路由,这一篇我们来介绍一下Nancy中的视图引擎. Nancy中如何返回一个视图(View) 在ASP.NET Mvc中,我们使用ViewResult类来返回一个视图.N ...

最新文章

  1. Matlab获取新浪财经实时行情
  2. 在Anaconda下安装了TensorFlow库,matplotlib库却调用不了了
  3. android封装oauth2,Android AccountAuthenticator和OAuth2
  4. 找不同颜色小游戏html源码,Javascript实现找不同色块的游戏
  5. apache和mysql 403_如何使用mysql(lamp)分离环境搭建dedecms织梦网站及apache服务器常见的403http状态码及其解决方法...
  6. Bokeh 风格属性设置
  7. 大数据杀熟行为10月1日起明令禁止;阿里一号工程“犀牛制造”正式亮相;iOS 14 正式版发布 | 极客头条...
  8. 漆桂林:多模态知识图谱种类及其应用
  9. 【最新首发】创维电视安装第三方软件教程
  10. 网络工程制图论文计算机,计算机工程制图设计分析论文
  11. 井下作业类毕业论文文献有哪些?
  12. Ubuntu操作系统
  13. 文章采集代理ip怎么用?
  14. CVTE校招嵌入式经历
  15. 每日MySQL之010:导出Delimited-Text格式文件
  16. python pygame 游戏实践: 俄罗斯方块(Tetris Game)第一步
  17. 绿联硬盘盒挂载linux,绿联sata硬盘盒,2.5/3.5寸外置usb3.0移动硬盘盒
  18. 【面经】Hibernate常见面试题
  19. 原创小说 - 爱人失踪(连载 中部)
  20. Python进行Bagging和Adaboost

热门文章

  1. 极简定时截屏代码C++
  2. aspose for java_Aspose.Total下载
  3. 记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客! - 三生石上...
  4. Python 绘制散点密度图
  5. surfaceflinger分析
  6. 【论文导读】(AAAI)Achieving Counterfactual Fairness for Causal Bandit
  7. 创业公司开发自己的公司官网-从入门到上线-(1)
  8. 跨境电商如何设计出色的落地页:分步指南和5个案例分析
  9. 小程序搜索框_小程序直播有了搜索入口 这波微信公域流量你要不要抓?
  10. C# 第六章『交互式图形界面』◆第2节:控件(1)