一、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(1);

UseCommandDeleteEmployeeUseById(2);

//存储过程删除
ProcDeleteEmployeeById(3);

//此处为方法实现
 /// <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 [email protected]", 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 [email protected]", 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(4, "新名称");

  UseCommandUpdateEmployee(4, 18);

  ProcUpdateEmployeeName(5, "旧名称");
//方法实现

        /// <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 [email protected] where [email protected]", 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 [email protected] where [email protected]",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(5);
            if (employee != null)
            {
                Console.WriteLine("ID为5的员工已找到名称:" + employee.Em_Name);
            }
  //子查询
            List<Employee> list_employees = GetEmployeesByPartId(1);
            Console.WriteLine("共找到{0}记录:", list_employees.Count);
            for (int i = 0; i < list_employees.Count; i++)
            {
                Console.Write(list_employees[i].Em_Name + ",");
            }

/// <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 [email protected]", new { id = id }).FirstOrDefault();

            }

            //CommandDefinition command = new CommandDefinition("select * from employee wehre [email protected]");

            //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 [email protected]) ", new { id = partid });

            using (var conn = GetConnection())
            {
                employees = conn.Query<Employee>(command).ToList();
            }
            return employees;
        }

时间: 2024-10-11 13:26:14

一、Dapper基本操作的相关文章

使用dapper进行参数化查询

在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入,所以在Dappe中可以使用DynamicParameters动态参数集合添加参数,从而实现dapper下的参数化查询: 示例代码 using (var connection = new MySqlConnection(connstr)) { //声明动态参数 DynamicParameters P

ECommon.Dapper

ECommon.Dapper 轻量级的dapper扩展 我们都知道Dapper这个orm框架,但是我们也知道他的扩展目前没有特别好的,今天我就推荐一个轻量级的很方便使用的一个扩展叫做 ECommon.Dapper,它是ECommon的一个类库,关于ECommon,它是Enode的一个common infrastructure,那么你又有问题了,Enode是啥? 我其实要说是 Dapper,重点是这个.关于Enode,出门左拐=>传送门 一:为什么选择ECommon.Dapper  1. 易用性强

&lt;二叉树的基本操作&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; Status CreateBiTree(Bin

iOS_UITextField 基本操作

基本操作 UITextField *userNameTextField = [[UITextField alloc] init]; userNameTextField.frame = CGRectMake(30, 100, 220, 50); [self.window addSubview:userNameTextField]; [userNameTextField release]; // 设置样式 userNameTextField.borderStyle = UITextBorderSty

Mongodb入门系列(4)——Mongodb体系结构与客户端基本操作及注意细节

说到Mongodb的体系结构,免不了与关系型数据库做个对比.这里以MySQL为例,我们进行一些比较: 从逻辑结构上对比: MySQL层次概念 MongoDB层次概念 数据库(database) 数据库(database) 表(table) 集合(collection) 记录(row) 文档(document) 在MongoDB中没有行.列.关系的概念,集合中的文档相当于一条记录,这体现了模式自由的特点. 从数据存储结构上对比: MySQL的每个数据库存放在一个与数据库同名的文件夹中,MySQL如

Oracle的基本操作-解除用户,赋予权限

一.表的基本操作 1. 用户管理 1.1 初始状态下系统的用户 在系统用户下,执行下面的查询语句可以查看到当前系统的所有用户  select * from dba_users; 1.2 创建一个用户 SQL> create user xp identified by xp; User created. 授予连接数据库的权限:SQL> grant connect to xp; Grant succeeded. SQL> conn xp/xp;Connected. 1.3 解锁一个用户并修改

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

【华为技术】VRP平台基本操作

一.显示系统信息 <Huawei>display version 图上所示可以知道VRP平台信息,运行的版本,运行的时间 二.修改和查看设备系统时间参数 1.查看时间 <Huawei>display clock 2.修改系统日期和时间 三.进入系统视图界面 <Huawei>system-view 可以配置接口.路由协议等 四.修改设备名称 五.配置登录标语信息 [R1]header shell information "Welcome to Huawei ro

Mysql查询优化从入门到跑路(三)查询的基本操作

查询的基本操作 1.选择操作 对应的是限制条件,操作对象是二维表的行. 优化方式:选择操作下推 目的:尽量减少连接操作前的元租数,使得中间临时关系尽量少(元祖数少,连接得到的元组数就少) 好处:这样可能减少IO和CPU的消耗.节约内存空间 2.投影操作 对用的SELECT查询的目的列对象 优化方式:投影操作下推 目的:尽量减少连接操作前的列数,使得中间临时关系尽量小(选择操作是使元组的个数尽量少,投影操作是使一条元组尽量少) 好处:虽然不能减少IO(多数数据库存储方式是行存储,元组是读取的最基本