参考资料: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. C语言中变量、全局变量与变量的作用域

    什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...

  2. 线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  3. nginx配置应用

    启动nginxvim /usr/local/lnmp/nginx/conf/nginx.conf mkdir /wwwcd /wwwvim index.html www.westos.orgmkdir ...

  4. 匿名类与lambda区别

    第一种是继承Thread, 重写了Thread.run()    getClass()返回的是匿名类 java.long.Thread$1 第二种是lambda, 重写了Runnable.run()  ...

  5. 1 Groovy

    1.1  什么是Groovy? groovy 是一个弱类型,动态语言,并且运行在JVM之上.它与java联系紧密.它是一个功能丰富和友好的java语言. Groovy源代码,通过Groovy编译器编译 ...

  6. 更新jdk

    1.从官网下载jdk-8u191-linux-x64.tar.gz,然后放在ubuntu里的Downloads文件夹里.然后解压到/usr/lib/jvm文件夹中. sudo tar -zxvf Do ...

  7. mysql 模拟一个自增序列

    文章出处:https://sdu0rj.axshare.com/%E4%BA%8C%E7%BA%A7%E5%AE%A2%E6%88%B7%E7%AE%A1%E7%90%86.html mysql没有像 ...

  8. shell 终端字符颜色

    终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关,shell,python,perl等均可以调用. 转义序列是以 ESC 开头,可以用 \033 完成相同的工作(ESC ...

  9. 探讨PHP获取checkbox值

    如何才能正确的实现PHP获取checkbox值对于初学者来说还是比较陌生的.在这里我们将为大家详细介绍相关的实现方法,希望对大家有所帮助. > > > weeks后的中括号不可漏,否 ...

  10. 关于get_magic_quotes_gpc()函数(交互数据转义的判断)

    在PHP中get_magic_quotes_gpc()函数是内置的函数,这个函数的作用就是得到php.ini设置中magic_quotes_gpc选项的值. 那么就先说一下magic_quotes_g ...