一、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逆天入门~强类型,动态类型 ...
随机推荐
- [HAOI2006]受欢迎的牛 tarjan缩点 BZOJ1051
题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 ...
- Qt 学习之路 2(8):添加动作
Home / Qt 学习之路 2 / Qt 学习之路 2(8):添加动作 [在WINDOWS10 QTCREATOR MENU添加无效] Qt 学习之路 2(8):添加动作 豆子 ...
- EA888发动机系列
EA888发动机是一个发动机系列,有很多型号,比如从二代机开始,二代机叫做Evolution 2,简称EVO2,分别有CEA:1.8T 横置:CCU:1.8T 纵置:CGM:2.0T横置,CRH:2. ...
- 在服务器上使用 gradle 打包 android 源码
安装 android-tools mkdir ~/android && cd ~/android wget https://dl.google.com/android/reposi ...
- ubuntu14 上无法使用vim命令的解决方法
在ubuntu14.10终端输入vim: The program 'vim' can be found in the following packages: * vim * vim-gnome * v ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_方法执行
[前言] 方法执行前,CLR 会检测方法内代码引用的所有类型.同时 CLR 会分配一个内部数据结构,用来管理对所有引用的类型的访问. 首次执行方法时,托管程序集会把 IL 转换成本地 CPU 指令,并 ...
- Car Flash ECU Programmer From autonumen
Whether you’re a home car owner or an auto mechanic — you can save thousands of dollars on car maint ...
- my24_mysql索引-使用篇
索引提示 SELECT * FROM table1 USE INDEX (col1_index,col2_index) ; SELECT * FROM table1 IGNORE INDEX (col ...
- PHP jsonencode unicode 存储问题
首先是这样的,因为输入的字符串的里面有德语的字符,如下: 当我存储到数据库之后,再用json_encode获取到数据库内的这些字符时,出问题了. 直接encode一个字符串"püüäöä&q ...
- oracle 用mybatis生成主键
oracle主键是不能像mysql一样自动管理的,需要自己手动管理,先生成,再插入. <selectKey keyProperty="id" resultType=" ...