一、Dapper基本操作
参考资料:Cooper Liu 毒逆天
一、Dapper安装
添加引用-->NuGet管理-->搜索Dapper-->安装
二、新建表
--创建一个员工表
create table Employee
(
Em_Id int identity(1,1) primary key,
Em_Name varchar(50) not null,
Em_Age int default(18) not null
) --部门表
Create Table Department
(
Depart_Id int identity(1,1) primary key,
Depart_Name varchar(20) not null,
) --员工所属部门关系表
Create table EmployeePartment
(
EP_Id int identity(1,1) primary key,
Em_Id int not null,
Depart_Id int not null
)
三、新建实体类
实体类属性要与数据库中的字段名称对应
/// <summary>
/// 生成Employee实体,注意类属性与表字段要一一对应
/// </summary>
public class Employee
{
public int Em_Id { get; set; }
public string Em_Name { get; set; } public int Em_Age { get; set; }
}
/// <summary>
/// 生成部门Department实体
/// </summary>
public class Department
{
public int Depart_Id { get; set; }
public string Depart_Name { get; set; }
} /// <summary>
/// 生成部门员工所属部门对应关系
/// </summary>
public class EmployeePartment
{
public int EP_Id { get; set; }
public int Em_Id { get; set; }
public int Depart_Id { get; set; }
}
四、插入操作
Dapper支持单个插入,也支持批量插入(Bulk),支持存储过程进行插入操作。
/// <summary>
/// 声明object类型可用单个对象时插入单对象,也可批量BulkInsert插入(只要实现IEnumable接口)
/// </summary>
/// <param name="obj"></param>
private static void InsertEmployee(Object obj)
{
using (var conn = GetConnection())
{
string sql = "insert into employee values (@Em_Name,@Em_Age)";
int result = conn.Execute(sql, obj);
}
} /// <summary>
/// 插入部门操作
/// </summary>
/// <param name="depart"></param>
private static void InsertDepartment(object depart)
{
CommandDefinition command = new CommandDefinition("insert into department values (@Depart_Name)", depart);
using (var conn=GetConnection())
{
conn.Execute(command);
} } /// <summary>
/// 生成sqlConnection对象。返回IDbConnection.
/// </summary>
/// <returns></returns>
private static IDbConnection GetConnection()
{
var conn = new SqlConnection(connstr);
return conn;
}
示例中使用了conn.Execute()方法,该方法两个种形式的重载。
1、public static int Execute(this IDbConnection cnn, CommandDefinition command);
2、public static int Execute(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);
虽说是两种形式,其实质是CommandDefinition对重载的第二个方法条件进行了封闭。由CommandDefinition构造函数定义可以看到对应关系。
public CommandDefinition(string commandText, object parameters = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CommandFlags flags = CommandFlags.Buffered);
Execute是IDbConnection的扩展方法,所以conn可以直接调用。
五、删除操作
Dapper支持sql语句删除操作,也支持存储过程删除操作
//此处为方法调用
//Ado.net方法删除
DeleteEmployeeById(); UseCommandDeleteEmployeeUseById(); //存储过程删除
ProcDeleteEmployeeById(); //此处为方法实现
/// <summary>
/// 根据ID删除对应Employee
/// </summary>
/// <param name="id">待删除的EmployeeId</param>
private static void DeleteEmployeeById(int id)
{
using (var conn=GetConnection())
{
int result= conn.Execute("delete from Employee where EM_Id=@id", new { @id = id });
}
} /// <summary>
/// 使用Command形式删除操作
/// </summary>
/// <param name="id">待删除的Employee的ID</param>
private static void UseCommandDeleteEmployeeUseById(int id)
{
var command = new CommandDefinition("delete from Employee where Em_Id=@Eid", new { @Eid = id }, null, null, CommandType.Text,CommandFlags.None); using (var conn=GetConnection())
{
int result = conn.Execute(command);
}
}
/// <summary>
/// 使用存储过程形式删除Employee
/// </summary>
/// <param name="id">待删除的Employee</param>
private static void ProcDeleteEmployeeById(int id)
{
using (var conn = GetConnection())
{
int result= conn.Execute("pr_delete_employee", new { @id = id },null,null,CommandType.StoredProcedure);
}
}
删除示例中也是使用conn.Execute()方法进行操作。
六、更新操作
操作同新增、删除同样使用conn.Execute()方法进行。
//方法调用
UpdateEmployeeName(, "新名称"); UseCommandUpdateEmployee(, ); ProcUpdateEmployeeName(, "旧名称");
//方法实现 /// <summary>
/// 更新指定ID名称为新值
/// </summary>
/// <param name="eid">Employee的Id</param>
/// <param name="name">新的employee名称</param>
private static void UpdateEmployeeName(int eid, string name)
{
using (var conn=GetConnection())
{
int result= conn.Execute("update Employee set Em_Name=@name where Em_Id=@id", new { @name = name, @id = eid });
}
} /// <summary>
/// 使用Command形式更新Employee信息
/// </summary>
/// <param name="eid">待更新的EmployeeId</param>
/// <param name="Age">Age新值</param>
private static void UseCommandUpdateEmployee(int eid, int Age)
{
var command=new CommandDefinition("update Employee set Em_Age=@age where em_Id=@eid",new{@age=Age,@eid=eid},null,null,CommandType.Text,CommandFlags.None);
using (var conn=GetConnection())
{
int result = conn.Execute(command);
}
} /// <summary>
/// 更新指定ID名称为新值
/// </summary>
/// <param name="eid">Employee的Id</param>
/// <param name="name">新的employee名称</param>
private static void ProcUpdateEmployeeName(int eid, string name)
{
using (var conn = GetConnection())
{
var p = new DynamicParameters();
p.Add("@id", eid);
p.Add("@name", name);
int result = conn.Execute("pr_update_employee", new { id = eid,name = name },null,null,CommandType.StoredProcedure));
}
}
七、查找操作
//简单查询
Employee employee = GetEmployeeById();
if (employee != null)
{
Console.WriteLine("ID为5的员工已找到名称:" + employee.Em_Name);
} //子查询
List<Employee> list_employees = GetEmployeesByPartId();
Console.WriteLine("共找到{0}记录:", list_employees.Count);
for (int i = ; i < list_employees.Count; i++)
{
Console.Write(list_employees[i].Em_Name + ",");
} //多返回值
GetMutile();
/// <summary>
/// 根据ID查找EmpolyeeID 支持ADO语句和存储过程
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private static Employee GetEmployeeById(int id)
{
Employee employee = new Employee();
using (var conn = GetConnection())
{
employee = conn.Query<Employee>("select * from employee where Em_Id=@id", new { id = id }).FirstOrDefault(); } //CommandDefinition command = new CommandDefinition("select * from employee wehre em_id=@id"); //using (var conn = GetConnection())
//{
// employee = conn.Query<Employee>(command).FirstOrDefault(); //} return employee;
} /// <summary>
/// 子查询
/// </summary>
/// <param name="partid"></param>
/// <returns></returns>
private static List<Employee> GetEmployeesByPartId(int partid)
{
List<Employee> employees = new List<Employee>(); CommandDefinition command = new CommandDefinition("select * from employee where em_id in (select em_id from EmployeePARTMENT where Depart_Id=@id) ", new { id = partid }); using (var conn = GetConnection())
{
employees = conn.Query<Employee>(command).ToList();
}
return employees;
} /// <summary>
/// 多返回值查询
/// </summary>
private static void GetMutile()
{
string sql = @"select * from [Employee];
select * from [Department]";
CommandDefinition command = new CommandDefinition(sql); using (var conn = GetConnection())
{
var muitle = conn.QueryMultiple(sql);
//var muitle=conn.QueryMultiple(command);
if (!muitle.IsConsumed)
{
//强类型读取
//var employees = muitle.Read<Employee>();
//var deparements = muitle.Read<Department>(); //动态类型读取
var employees = muitle.Read();
var deparements = muitle.Read(); foreach (var item in employees)
{
Console.WriteLine(item.Em_Name + ":" + item.Em_Age.ToString());
} Console.WriteLine(); foreach (var item in deparements)
{
Console.WriteLine(item.Depart_Name + ":" + item.Depart_Id);
} }
}
}
八、总结
使用Dapper进行增删改查、存储过程调用、多表值返回操作。
一、Dapper基本操作的更多相关文章
- dapper基本操作
https://www.cnblogs.com/vichin/p/9289969.html
- 使用Dapper进行参数化查询
在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入 ...
- .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...
- C# Dapper基本三层架构使用 (三、DAL)
数据访问层(DAL),主要是存放对数据类的访问,即对数据库的添加.删除.修改.更新等基本操作 首先需要在UI层App.Config配置文件中增加连接字符串,如下所示 <connectionStr ...
- C# Dapper基本三层架构使用 (一、架构关系)
Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀.你又觉得ORM省时省力,这时Dapp ...
- Dapper in .Net Core
一.前言 关于什么是Dapper,在此不做赘述:本文仅对Dapper在.Net Core中的使用作扼要说明,所陈代码以示例讲解为主,乃抛砖引玉,开发者可根据自身需要进行扩展和调整:其中如有疏漏之处,望 ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- Dapper扩展之~~~Dapper.Contrib
平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...
随机推荐
- log4j配置文件及java调用 每个级别输出到不同的文件
#配置根Logger log4j.rootLogger = DEBUG , RollingFile,CONSOLE #文件大小达到一定尺寸的时候创建一个新的文件 log4j.appender.Roll ...
- 最长回文串:LeetCode:Longest Palindromic Substring
class Solution { public: string longestPalindrome(string s) { int length=s.length(); ; ; ][]={false} ...
- pacman命令用法
Pacman 是一个命令行工具,这意味着当你执行下面的命令时,必须在终端或控制台中进行. 1.更新系统 在 Arch Linux 中,使用一条命令即可对整个系统进行更新: pacman -Syu 如果 ...
- 红帽JBoss企业应用平台
概观 下载 你好,世界! 文档和API 救命 社区 你好,世界! 1. 设置您的开发环境 10分钟 2. 安装,配置和验证 5分钟 3. 构建您的第一个JBoss EAP应用程序 20分钟 1 ...
- python3 提取http请求response中的某个值
在使用python3 request做接口测试的时候,想获取response的json中的某个值做断言时,发现request好像没有相关的方法 所以只好自己找写一个了.在我看来,json就是一个字典, ...
- CopyOnWriteArrayList的增删改查实现原理
https://www.cnblogs.com/simple-focus/p/7439919.html 篇文章的目的如下: 了解一下ArrayList和CopyOnWriteArrayList的增删改 ...
- java中使用nextLine(); 没有输入就自动跳过的问题?
[问题分析] 必要的知识:in.nextLine();不能放在in.nextInt();代码段后面否则in.nextLine();会读入"\n"字符,但"\n" ...
- js 获取非行间样式
1.getComputedStyle(nodeObj,false):该方法是BOM对象,第一个是要获取样式的节点对象:第二个可以写成任何的字符一般写成false或者null,这里最好是用false因为 ...
- canvas基础入门(一)canvas的width、height于css样式中的宽高区别
canvas的width.height于css样式中的宽高对画布的内容显示是有所区别的 1.在canvas标签下调用他的width和height,而且是没有单位的宽高,这种指定canvas大小的方法也 ...
- 学习Laravel遇到的问题纪录
1.更换git remote $ git remote rm origin $ git remote add origin git@github.com:your_username/hello_la ...