参考资料: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. mysql8.0的新特性

    https://www.cnblogs.com/kevingrace/p/10482469.html MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 ...

  2. CoreData 数据库

    封装CoreManager类 @implementation CoreDataManager { //上下文 NSManagedObjectContext *_ctx; } //单例 +(instan ...

  3. ueditor chrome bug

    一.概述: 关于UEditor在谷歌浏览Chrome打开选择指上传图片,发现[点击选择图片]时无法立即弹出选择框,而是等4-7秒钟才显示出来的BUG,试了N多方法,改层级都用了,也无效.在网上找到了一 ...

  4. java中Runtime类和Process类的简单介绍

    在java.lang包当中定义了一个Runtime类,在java中对于Runtime类的定义如下: Java code public class Runtime extends Object 每个 J ...

  5. mybatis用法

    转载:https://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架 ...

  6. 懒汉式单例要加volatile吗

    private static volatile Something instance = null; public static Something getInstance() { if (insta ...

  7. 工作中常用到的sql命令!!!

    一.mysql数据库日常操作.     1.启动mysql:/etc/init.d/mysql start (前面为mysql的安装路径)     2.重启mysql:  /etc/init.d/my ...

  8. 关于JAVA的基本知识

    TCP/IP 协议族常用协议 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:IP,ICMP,OSPF,EIGRP,IGMP 数据链 ...

  9. form表单序列化数据之后,追加额外数据

    form表单序列化数据之后追加额外数据多使用在js中,下面是追加额外数据的代码: <span style="font-size:18px;">$.param({'inv ...

  10. css3制作梯形导航

    /*HTML*/<div class="nav"> <a href="javascript:;">首页</a> <a ...