我们都知道,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

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

首先,既然是演示,就先创建一个core MVC的项目,这里选择有模板的。因为公司使用的是dotnet core2.2的版本,我就基于core2.2版本创建一个项目。

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

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

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

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

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

public class BaseRepository : IDisposable
{
public static IConfigurationRoot Configuration { get; set; } public static MySqlConnection conn; public static MySqlConnection GetMySqlConnection(bool open = true,
bool convertZeroDatetime = false, bool allowZeroDatetime = false)
{
var builder = new ConfigurationBuilder()
  .SetBasePath(Directory.GetCurrentDirectory())
  .AddJsonFile("appsettings.json")
   .Build();
var cs = builder.GetSection("ConnectionStrings:DefaultConnection").Value;
var csb = new MySqlConnectionStringBuilder(cs)
{
AllowZeroDateTime = allowZeroDatetime,
ConvertZeroDateTime = convertZeroDatetime
};
conn = new MySqlConnection(csb.ConnectionString);
return conn;
} public void Dispose()
{
if (conn != null && conn.State != System.Data.ConnectionState.Closed)
{
conn.Close();
}
}
}

或者, 在startup中注册dapper仓储,并现时注册数据库类型和数据库连接串,因为在mysql和sqlserver中,它们的连接串是不同的,模块化设计请看大叔这篇文章,《DotNetCore跨平台~组件化时代来了》

services.UseLog4Logger(o =>
{
o.Log4ConfigFileName = "log4.config";
o.ProjectName = "test";
}).UseDapper(o =>
{
o.ConnString = "server=服务器;port=端口号;database=regatta{0};SslMode=None;uid=userName;pwd=passWord;Allow User Variables=true";
o.DbType = DbType.MySql;
}).UseDefaultMQ();

创建数据库中的一个需要映射的实体类:

public class Area
{
public int ID { get; set; } public string Name { get; set; } public int ParentID { get; set; }
}

当有些时候,数据库中的表名,与我们定义的实体类的类名,可能会不一致。这个时候,就需要加一个特性标签来声明了:

[Display(Name = "tbl_area")]
public class Area
{
public int ID { get; set; } public string Name { get; set; } public int ParentID { get; set; }
}

当然,有些表中的字段与实体类中的自己定义的属性,也不一样,其实有好多解决方法,可以在使用T-SQL的时候,使用别名。比如,SELECT id AS ID FROM TABLE..,或者使用特性标签,具体请参考:https://www.cnblogs.com/efreer/p/8277329.html

查询操作

/// <summary>
/// 查询单个数据
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public static Area QueryFirstOrDefault(int Id)
{
var sql = "SELECT * from Area where id =@ID";
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.QueryFirstOrDefault<Area>(sql, new { ID = Id });
}
}
/// <summary>
/// 查询所有数据
/// </summary>
/// <returns></returns>
public static List<Area> QueryList()
{
var sql = "select * from Area";
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.Query<Area>(sql).ToList();
}
}
/// <summary>
/// In操作
/// </summary>
public static List<Area> QueryIn()
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
var sql = "select * from Area where id in @ids";
//参数类型是Array的时候,dappper会自动将其转化
return connection.Query<Area>(sql, new { ids = new int[] { , }, }).ToList();
}
} public static List<Area> QueryIn(int[] ids)
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
var sql = "select * from Area where id in @ids";
//参数类型是Array的时候,dappper会自动将其转化
return connection.Query<Area>(sql, new { ids }).ToList();
}
}

插入操作

/// <summary>
/// 插入一条数据
/// </summary>
/// <param name="Area"></param>
/// <returns></returns>
public static int Insert(Area Area)
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.Execute($"INSERT INTO Area(Name,ParentID) VALUES(@Name,@ParentID)", Area);
}
} /// <summary>
/// 批量插入Area数据,返回影响行数
/// </summary>
/// <param name="Areas"></param>
/// <returns></returns>
public static int Insert(List<Area> Areas)
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.Execute("INSERT INTO Area(ID,Name,ParentID) VALUES(@ID,@Name,@ParentID)", Areas);
}
}

删除操作

/// <summary>
/// 删除一条
/// </summary>
/// <param name="Area"></param>
/// <returns></returns>
public static int Delete(Area Area)
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.Execute("DELETE FROM Area WHERE id=@ID", Area);
}
} /// <summary>
/// 批量删除
/// </summary>
/// <param name="Areas"></param>
/// <returns></returns>
public static int Delete(List<Area> Areas)
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.Execute("DELETE FROM Area WHERE id=@ID", Areas);
}
}

修改操作

/// <summary>
/// 修改
/// </summary>
/// <param name="Area"></param>
/// <returns></returns>
public static int Update(Area Area)
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.Execute("update Area set name=@name where id=@ID", Area);
}
} /// <summary>
/// 批量修改
/// </summary>
/// <param name="Areas"></param>
/// <returns></returns>
public static int Update(List<Area> Areas)
{
using (IDbConnection connection = BaseRepository.GetMySqlConnection())
{
return connection.Execute("update Area set name=@name where id=@ID", Areas);
}
}

Join操作

  我们是面向对象编程,所以一个对象里面会有许多其他子对象,这个子对象里面又有其自己的子对象,这种关系在数据库里的表示就是外键。
比如我们有一本书book,它有主人person,book是一个对象,主人又是一个对象。

public class BookWithPerson
{
public int ID { get; set; }
public Person Pers { get; set; }
public string BookName { get; set; }
}

  我们自然想要一个方法把数据库里复杂的外键关系转成我们需要的对象BookWithArea,所有我们需要的信息都存在里面,取数据的时候只要找这个对象取数据就行了,比如我们需要一本书的主人的姓名,我们只需要bookWithArea.Pers.Name。如果是一对多的关系我们用数组,如果是多对多我们加一层mapping。
现在我们想根据书的ID查询书的信息,包括主人信息。那么

public static BookWithPerson QueryJoin(Book book)
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
var sql = @"select b.id,b.bookName,p.id,p.name,p.remark
from Person as p
join Book as b
on p.id = b.personId
where b.id = @id;";
var result = connection.Query<BookWithPerson, Person, BookWithPerson>(sql,
(bookWithPerson, person) =>
{
bookWithPerson.Pers = person;
return bookWithPerson;
},
book);
  //splitOn: "bookName");
  return (BookWithPerson)result;
  }
}

中,Query的三个泛型参数分别是委托回调类型1委托回调类型2返回类型。形参的三个参数分别是sql语句map委托对象参数。所以整句的意思是先根据sql语句查询;同时把查询的Area信息赋值给bookWithArea.Pers,并且返回bookWithArea;book是对象参数,提供参数绑定的值。
最终整个方法返回BookWithArea,这样我们所需要的所有信息就有了。

  这里只是简单介绍下同步增删改查的API的书写,异步的API,可以自行去了解。

参考地址:https://www.cnblogs.com/flywong/p/9666963.html

DotNet Core中使用dapper的更多相关文章

  1. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...

  2. NET Core中使用Dapper操作Oracle存储过程

    .NET Core中使用Dapper操作Oracle存储过程最佳实践   为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为Or ...

  3. Dotnet Core中使用AutoMapper

    官网:http://automapper.org/ 文档:https://automapper.readthedocs.io/en/latest/index.html GitHub:https://g ...

  4. 依赖注入在 dotnet core 中实现与使用:1 基本概念

    关于 Microsoft Extension: DependencyInjection 的介绍已经很多,但是多数偏重于实现原理和一些特定的实现场景.作为 dotnet core 的核心基石,这里准备全 ...

  5. DotNet Core中使用RabbitMQ

    上一篇随笔记录到RabbitMQ的安装,安装完成,我们就开始使用吧. RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协 ...

  6. 依赖注入在 dotnet core 中实现与使用:4. 集成 Autofac

    本示例使用 .net core 5 rc-1 实现. 1. 添加 Nuget 包引用 使用 Autofac 当然要添加 Autofac 的 Nuget 包,主要涉及到两个: Autofac.Exten ...

  7. 依赖注入在 dotnet core 中实现与使用:2 使用 Extensions DependencyInjection

    既然是依赖注入容器,必然会涉及到服务的注册,获取服务实例,管理作用域,服务注入这四个方面. 服务注册涉及如何将我们的定义的服务注册到容器中.这通常是实际开发中使用容器的第一步,而容器本身通常是由框架来 ...

  8. 学学dotnet core中的身份验证和授权-1-概念

    前言 身份验证: Authentication 授权: Authorization net core 中的身份验证和授权这两个部分,是相辅相成的.当初我在学在部分的时候,是看的 net core 官网 ...

  9. .Net Core中使用Dapper构建泛型仓储

    前言:Dapper是.NET的简单对象映射器,在速度方面拥有ORM之王的称号,与使用原始ADO.NET读取数据一样快.ORM是对象关系映射器,它负责数据库和编程语言之间的映射. 仓储主要是用来解耦业务 ...

随机推荐

  1. 谈一谈个人利用Java的mysql的知识完成的数据库的项目-----用户信息管理系统

    首先,我先简述一下自己做的过程啊,相信大家来找这样的博客,也都是为了完成自己课程任务吧.我也一样是一名大一的学生,是为了自己的课程任务而开始做数据库的项目的.因为还没学mysql吗,所以是自己找视频啊 ...

  2. HTML+CSS的小实例

    通过一个月以来对HTML5+CSS的学习.这篇随笔给大家来做一个简单的网页中常见的导航栏. 这些都称之为网页中的导航栏. 我简单的做了一个某宝和58同城的导航栏,供大家学习参考. 一.58同城导航栏: ...

  3. Python中的Tcp协议应用之TCP服务端-协程版(推荐)

    利用gevent第三方库,实现协程. 通过协程实现一个服务端服务多个客户端需求. 使用协程的好处是协程比线程更加节省内存资源. gevent安装命令: pip3 install gevent 注意:在 ...

  4. Apache + WordPress 从 0 搭建

    引言 又到周末了,周末小编一般不更新系列文章,原因嘛是因为要攒稿子,年底工作比较忙,不攒点稿子是要断更的:( 所以周末一般聊点简单轻松加愉快的东西,小编现在的博客站是由 HEXO 进行搭建的,最近随着 ...

  5. Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity

    题目链接:http://codeforces.com/contest/1272/problem/E 题意:给定n,给定n个数a[i],对每个数输出d[i]. 对于每个i,可以移动到i+a[i]和i-a ...

  6. HDU1944 S-NIM(多个NIM博弈)

    Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as ...

  7. Linux-(2)Linux安装

    二.Linux 安装 2.1 物理机安装 使用相关镜像制作软件(软碟通等)制作U盘启动盘即可,按照正常的安装步骤安装即可,一般来说(迷你版本)有线网卡直接会有驱动,无线网卡的驱动需要自行编译或者查找. ...

  8. hikari连接池属性详解

    hikari连接池属性详解 一.主要配置 1.dataSourceClassName 这是DataSourceJDBC驱动程序提供的类的名称.请查阅您的特定JDBC驱动程序的文档以获取此类名称,或参阅 ...

  9. angular6路由参数的传递与获取

    1.访问路由链接:/test/id 路由配置: {path: 'test/:id', component: TestComponent} html传参: <a href="javasc ...

  10. HPS端如何通过AXI Bridge控制FPGA端口的GPIO

    该笔记主要记录HPS端如何通过AXI Bridge控制FPGA端口的GPIO,主要是如何操作FPGA侧的Led 1.AXI Bridge         AXIB主要包括H2FB.F2HB.LWH2F ...