【ORM】关于Dapper的一些常见用法
引言
Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper.
相关资料
Dapper的GitHub地址是dapper-dot-net,上面有一些用法和性能的介绍,有兴趣者可以上去看看.
数据库设计和实体类
简单设计两个表,分别为部门表,雇员表.
CREATE TABLE [dbo].[T_Dept] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Dept] NCHAR (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DeptNo] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
); CREATE TABLE [dbo].[T_Employee] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[DeptNo] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[EmployeeName] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
实体类如下
class Depts
{
public int Id { get; set; }
public string Dept { get; set; }
public string DeptNo { get; set; } public List<Employees> EmployeeList { get; set; }
} class Employees
{
public int Id { get; set; }
public string DeptNo { get; set; }
public string EmployeeName { get; set; }
}
连接静态类
public static class SqlServerConnect
{
public static SqlConnection SqlConnection()
{
string sqlconnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
var connection = new SqlConnection(sqlconnectionString);
connection.Open();
return connection;
} }
Insert
Insert有几种写法,分别直接绑定参数,数组,或者集合,Execute的返回值是指受影响的行数.
using (SqlConnection con = SqlServerConnect.SqlConnection())
{
//直接绑定参数
con.Execute("insert into T_Dept(Dept,DeptNo) values (@dept,@deptno) ", new { Dept = "销售部", Deptno = "" });
//匿名数组
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
new[] { new { EmployeeName = "李四", DeptNo = "" }, new { EmployeeName = "张三", DeptNo = "" } });
//集合
List<Employees> employees = new List<Employees>();
employees.Add(new Employees { DeptNo = "", EmployeeName = "老王" });
employees.Add(new Employees { DeptNo = "", EmployeeName = "老李" });
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@employeeName,@deptNo) ", employees);
}
Update和Delete
Update和Delete没什么好说的了,用法一样,举例匿名数组的用法
using (SqlConnection con = SqlServerConnect.SqlConnection())
{
con.Execute("update T_Dept set Dept=@name where DeptNo=@deptno ",new[] { new { name = "人事部二", deptno = "" },new { name = "销售部二", deptno = "" } }); con.Execute("delete from T_Employee where EmployeeName=@name ", new[] { new { name = "小王" }, new { name = "张三" } });
}
Select
Select操作主要是利用Query方法,也可以利用ExecuteScalar做一些获取数据库时间之类的操作,如下
using (SqlConnection con = SqlServerConnect.SqlConnection())
{
IEnumerable<Depts> deptList = con.Query<Depts>("select id, Dept,DeptNo from T_Dept"); DateTime dateTime= con.ExecuteScalar<DateTime>("select getdate()"); Console.WriteLine(dateTime);
}
存储过程
主要演示一下输入输出参数的过程和返回多游标的过程.
过程如下
CREATE PROCEDURE [dbo].P_Emploee_Ins
@In_DeptNo NVARCHAR(20) ,
@In_EmployeeName NVARCHAR(20),
@Out_Message NVARCHAR(20) output
AS insert into T_Employee( DeptNo, EmployeeName) values (@In_DeptNo,@In_EmployeeName);
set @Out_Message='完成'; CREATE PROCEDURE [dbo].P_DeptEmploee_Sel
@In_DeptNo NVARCHAR(20) , @Out_Message NVARCHAR(20) output
AS
SELECT * from T_Dept t where t.DeptNo=@In_DeptNo;
SELECT * from T_Employee t where t.DeptNo=@In_DeptNo;
调用如下
using (SqlConnection con = SqlServerConnect.SqlConnection())
{
DynamicParameters p = new DynamicParameters();
p.Add("@In_DeptNo", "");
p.Add("@In_EmployeeName", "小李");
p.Add("@Out_Message", "", DbType.AnsiString, ParameterDirection.Output);
con.Execute("dbo.P_Emploee_Ins", p, commandType: CommandType.StoredProcedure);
string message = p.Get<string>("@Out_Message");
}
using (SqlConnection con = SqlServerConnect.SqlConnection())
{
DynamicParameters p2 = new DynamicParameters();
p2.Add("@In_DeptNo", "");
p2.Add("@Out_Message", "", DbType.AnsiString, ParameterDirection.Output); SqlMapper.GridReader gridReader = con.QueryMultiple("dbo.P_DeptEmploee_Sel", p2, commandType: CommandType.StoredProcedure); IEnumerable<Depts> dept = gridReader.Read<Depts>();
IEnumerable<Employees> employee = gridReader.Read<Employees>(); string message2 = p.Get<string>("@Out_Message");
}
事务操作
using (SqlConnection con = SqlServerConnect.SqlConnection())
{
IDbTransaction transaction = con.BeginTransaction();
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
new { EmployeeName = "老王", DeptNo = "" }, transaction: transaction);
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
new { EmployeeName = "老李", DeptNo = "" }, transaction: transaction);
transaction.Commit();
}
小结
本文介绍了Dapper的一些常见用法,而.Net4.5版的还有上述方法的异步实现的,这里就不一一示范了.话说以前都是连Oracle数据的,换成Sql Server用法几乎没有变化,感觉真好.如果你有更好的建议,请不吝留言指教.
【ORM】关于Dapper的一些常见用法的更多相关文章
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- .NET轻量级ORM组件Dapper修炼手册
一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需 ...
- Linux中find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- [转]EasyUI——常见用法总结
原文链接: EasyUI——常见用法总结 1. 使用 data-options 来初始化属性. data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我 ...
随机推荐
- springboot 项目跨域问题 CORS
package com.example.demo.cors; import org.springframework.context.annotation.Bean; import org.spring ...
- Python基础-set集合
1.集合的创建 s = set('fansik and fanjinbao') print(s) 打印结果(去掉了重复的字符):{'k', 'd', 'f', 'n', ' ', 'j', 'i', ...
- Django序列化
一.Django序列化 1.序列化应用场景 1.关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,由于httpresponse只能返回字符串或者是字节,而从数据库 ...
- Python函数之—— 装饰器(Day13)
一.什么是装饰器 顾名思义,装饰器指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数 ...
- 极速Node.js:来自LinkedIn的10个性能提升秘籍
from:http://faylai.iteye.com/blog/1293194 1.避免使用同步的方法 nodejs 是基于单线程.为了让单线程能够处理高并发的请求,我们尽量要避免让线程等待,阻塞 ...
- qt的udp的初步使用(转)
该程序实现的功能是:局域网内,每个用户登录到聊天软件,则软件界面的右端可以显示在线用户列表,分别显示的是用户名,主机名,ip地址.软件左边那大块是聊天内容显示界面,这里局域网相当于qq中的qq群,即群 ...
- Python字符串格式转换
转换类型 转换类型 说明 d, i 带符号十进制 b 无符号二进制 o 无符号八进制 u 无符号十进制 x 无符号十六进制(小写) X 无符号十六进制(大写) e 科学计数法表示的浮点数(小写) E ...
- Kubernetes StatefulSets
StatefulSets对于需要以下一项或多项的应用程序非常有用. 稳定,唯一的网络标识符. 稳定,持久的存储. 有序,优雅的部署和缩放. 有序,优雅的删除和终止. 有序的自动滚动更新. POD Id ...
- 通过代码或者配置文件 对log4net进行配置
1.通过代码进行配置 1.1代码 http://stackoverflow.com/questions/16336917/can-you-configure-log4net-in-code-inste ...
- 基于“基于dockerhub的jetty镜像的ossfs镜像”部署war包,遇到的文件夹读写权限被限制的问题解决方案
前提: “基于dockerhub的jetty镜像的ossfs镜像” 已经搭建好了. 部署准备: 1.本地打包:war包-->idea工具 mvn 打包. 2.本地sh脚本:compile_vps ...