C#进阶-Dapper原理剖析与使用教程

打印 上一主题 下一主题

主题 559|帖子 559|积分 1677

本文详细先容了Dapper在C#中的使用方法,包括Dapper的基本概念、与其他恒久层框架的比力、基本语法和高级语法的使用,并通过实例讲解了如何在项目中集成和使用Dapper。最后,总结了Dapper的优缺点及其在现实开辟中的应用场景。
     一、Dapper先容

     1. Dapper先容

     Dapper是一个轻量级的ORM(对象关系映射)框架,专为.NET设计。它通过扩展IDbConnection接口,使开辟者可以或许方便地执行SQL查询,并将查询结果映射到对象模型中。
     2. Dapper原理剖析

     Dapper的核心原理是通过扩展方法来简化数据访问过程。它的主要工作流程如下:
     

  • 建立数据库毗连:使用ADO.NET的IDbConnection接口建立数据库毗连。
  • 执行SQL查询:通过Dapper提供的扩展方法(如Query、Execute等)执行SQL查询。
  • 映射结果集:将查询结果集映射到C#对象模型中,简化数据处理。
     Dapper的性能优势主要来源于以下几个方面:
     

  • 轻量级:Dapper没有复杂的上下文管理和变革跟踪机制,减少了性能开销。
  • 直接执行SQL:Dapper直接执行原生SQL查询,避免了复杂的查询生成过程。
  • 缓存查询筹划:Dapper会缓存查询筹划,减少SQL剖析和执行的开销。
     3. Dapper和其他操作数据库的框架比力

     为了更清楚地展示Dapper与其他数据库操作框架的比力,以下通过表格举行说明:
           
特性
Dapper
Entity Framework
NHibernate
ADO.NET
性能

中等
中等

易用性


中等

映射本领
基本映射
丰富
丰富

学习曲线

中等


事务支持
支持
支持
支持
支持
LINQ支持
不支持
支持
支持
不支持
配置机动性

中等


          二、Dapper的基本语法

     Dapper提供了多种方法来简化数据库操作。以下是一些常用的基本语法及其示例代码:
     1. 查询数据

     Dapper使用Query方法执行SQL查询并返回结果集。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "SELECT * FROM Students";
  4.     var students = db.Query<Student>(sql).ToList();
  5. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
                       2. 插入数据

     Dapper使用Execute方法执行插入操作。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
  4.     var result = db.Execute(sql, new { Name = "John", Age = 22 });
  5. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
                       3. 更新数据

     Dapper使用Execute方法执行更新操作。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "UPDATE Students SET Name = @Name, Age = @Age WHERE Id = @Id";
  4.     var result = db.Execute(sql, new { Name = "John", Age = 23, Id = 1 });
  5. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
                       4. 删除数据

     Dapper使用Execute方法执行删除操作。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "DELETE FROM Students WHERE Id = @Id";
  4.     var result = db.Execute(sql, new { Id = 1 });
  5. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
                       5. 存储过程

     Dapper可以轻松调用存储过程。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     var result = db.Query<Student>("GetStudentById", new { Id = 1 }, commandType: CommandType.StoredProcedure).FirstOrDefault();
  4. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
                       三、Dapper的高级功能

     Dapper除了基本的CRUD操作外,还提供了一些高级功能,以满足复杂的数据库操作需求。
     1. 多映射

     Dapper支持多表查询并将结果映射到多个对象。
                                   登录后复制                        
  1. string sql = "SELECT * FROM Students s INNER JOIN Classes c ON s.ClassId = c.Id";
  2. var studentDictionary = new Dictionary<int, Student>();
  3. using (IDbConnection db = new SqlConnection(connectionString))
  4. {
  5.     var students = db.Query<Student, Class, Student>(sql, (student, @class) => {
  6.         student.Class = @class;
  7.         return student;
  8.     }, splitOn: "Id").Distinct().ToList();
  9. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
                       2. 参数化查询

     Dapper支持参数化查询,有效防止SQL的注入。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "SELECT * FROM Students WHERE Age > @Age";
  4.     var students = db.Query<Student>(sql, new { Age = 20 }).ToList();
  5. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
                       3. 事务处理

     Dapper支持数据库事务,确保数据操作的划一性。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     db.Open();
  4.     using (var transaction = db.BeginTransaction())
  5.     {
  6.         string insertSql = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
  7.         db.Execute(insertSql, new { Name = "John", Age = 22 }, transaction);
  8.         string updateSql = "UPDATE Students SET Age = @Age WHERE Name = @Name";
  9.         db.Execute(updateSql, new { Age = 23, Name = "John" }, transaction);
  10.         transaction.Commit();
  11.     }
  12. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
                       4. 批量操作

     Dapper可以高效地举行批量操作。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
  4.     var students = new List<Student>
  5.     {
  6.         new Student { Name = "John", Age = 22 },
  7.         new Student { Name = "Jane", Age = 24 },
  8.         new Student { Name = "Mark", Age = 26 }
  9.     };
  10.     db.Execute(sql, students);
  11. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
                       5. 动态对象

     Dapper支持动态对象,适用于不确定返回布局的查询。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "SELECT * FROM Students";
  4.     var students = db.Query<dynamic>(sql).ToList();
  5.     foreach (var student in students)
  6.     {
  7.         Console.WriteLine($"{student.Name} - {student.Age}");
  8.     }
  9. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
                       6. 缓存功能

     Dapper内置简单的缓存功能,可以进步查询性能。
                                   登录后复制                        
  1. using (IDbConnection db = new SqlConnection(connectionString))
  2. {
  3.     string sql = "SELECT * FROM Students";
  4.     var students = db.Query<Student>(sql, buffered: true).ToList();
  5. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
                       四、Dapper使用总结

     Dapper作为一个轻量级的ORM框架,在性能和易用性之间找到了均衡点。它适合于需要高效数据访问的应用场景,尤其是在已有数据库项目中快速集成和使用。
     Dapper的优势在于其高性能、简单易用和机动性。它直接执行SQL查询, 性能接近手写ADO.NET,且API简洁明白,易于上手。同时,Dapper不需要复杂的配置,适合快速集成和使用。
     然而,Dapper也有其范围性。它不支持复杂的对象关系映射,不提供LINQ支持,不适合复杂的业务逻辑处理场景。因此,在选择使用Dapper时,需要根据具体项目需求举行权衡。
     优势总结

           
优势
形貌
高性能
直接执行SQL查询, 性能接近手写ADO.NET
简单易用
API简洁明白,易于上手
轻量级
不需要复杂的配置,适合快速集成
参数化查询
有效防止SQL的注入
支持事务处理
确保数据操作的划一性
机动性
允许开辟者完全控制SQL语句,实现更复杂的查询逻辑
          通过本教程,盼望读者可以或许快速把握Dapper的基本使用方法,并在项目中有效地应用Dapper进步开辟服从。Dapper的高效和简洁使其成为处理简单到中等复杂度数据库操作的抱负选择,但对于复杂的业务场景,仍需结合其他框架或工具举行综合使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表