# Dapper 是什么?

  • ORM概念

    ORM:全称Object Relational Mapping ,中文意思是 对象关系映射

    wiki中的解释:

    对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

  • Dapper就是.NET下的一种ORM框架,在.NET中的常用ORM框架有:

  • Dapper的优点

    • 轻量;
    • 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable;
    • 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server;
    • 可以映射一对一,一对多,多对多等多种关系;
    • 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错;
    • 支持FrameWork2.0,3.0,3.5,4.0,4.5;
    • Dapper语法十分简单。并且无须迁就数据库的设计。

# 安装

新建一个控制台程序

使用NuGet安装

  • Package Manager

    Install-Package Dapper

  • .NET CLI

    dotnet add package Dapper

这里数据库演示使用MySQL,需安装MySql.Data包,同样使用NuGet安装

  • Package Manager

    Install-Package MySql.Data

  • .NET CLI

    dotnet add package MySql.Data

注意,如果是安装最新的版本,则包的依赖框架会比较新,导致安装失败

解决方式为,更改控制台的.NET版本到符合的依赖版本,或者安装较低的MySql.Data版本

# 使用

  • 新建实体类

    public class User
    {
        public int Id { get; set; }//自增主键
        public string Name { get; set; }
        public int Age { get; set; }
        public override string ToString()
        {
            return "{ Id:" + Id + ", Name: " + Name + ", Age: " + Age + "}";
        }
    }
    
  • var user = new User();
    user.Name = "bbigcd";
    user.Age = 24;
    using (var conn = new MySqlConnection(connectionString))
    {
        string sqlCommandText = @"insert into user(Name,Age)values(@Name,@Age)";
        try
        {
            int result = conn.Execute(sqlCommandText, user);
            Console.WriteLine(result);
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
    
  • using (var conn = new MySqlConnection(connectionString))
    {
        User user = new User();
        user.Id = 1;
        string sqlCommandText = @"delete from user where Id = {=Id}";
        try
        {
            int result = conn.Execute(sqlCommandText, user);
            Console.WriteLine(result);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
    
  • using (var conn = new MySqlConnection(connectionString))
    {
        User user = new User();
        user.Id = 1;
        user.Age = 80;
        string sqlCommandText = @"update user set Age={=Age} where Id = {=Id}";
        try
        {
            int result = conn.Execute(sqlCommandText, user);
            Console.WriteLine(result);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
    
  • using (var conn = new MySqlConnection(connectionString))
    {
        string sqlCommandText = @"select * from user";
        //Dapper的好处,ORM映射
        var users = conn.Query<User>(sqlCommandText);
        foreach (var item in users)
        {
            Console.WriteLine(item);
        }
    };
    
  • 事务

    using (var conn = new MySqlConnection(connectionString))
    {
        conn.Open();// 需要打开,否则失败
        IDbTransaction trans = conn.BeginTransaction();
        string sqlCommandText1 = @"update user set name='www.lanhusoft.com' where id=@id";
        string sqlCommandText2 = @"delete from user where id=@id";
        int row = conn.Execute(sqlCommandText1, new { id = 3 }, trans);
        row += conn.Execute(sqlCommandText2, new { id = 4 }, trans);
        trans.Commit();
        conn.Close();
    }
    

# 释义

以查询的例子解释:

  1. 创建MySql.Data.MySqlClient.MySqlConnection类,使用using的方式,方便执行完操作后内存被及时回收;

  2. 创建sql语句,查询user表中的数据;

  3. MySqlConnection的Query方法为Dapper框架中对MySqlConnection类的拓展,以拓展的方式,直接查询出数据,并映射到User这个实体类上,以很简洁的方式实现了对象关系映射(ORM);

    Query有多个重载方法,并且支持异步方式,以下是上述的查询中使用到的方法:

    public static IEnumerable<T> Query<T>(this IDbConnection cnn,
     string sql,
     object param = null,
     IDbTransaction transaction = null,
     bool buffered = true,
     int? commandTimeout = null,
     CommandType? commandType = null);
    
上次更新: 2019年 12月 28日 15:53:50