参考资料: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基本操作的更多相关文章

  1. dapper基本操作

    https://www.cnblogs.com/vichin/p/9289969.html

  2. 使用Dapper进行参数化查询

    在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入 ...

  3. .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现

    本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...

  4. C# Dapper基本三层架构使用 (三、DAL)

    数据访问层(DAL),主要是存放对数据类的访问,即对数据库的添加.删除.修改.更新等基本操作 首先需要在UI层App.Config配置文件中增加连接字符串,如下所示 <connectionStr ...

  5. C# Dapper基本三层架构使用 (一、架构关系)

    Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀.你又觉得ORM省时省力,这时Dapp ...

  6. Dapper in .Net Core

    一.前言 关于什么是Dapper,在此不做赘述:本文仅对Dapper在.Net Core中的使用作扼要说明,所陈代码以示例讲解为主,乃抛砖引玉,开发者可根据自身需要进行扩展和调整:其中如有疏漏之处,望 ...

  7. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  8. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  9. Dapper扩展之~~~Dapper.Contrib

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...

随机推荐

  1. CF912E Prime Gift 数学

    Opposite to Grisha's nice behavior, Oleg, though he has an entire year at his disposal, didn't manag ...

  2. kuangbin专题十六 KMP&&扩展KMP HDU2328 Corporate Identity

    Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...

  3. github的使用 sourceTree

    http://www.cnblogs.com/Jenaral/p/5655958.html

  4. lambda函数/排序/filter/map

    1.lambda 匿名函数 zrf = lambda x:x**2 ret = zrf(10) #这里面实际上还是有函数名 print(ret) 2.sorted 排序(list也自带排序功能) 排序 ...

  5. python练习六十四:EXCEL文件处理

    假设要读取number.txt文件中内容,code.txt文件内容如下 [ [1,2,3], [4,5,6], [7,8,9] ] 数据写入表格,如图 写文件(如果有文件,那直接调用就行,我这里自己先 ...

  6. 汉诺塔问题hdu 2065——找规律

    这类题目就是纸上模拟,找规律. 问题描述:在一块铜板上有三根杆,目的是将最左边杆上的盘全部移到右边的杆上,条件是不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允 ...

  7. Java学习笔记day03_引用数据类型

    1.引用数据类型 步骤: 1. 导包   2. 创建引用类型变量 类型 变量名 = new 类型名();   3. 使用数据类型的功能 变量名.功能名(); 如Scanner类: import jav ...

  8. 查看linux系统各种参数配置的命令

    查看linux系统各种参数配置的命令 last |grep shutdown                             //查看上次关机时间 last |grep reboot     ...

  9. CEF和JS交互

    CefClient提供所有浏览器事件处理的接口,重写CefClient类中的方法处理浏览器事件:包括Browser的生命周期,右键菜单,对话框,状态通知显示,下载事件,拖曳事件,焦点事件,键盘事件,离 ...

  10. oracle merge into函数中插入clob字段

    当使用Merge into 函数向ORACLE数据库中插入或更新数据时,报错“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”,使用如下方法可以把String转换为clob. 需 ...