轻量级ORM框架 【Dapper】 的使用

ORM是什么?

从字面理解,O是Object,对象;R是Relation,关系;M是Mapping,映射。所以,用一句话概括就是:ORM是一种对象关系映射的技术

 

Dapper 是.NET下的一种ORM框架。

Dapper的安装

使用NuGet安装
打开visual studio的项目,依次点击工具NuGet包管理器管理解决方案的NuGet程序包;再点击浏览搜索dapper点击搜索结果中的Dapper勾选项目选择安装;

解决方案管理器中点击项目查看引用,如果有Dapper,说明安装成功。

 

Dapper的基本用法

首先,我们在Model层写一个Person类,他有ID,Name,Remark。

同样我们在数据库也有一个Person表,包含id,name,remark三个字段,其中id是主键自增。

而后我们在DAL层写一个PersonDB类,提供对Person的基本访问。connectionString是数据库连接字符串,由配置文件读取。

插入操作

将一个对象person插入数据库。插入代码文本如下。@Name的意思是自动将person里的Name值绑定上去。

public static int Insert(Person person)
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", person);
    }
}

批量插入:

/// <summary>
/// 批量插入Person数据,返回影响行数
/// </summary>
/// <param name="persons"></param>
/// <returns>影响行数</returns>
public static int Insert(List<Person> persons)
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", persons);}
}

删除操作:

public static int Delete(Person person)
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Execute("delete from Person where id=@ID", person);}
}public static int Delete(List<Person> persons)
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Execute("delete from Person where id=@ID", persons);}
}

修改操作:

public static int Update(Person person)
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Execute("update Person set name=@name where id=@ID", person);}
}public static int Update(List<Person> persons)
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Execute("update Person set name=@name where id=@ID", persons);}
}

查询操作:

/// <summary>
/// 无参查询所有数据
/// </summary>
/// <returns></returns>
public static List<Person> Query()
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Query<Person>("select * from Person").ToList();}
}/// <summary>
/// 查询指定数据
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
public static Person Query(Person person)
{using (IDbConnection connection = new SqlConnection(connectionString)){return connection.Query<Person>("select * from Person where id=@ID", person).SingleOrDefault();}
}

 

Dapper的复杂操作

查询的In操作:

/// <summary>
/// In操作
/// </summary>
public static List<Person> QueryIn()
{using (IDbConnection connection = new SqlConnection(connectionString)){var sql = "select * from Person where id in @ids";//参数类型是Array的时候,dappper会自动将其转化return connection.Query<Person>(sql, new { ids = new int[2] { 1, 2 }, }).ToList();}
}public static List<Person> QueryIn(int[] ids)
{using (IDbConnection connection = new SqlConnection(connectionString)){var sql = "select * from Person where id in @ids";//参数类型是Array的时候,dappper会自动将其转化return connection.Query<Person>(sql, new { ids }).ToList();}
}

多语句操作

为此我们引入以下Book类,同样在数据库里设置这个表。

public class Book
{public int ID { get; set; }public int PersonID { get; set; }public string BookName { get; set; }
}
/// <summary>
/// 多语句操作
/// </summary>
public static void QueryMultiple()
{using (IDbConnection connection = new SqlConnection(connectionString)){var sql = "select * from Person; select * from Book";var multiReader = connection.QueryMultiple(sql);var personList = multiReader.Read<Person>();var bookList = multiReader.Read<Book>();multiReader.Dispose();}
}

Join操作

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

public class BookWithPerson
{public int ID { get; set; }public Person Pers { get; set; }public string BookName { get; set; }
}
我们自然想要一个方法把数据库里复杂的外键关系转成我们需要的对象BookWithPerson,所有我们需要的信息都存在里面,取数据的时候只要找这个对象取数据就行了,比如我们需要一本书的主人的姓名,我们只需要bookWithPerson.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.remarkfrom Person as pjoin Book as bon p.id = b.personIdwhere 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语句查询;同时把查询的person信息赋值给bookWithPerson.Pers,并且返回bookWithPerson;book是对象参数,提供参数绑定的值。
最终整个方法返回BookWithPerson,这样我们所需要的所有信息就有了。




 *****************************
 *** Keep learning and growing. ***
 *****************************

转载于:https://www.cnblogs.com/gangle/p/9287082.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统提示一个程序正在被另一个程序调用,如何知道是被哪个程序调用

今天在处理一个病毒时&#xff0c;发现病毒文件无法复制。于是利用processxp找到了病毒文件是被哪个文件调用&#xff0c;然后用md关闭了调用句柄后成功复制文件。具体情况如下&#xff1a; 为了找到是哪个程序调用了befsvc.exe&#xff0c;打开processexplorer.exe&#xff0c…

通过修改explorer.exe内存隐藏文件及注册表项

记录今天分析的一个隐藏自身及注册表项的病毒。 1.概述&#xff1a; &#xff08;1&#xff09;此病毒文件为路径为&#xff1a;C:\Windows7\4D525EC1C14.exe&#xff0c;且注册了自启动项&#xff1a; HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run […

WPF xaml中列表依赖属性的定义

WPF xaml中列表依赖属性的定义 原文:WPF xaml中列表依赖属性的定义列表内容属性 如上图&#xff0c;是一个列表标题排序控件&#xff0c;我们需要定义一个标题列表&#xff0c;从而让调用方可以自由的设置标题信息。 在自定义控件时&#xff0c;会遇到列表依赖属性&#xff0c;…

由于权限问题无法删除注册表键值的解决方法

在中了某个病毒之后手动删除病毒自启动项失败&#xff0c;如下图&#xff1a; 查看run项的权限&#xff0c;发现用户被修改成了Everyone&#xff0c;并且没有任何权限&#xff0c;如下图&#xff1a; 手动赋予Everyone用户完全控制权限后删除注册表项成功&#xff0c;如下图&am…

c++利用windows api遍历指定文件夹及其子文件夹中的文件

以下代码在vs2008中测试通过&#xff0c;利用FindFirstFile,FindNextFile函数遍历了我电脑上全路径为“C:\\Users\\v_tianboli\\Desktop\\windows程式设计开发指南”的文件夹&#xff0c;并输出文件夹及子文件夹中的所有文件完整路径到控制台。完整代码如下&#xff1a; #inclu…

某释放驱动的样本分析及手杀报告

此为样本文件下载链接&#xff1a;http://download.csdn.net/detail/cs08211317dn/3982364&#xff0c;压缩包解压缩密码为&#xff1a;virus。 今天花了1个多小时分析了一款名为123.exe的病毒&#xff0c;觉得挺有意思的&#xff0c;于是顺手写个手杀报告&#xff0c;以备以后…

CentOS 7.2 安装zabbix 3.4

一、zabbix版本选择及部署环境说明 1、zabbix版本选择 zabbix官网地址&#xff1a;www.zabbix.com zabbix每半年发布一个长期支持版&#xff0c;目前长期支持版有2.0、3.0等&#xff0c;所以选择zabbix版本建议选择长期支持版&#xff0c;除非有特殊需求。 2、部署环境环境说明…

吴恩达机器学习笔记(二) —— Logistic回归

主要内容&#xff1a; 一.回归与分类 二.Logistic模型即sigmoid function 三.decision boundary 决策边界 四.cost function 代价函数 五.梯度下降 六.自带求解函数 七.多分类问题 一.回归与分类 回归&#xff1a;用于预测&#xff0c;输出值是连续型的。例如根据房子的大小预测…

弹出选择文件夹的对话框 BROWSEINFO 的用法【MFC】

以下是在vs2008中编译通过的代码&#xff0c;代码注释详细。要实现的功能是点击“浏览”按钮&#xff0c;即弹出选择文件夹的对话框。并将选择的文件夹或文件路径显示在MessageBox中。 void CMFC_TrojanKillerDlg::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码…

regini.exe使用方法

创建一个名称test 类型reg_dword 数据1 如果是只有那会默认以类型reg_sz创建 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ys test reg_dword 1 2。注册表键数值 [更改的权限] 例如: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run…

计算机寄存器及标志位详解

以下是计算机内部寄存器阵列图&#xff1a; 以下FR控制标志位及其含义&#xff1a; 1. CF 进位标识位 进行加减运算时, 如果最高二进制位产生进位或错位, CF则为1, 否则为0. 程序设计中, 常用条件转移指令JC, JNC指令据此标志位实现转移 2. PF 奇偶标志位 操作结果…

NOIP 2010 引水入城

P1514 引水入城 题目描述 在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政区划十分特殊&#xff0c;刚好构成一个 NN 行 \times MM 列的矩形&#xff0c;如上图所示&#xff0c;其中每个格子都代表一座城市&#xff0c;每座…

前段mui框架初识

由于需要了解了一下mui框架&#xff0c;感觉没有想象的那么好 mui引入过后就要生成他自己的滚动条 而且 不能获取页面的高度 非屏幕的高度 mui上拉加载是会有卡顿现象的 &#xff0c; 这段代码执行完之后会有比较严重的手机段拖动卡顿现象 解决办法 给他设置滚动系数&#…

关于(int argc char **argv)

演示使用opencv显示一幅图片&#xff1a; #include <iostream> #include <core/core.hpp> #include <highgui/highgui.hpp> using namespace std; using namespace cv; void main(int argc,char **argv) {Mat imageimread(argv[1]);imshow("Lena",…

Pytorch中的Batch Normalization操作

之前一直和小伙伴探讨batch normalization层的实现机理&#xff0c;作用在这里不谈&#xff0c;知乎上有一篇paper在讲这个&#xff0c;链接 这里只探究其具体运算过程&#xff0c;我们假设在网络中间经过某些卷积操作之后的输出的feature map的尺寸为4322 4为batch的大小&…

regsvr32.exe

regsvr32.exe用于注册Windows操作系统的动态链接库和ActiveX控件。 regsvr32.exe 文件建议修改权限&#xff0c;删除所有的用户只保存Administrators 和SYSTEM为所有权限 regsvr32.exe是32位系统下使用的DLL注册和反注册工具&#xff0c;使用它必须通过命令行的方式使用&#x…

一个注册为输入法的木马分析

我已把此木马样本传到以下链接&#xff1a;http://download.csdn.net/detail/cs08211317dn/4096819 一&#xff0e;大致描述&#xff1a; 1. 样本名称&#xff1a;z.exe 2. 家族名&#xff1a; PWS:Win32/Zuten.gen!D(MIcrosoft) 3. MD5&#xff1a;E298C3…

使用fiddler的过滤条件

使用fiddler抓包的时候经常一下子显示很多的记录&#xff0c;看的眼花缭乱&#xff0c;需要这时候需要使用过滤条件来帮助你&#xff0c;一般常用的有三种过滤条件&#xff1a; 1.域名过滤&#xff0c;只显示特定域名的记录&#xff1a; *.baidu.com表示所有的百度二级域名会话…

IceSword偏门功能介绍

&#xff08;1&#xff09;进程窗口中单击右键&#xff0c;选择“内存读写”&#xff0c;弹出如下对话框&#xff1a; 输入起始地址和长度就可以读写内存&#xff0c;以及对这段内存进行反汇编。 &#xff08;2&#xff09;用IceSword的监视进线程创建和监视进程终止功能&…

【Apache】Apache ab压力测试工具Window下载和用法详解

ab是apache自带的网站压力测试工具。 使用起来非常的简单和方便。 不仅仅是可以apache服务器进行网站访问压力测试&#xff0c;还可以对其他类型的服务器进行压力测试。 比如nginx,tomcat&#xff0c;IIS等 首先当然是下载安装了。 在这里只讲window下在下载安装 官方下载地址&…