ORM系列之三:Dapper
目录
1.Dapper 简介
2.Dapper 安装
3.Dapper 使用
Dapper简介
Dapper是一个轻量级的ORM框架,短小精悍,正如其名。对于小项目,使用EF,NHibernate这样的重量级ORM框架,有点杀鸡用牛刀的感觉,此时Dapper会是个很不错的选择。
Dapper优势
- 轻量,Dapper.dll大小不到105KB。
- 快,读取数据接近IDataReader。
- 支持大部分主流的数据库,如:MS SQL,Oracle,MySQL,Sqlite等等。
- 支持映射一对一,一对多,多对多关系。
Dapper原理
Dapper实际上是扩展了IDbConnection,提供了一些的查询和执行方法,对ADO.NET的访问对象进行了最底层的封装,所以性能接近ADO.NET。
Dapper安装
通过NuGet包管理器,直接搜索Dapper,选择搜索结果中的第一个,点击安装到项目中即可。

Dapper 使用
Dapper查询结果支持强类型,同时也支持动态类型,在实际开发中我们建议使用强类型,方便以后维护。
实体类
示例中需要用到两个实体类型,分别为Post.cs和User.cs。
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public User User { get; set; }
} public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
创建表脚本:
CREATE TABLE [dbo].[Post](
[Id] [int] IDENTITY(,) NOT NULL,
[Title] [nvarchar]() NULL,
[Content] [nvarchar]() NULL,
[UserId] [int] NULL,
CONSTRAINT [PK_Post] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] CREATE TABLE [dbo].[User](
[Id] [int] IDENTITY(,) NOT NULL,
[Name] [nvarchar]() NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
辅助类
由于Dapper是IDbConnection.cs进行了扩展,所以我们自己要管理数据库连接,本示例我封装了一个简单的DBHelper.cs用于管理数据库连接的打开和关闭。
public class DBHelper
{
private static string strConn = "Data Source=2012-20130731KI;Initial Catalog=QYHDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False"; /// <summary>
/// 打开链接
/// </summary>
public static SqlConnection OpenConnection()
{
SqlConnection conn = new SqlConnection(strConn);
conn.Open(); return conn;
} public static void CloseConnection()
{
SqlConnection conn = new SqlConnection(strConn);
if (conn.State != System.Data.ConnectionState.Closed)
{
conn.Close();
}
} }
方法测试
/// <summary>
/// Dapper示例
/// </summary>
class Program
{
static void Main(string[] args)
{
SqlConnection conn = DBHelper.OpenConnection(); //示例1:简单查询,返回强类型列表
Console.WriteLine("示例1:简单查询,返回强类型列表:");
var result1 = conn.Query<Post>("select Id,Title,Content from Post");
foreach (var item in result1)
{
Console.WriteLine(item.Id + " " + item.Title + " " + item.Content);
} //示例2:简单查询,返回动态列表
Console.WriteLine("示例2:简单查询,返回动态列表");
var result2 = conn.Query("select Id,Title,Content from Post");
foreach (var item in result1)
{
Console.WriteLine(item.Id + " " + item.Title + " " + item.Content);
} //示例3:带参数的查询
Console.WriteLine("示例3:带参数的查询");
var result3 = conn.Query<Post>("select Id,Title,Content from Post where UserId=@UserId", new { UserId = });
foreach (var item in result3)
{
Console.WriteLine(item.Id + " " + item.Title + " " + item.Content);
} //示例4:执行没有返回结果的命名
//Test04(conn); //示例5:执行多次脚本
//Console.WriteLine("示例5:执行多次脚本");
//conn.Execute("insert into [User](Name) values(@Name)", new[] { new { Name = "wangwu" }, new { Name = "zhouliu" }, new { Name = "chenqi" } }); ////示例6:返回多个结果
Console.WriteLine("示例6:返回多个结果");
string sql = @"select * from Post where Id=@Id
select * from [User] where Id=@Id"; using (var multi = conn.QueryMultiple(sql, new { Id = }))
{
Post post = multi.Read<Post>().Single();
User user = multi.Read<User>().Single();
} //示例7:执行存储过程
Console.WriteLine("示例7:执行存储过程");
var result7 = conn.Query<Post>("sp_GetPost", new { Id = }, commandType: CommandType.StoredProcedure);
foreach (var item in result7)
{
Console.WriteLine(item.Id + " " + item.Title + " " + item.Content);
} // 示例8:一对多映射,返回的一行数据映射到数据库多张表
Console.WriteLine("示例8:一对多映射");
string sqlOneToMulti = "select * from Post p inner join [User] u on p.UserId=u.Id"; //Query<TFirst, TSecond, TReturn>
var data = conn.Query<Post, User, Post>(sqlOneToMulti, (post, user) => { post.User = user; return post; }); DBHelper.CloseConnection(); Console.Read();
}
}
ORM系列之三:Dapper的更多相关文章
- Net系列框架-Dapper+简单三层架构
Net系列框架-Dapper+简单三层架构 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题,欢迎联系我 ...
- Net系列框架-Dapper+AutoFac 基于接口
Net系列框架-Dapper+AutoFac 基于接口 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题 ...
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- DataSnap 2009 系列之三 (生命周期篇)
DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...
- Sql Server来龙去脉系列之三 查询过程跟踪
我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更 ...
- .net orm比较之dapper和Entity Framework6的简单测试比较
.net orm比较之dapper和Entity Framework6的简单测试比较
- 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
手把手叫你玩转网络编程系列之三 完毕port(Completion Port)具体解释 ...
- Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程
原文:Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列之三 SQL S ...
随机推荐
- android 图片缓存
一.Picasso https://github.com/square/picasso Picasso是Square公司开源的一个Android平台上的图片加载框架,简单易用,一句话搞定项目中的图片加 ...
- 利用Photos 框架搭建美图秀秀相册选择器
简介:Photos框架是iOS8.0后推出的一个新的用于对系统相册进行相关操作的,在iOS8.0之前,开发中只能使用AssetsLibrary框架来访问移动设备的图片库.本文中不再对AssetsLib ...
- Mybatis #和$的区别
1.#将传入的数据当成一个字符串,会自动加上双引号.如 oder by #{id} ,那么解析后为oder by “id” 2.$对传入的数据不进行操作,直接显示原值.如oder by ${i ...
- C#反射机制 Type类型
using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System ...
- 圣诞老人去哪?Power BI告诉你
随着圣诞节的来临,微软的Power BI团队使用Power BI来回答大家一直以来所关心的问题:圣诞老人去哪? 要回答这个问题,来自社交网络的数据是最合适不过的了.于是Power BI团队用以下关键字 ...
- Redis到底该如何利用?
Redis是个好东西,经过上两个星期的研究和实践,目前正在项目里大规模的替换掉原来的本地内存cache.但是替换过程中却发现,Redis这东西高端,大气上档次,似乎不是我想象里的使用方法. 在没有深入 ...
- [Unity3D]Unity+Android交互教程——让手机"动"起来
想要用Unity实现一个二维码扫描的功能,然后网上找插件,找到一个貌似叫EasyCodeScanner,但下载下来用用,真不好使,一导入运行就报错,调好错了再运行发现点按钮没反应,反复试了几遍发现还是 ...
- CompletionService/ExecutorCompletionService/线程池/concurrent包
线程池 线程池的基本思想:线程频繁的创建.销毁会极大地占用系统资源,为了减少系统在创建销毁线程时的开销,线程池应运而生.线程池包括多个已创建的线程,当有任务要在新线程中执行时,将任务提交给线程池,线程 ...
- 转--脉络清晰的BP神经网络讲解,赞
http://www.cnblogs.com/wengzilin/archive/2013/04/24/3041019.html 学 习是神经网络一种最重要也最令人注目的特点.在神经网络的发展进程中, ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...