.NET Core学习——Dapper
一、了解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?
- 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
- 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
- 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
- 可以映射一对一,一对多,多对多等多种关系。
- 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
- 支持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相关推荐
- .NET Core 学习资料精选:进阶
2019.09月就要正式发布.NET 3.0了,对于前一篇博文<.NET Core 学习资料精选:入门>大家学的可还开心?这是本系列的第二篇文章:进阶篇,喜欢的园友速度学起来啊. 对于还在 ...
- Nancy in .Net Core学习笔记 - 初识Nancy
原文:Nancy in .Net Core学习笔记 - 初识Nancy 前言 去年11月份参加了青岛MVP线下活动,会上老MVP衣明志介绍了Nancy, 一直没有系统的学习一下,最近正好有空,就结合. ...
- .NET Core 使用Dapper 操作MySQL
MySQL官方驱动:http://www.cnblogs.com/linezero/p/5806814.html .NET Core 使用Dapper 操作MySQL 数据库, .NET Core 使 ...
- .NET Core 学习资料精选:入门
开源跨平台的.NET Core,还没上车的赶紧的,来不及解释了-- 本系列文章,主要分享一些.NET Core比较优秀的社区资料和微软官方资料.我进行了知识点归类,让大家可以更清晰的学习.NET Co ...
- ASP.NET Core学习资源汇总
ASP.NET Core入门学习资源汇总篇幅比較長,分为七个部分. (一)认识.NET Core (二)Vistual Studio安装.调试 (三)Asp.Net Core入门指南与学习路线 (四) ...
- autofac 作用域_C#编程之.Net Core 学习之路-AutoFac的使用
本文主要向大家介绍了C#编程之.Net Core 学习之路-AutoFac的使用,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. 本文不介绍IoC和DI的概念,如果你对Ioc之前没有了解的 ...
- orchard mysql_Orchard Core学习一
Orchard Core学习一 Orchard Core是ASP.NET Core上Orchard CMS的重新开发. Orchard Core由两个不同的目标组成: Orchard核心框架:用于在A ...
- OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现
最近趁着不忙,在构思一个搭建一个开源的完整项目,至于原因以及整个项目框架后边文章我再说明.既然要起一个完整的项目,那么数据仓储访问就必不可少,这篇文章我主要介绍这个新项目(OSS.Core)中我对仓储 ...
- Nancy in .Net Core学习笔记 - 视图引擎
前文中我们介绍了Nancy中的路由,这一篇我们来介绍一下Nancy中的视图引擎. Nancy中如何返回一个视图(View) 在ASP.NET Mvc中,我们使用ViewResult类来返回一个视图.N ...
最新文章
- Matlab获取新浪财经实时行情
- 在Anaconda下安装了TensorFlow库,matplotlib库却调用不了了
- android封装oauth2,Android AccountAuthenticator和OAuth2
- 找不同颜色小游戏html源码,Javascript实现找不同色块的游戏
- apache和mysql 403_如何使用mysql(lamp)分离环境搭建dedecms织梦网站及apache服务器常见的403http状态码及其解决方法...
- Bokeh 风格属性设置
- 大数据杀熟行为10月1日起明令禁止;阿里一号工程“犀牛制造”正式亮相;iOS 14 正式版发布 | 极客头条...
- 漆桂林:多模态知识图谱种类及其应用
- 【最新首发】创维电视安装第三方软件教程
- 网络工程制图论文计算机,计算机工程制图设计分析论文
- 井下作业类毕业论文文献有哪些?
- Ubuntu操作系统
- 文章采集代理ip怎么用?
- CVTE校招嵌入式经历
- 每日MySQL之010:导出Delimited-Text格式文件
- python pygame 游戏实践: 俄罗斯方块(Tetris Game)第一步
- 绿联硬盘盒挂载linux,绿联sata硬盘盒,2.5/3.5寸外置usb3.0移动硬盘盒
- 【面经】Hibernate常见面试题
- 原创小说 - 爱人失踪(连载 中部)
- Python进行Bagging和Adaboost
热门文章
- 极简定时截屏代码C++
- aspose for java_Aspose.Total下载
- 记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客! - 三生石上...
- Python 绘制散点密度图
- surfaceflinger分析
- 【论文导读】(AAAI)Achieving Counterfactual Fairness for Causal Bandit
- 创业公司开发自己的公司官网-从入门到上线-(1)
- 跨境电商如何设计出色的落地页:分步指南和5个案例分析
- 小程序搜索框_小程序直播有了搜索入口 这波微信公域流量你要不要抓?
- C# 第六章『交互式图形界面』◆第2节:控件(1)