把Dapper 换成 SqlSugar ORM类的方法详解

目录
  • 为什么要写这篇文章
  • Dapper 介绍
  • SqlSugar 介绍
  • 性能对比
  • 移植教程

为什么要写这篇文章

因数我看到很多人虽然用着SqlSugar,但是同时也用着Dapper,因为SqlSugar兼容了Dapper所有API,所以既然你用了SqlSugar那么就没有必要在同一个项目中使用2个ORM

所以这篇文章是给使用SqlSugar或者你想使用SqlSugar的朋友看的

Dapper 介绍

Dapper是一个轻量级开源的ORM类,他是通过扩展IDbConnection提供一些有用的扩展方法去查询您的数据库,所以Ado.Net支持的数据库,他都可以支持。

在速度方面具有“King of Micro ORM”的头衔,几乎与使用原始的ADO.NET数据读取器一样快。很多人第一次使用了他之后,就深深的喜欢上他了。

SqlSugar 介绍

SqlSugar 同样轻量级小巧,功能方面更加全面,需求都是来自1000多开发人员的真实项目需求,在这些需求上进行完美的设计,经过5年多的积累,

可以完美满足企业级的所有需求特别是查询功能,支持了各种类型的返回例如DataTable、List、字典等,还支持各种查询,

例如一次查询多个结果集,当然也支持存储过程

性能对比

在基础功能查询上性能双方是相当接近的,并且在不同CPU多台电脑上进行过大量测试,性能SqlSugar一点不占下风,甚至更好,

在SqlSugar源码中有对比代码,这边我就不多介绍了,性能永远是自个比才是真实的,别人比都是虚假的

移植教程

1、Sql加参数查询

Dapper 使用Sql加参数查询

/// <summary>
  /// 查询列表
  /// </summary>
  /// <param name="sql">查询的sql</param>
  /// <param name="param">替换参数</param>
  /// <returns></returns>
  public static List<T> Query(string sql, object param)
  {
   using (SqlConnection con = new SqlConnection(connectionString))
   {
    return con.Query<T>(sql, param).ToList();
   }
  }

SqlSugar 使用Sql加参数查询

/// <summary>
  /// 查询列表
  /// </summary>
  /// <param name="sql">查询的sql</param>
  /// <param name="param">替换参数</param>
  /// <returns></returns>
  public static List<T> Query(string sql, object param)
  {
   using (SqlSugarClient con =new SqlSugar.SqlSugarClient(connectionConfig))
   {
    return con.Ado.SqlQuery<T>(sql, param);
   }
  }

其中Object param支持3种类型

1、new {id=1} 匿名对象

2、SugarParameter

3、SugarParameter[] 或者List<SugarParameter>

2、根据Sql查询单条

Dapper根据Sql查询单条

/// <summary>
  /// 查询第一个数据
  /// </summary>
  /// <param name="sql"></param>
  /// <param name="param"></param>
  /// <returns></returns>
  public static T QueryFirst(string sql, object param)
  {
   using (SqlConnection con = new SqlConnection(connectionString))
   {
    return con.QueryFirst<T>(sql, param);
   }
  }

SqlSugar根据Sql查询单条

/// <summary>
  /// 查询列表
  /// </summary>
  /// <param name="sql">查询的sql</param>
  /// <param name="param">替换参数</param>
  /// <returns></returns>
  public static List<T> Query(string sql, object param)
  {
   using (SqlSugarClient con =new SqlSugar.SqlSugarClient(connectionConfig))
   {
    return con.Ado.SqlQuerySingle<T>(sql, param);
   }
  }

3、增、删、改

Dapper增、删、改

/// <summary>
  /// 增删改
  /// </summary>
  /// <param name="sql"></param>
  /// <param name="param"></param>
  /// <returns></returns>
  public static int Execute(string sql, object param)
  {
   using (SqlConnection con = new SqlConnection(connectionString))
   {
    return con.Execute(sql, param);
   }
  }

SqlSugar增、删、改

/// <summary>
  /// 增、删、改
  /// </summary>
  /// <param name="sql">查询的sql</param>
  /// <param name="param">替换参数</param>
  /// <returns></returns>
  public static int Query(string sql, object param)
  {
   using (SqlSugarClient con =new SqlSugar.SqlSugarClient(connectionConfig))
   {
    return con.Ado.ExecuteCommand(sql, param);
   }
  }

4、DataReader读取数据

Dapper DataReader读取数据

/// <summary>
  /// Reader获取数据
  /// </summary>
  /// <param name="sql"></param>
  /// <param name="param"></param>
  /// <returns></returns>
  public static IDataReader ExecuteReader(string sql, object param)
  {
   using (SqlConnection con = new SqlConnection(connectionString))
   {
    return con.ExecuteReader(sql, param);
   }
  }

SqlSugarDataReader读取数据

/// <summary>
  /// 获取DataReader
  /// </summary>
  /// <param name="sql">查询的sql</param>
  /// <param name="param">替换参数</param>
  /// <returns></returns>
  public static IDataReader Query(string sql, object param)
  {
   using (SqlSugarClient con =new SqlSugar.SqlSugarClient(connectionConfig))
   {
    return con.Ado.GetDataReader(sql, param);
   }
  }

5、获取首行首列

Dapper获取首行首列

/// <summary>
  /// Scalar获取数据
  /// </summary>
  /// <param name="sql"></param>
  /// <param name="param"></param>
  /// <returns></returns>
  public static object ExecuteScalar(string sql, object param)
  {
   using (SqlConnection con = new SqlConnection(connectionString))
   {
    return con.ExecuteScalar(sql, param);
   }
  }

SqlSugar获取首行首列

/// <summary>
  /// 获取首行首列
  /// </summary>
  /// <param name="sql">查询的sql</param>
  /// <param name="param">替换参数</param>
  /// <returns></returns>
  public static object ExecuteScalar(string sql, object param)
  {
   using (SqlSugarClient con =new SqlSugar.SqlSugarClient(connectionConfig))
   {
    return con.Ado.GetScalar(sql, param);
   }
  }

6、获取存储过程

Dapper获取存储过程

/// <summary>
  /// 带参数的存储过程
  /// </summary>
  /// <param name="sql"></param>
  /// <param name="param"></param>
  /// <returns></returns>
  public static List<T> ExecutePro(string proc, object param)
  {
   using (SqlConnection con = new SqlConnection(connectionString))
   {
    List<T> list = con.Query<T>(proc,
     param,
     null,
     true,
     null,
     CommandType.StoredProcedure).ToList();
    return list;
   }
  }

SqlSugar获取存储过程

/// <summary>
   /// 获取存储过程
   /// </summary>
   /// <param name="sql">查询的sql</param>
   /// <param name="param">替换参数</param>
   /// <returns></returns>
   public static object ExecutePro<T>(string proc, object param) 8   {
    using (SqlSugarClient con =new SqlSugar.SqlSugarClient(connectionConfig))
    {
     return con.Ado.UseStoredProcedure().SqlQuery<T>(proc, param);12    }
  }

7、事务执行多个Sql

Dapper事务执行多个Sql

/// <summary>
  /// 事务1 - 全SQL
  /// </summary>
  /// <param name="sqlarr">多条SQL</param>
  /// <param name="param">param</param>
  /// <returns></returns>
  public static int ExecuteTransaction(string[] sqlarr)
  {
   using (SqlConnection con = new SqlConnection(connectionString))
   {
    using (var transaction = con.BeginTransaction())
    {
     try
     {
      int result = 0;
      foreach (var sql in sqlarr)
      {
       result += con.Execute(sql, null, transaction);
      }

      transaction.Commit();
      return result;
     }
     catch (Exception ex)
     {
      transaction.Rollback();
      return 0;
     }
    }
   }
  }

Sugar事务执行多个Sql

/// <summary>
  /// 事务1 - 全SQL
  /// </summary>
  /// <param name="sqlarr">多条SQL</param>
  /// <param name="param">param</param>
  /// <returns></returns>
  public static int ExecuteTransaction(string[] sqlarr)
  {
   using (SqlSugarClient con = new SqlSugarClient(connectionConfig))
   {
    con.Ado.BeginTran();
    using (var transaction = con.Ado.Transaction)
    {
     try
     {
      int result = 0;
      foreach (var sql in sqlarr)
      {
       result += con.Ado.ExecuteCommand(sql);
      }

      transaction.Commit();
      return result;
     }
     catch (Exception ex)
     {
      transaction.Rollback();
      return 0;
     }
    }
   }
  }

SqlSugar参数详解

SqlSugar同样支持游标 、Output、 ReturnValue

var nameP=new SugarParameter("@name", "张三", typeof(string),ParameterDirection.ReturnValue);

移植成SqlSugar ORM有哪些优点

同样是写Sql但是SqlSugar提供了AOP、性能监控、返回多个结果集、SQL分页、一对多、一对一操作、JSON类型 等

1、SqlSugar支持AOP等事件操作

db.Aop.OnLogExecuted = (sql, pars) => //SQL执行完
{
 Console.Write("time:" + db.Ado.SqlExecutionTime.ToString());//输出SQL执行时间
};
db.Aop.OnLogExecuting = (sql, pars) => //SQL执行前
{

};
db.Aop.OnError = (exp) =>//SQL报错
{
 //exp.sql 这样可以拿到错误SQL
};
db.Aop.OnExecutingChangeSql = (sql, pars) => //可以修改SQL和参数的值
{
 return new KeyValuePair<string, SugarParameter[]>(sql,pars);
};

除了这些事件外 SqlSugar还支持了性能监控,对于性能差的Sql或者存储过程都能很好的跟踪

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
 {
    DbType = DbType.SqlServer,
    ConnectionString = Config.ConnectionString,
    InitKeyType = InitKeyType.Attribute,
    IsAutoCloseConnection = true

 });
 db.Aop.OnLogExecuted = (sql, p) =>
 {
   //执行时间超过1秒
  if (db.Ado.SqlExecutionTime.TotalSeconds > 1)
  {
   //代码CS文件名
   var fileName= db.Ado.SqlStackTrace.FirstFileName;
   //代码行数
   var fileLine = db.Ado.SqlStackTrace.FirstLine;
   //方法名
   var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
   //db.Ado.SqlStackTrace.MyStackTraceList[1].xxx 获取上层方法的信息
   }
 };

因为内容比较多一下子写不完 ,没关注的点一波关注

2、Json类型的查询

public class UnitJsonTest
{
 [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
 public int Id { get; set; }
 [IsJson = true)]//其中IsJson是必填
 public Order Order { get; set; }
 public string Name{get;set;}
}
var list = Db.Ado.SqlQuery<UnitJsonTest>().ToList();//数据库是一个json字符串

3、Sql分页

 var list= db.SqlQueryable<Student>("select * from student").Where("id=@id",new { id=1}).ToPageList(1, 2);

源码下载:https://github.com/sunkaixuan/SqlSugar

到此这篇关于把Dapper 换成 SqlSugar ORM类的方法详解的文章就介绍到这了,更多相关Dapper 换成 SqlSugar ORM内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NET Core Dapper操作mysql数据库的实现方法

    前言 现在ORM盛行,市面上已经出现了N款不同的ORM套餐了.今天,我们不谈EF,也不聊神马黑马,就说说 Dapper.如何在.NET Core中使用Dapper操作Mysql数据库呢,让我们跟随镜头(手动下翻)一看究竟. 配置篇 俗话说得好,欲要善其事必先利其器.首先,我们要引入MySql.Data 的Nuget包.有人可能出现了黑人脸,怎么引入.也罢,看在你骨骼惊奇的份上,我就告诉你,两种方式: 第一种方式 Install-Package MySql.Data -Version 8.0.15

  • 利用AOP实现SqlSugar自动事务

    本文实例为大家分享了如何利用AOP实现SqlSugar自动事务,供大家参考,具体内容如下 先看一下效果,带接口层的三层架构: BL层: public class StudentBL : IStudentService { private ILogger mLogger; private readonly IStudentDA mStudentDa; private readonly IValueService mValueService; public StudentService(IStude

  • 基于Dapper实现分页效果 支持筛选、排序、结果集总数等

    简介 之前事先搜索了下博客园上关于Dapper分页的实现,有是有,但要么是基于存储过程,要么支持分页,而不支持排序,或者搜索条件不是那么容易维护. 代码 首先先上代码: https://github.com/jinweijie/Dapper.PagingSample 方法定义 以下是我的一个分页的实现,虽然不是泛型(因为考虑到where条件以及sql语句的搭配),但是应该可以算是比较通用的了,方法定义如下: public Tuple<IEnumerable<Log>, int> F

  • Asp.net中使用DapperExtensions和反射来实现一个通用搜索

    前言 搜索功能是一个很常用的功能,当然这个搜索不是指全文检索,是指网站的后台管理系统或ERP系统列表的搜索功能.常见做法一般就是在搜索栏上加上几个常用字段来搜索.代码可能一般这样实现 StringBuilder sqlStr = new StringBuilder(); if (!string.IsNullOrEmpty(RealName)) { sqlStr.Append(" and RealName = @RealName"); } if (Age != -1) { sqlStr.

  • 把Dapper 换成 SqlSugar ORM类的方法详解

    目录 为什么要写这篇文章 Dapper 介绍 SqlSugar 介绍 性能对比 移植教程 为什么要写这篇文章 因数我看到很多人虽然用着SqlSugar,但是同时也用着Dapper,因为SqlSugar兼容了Dapper所有API,所以既然你用了SqlSugar那么就没有必要在同一个项目中使用2个ORM 所以这篇文章是给使用SqlSugar或者你想使用SqlSugar的朋友看的 Dapper 介绍 Dapper是一个轻量级开源的ORM类,他是通过扩展IDbConnection提供一些有用的扩展方法

  • 把JSON数据格式转换为Python的类对象方法详解(两种方法)

    JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你接收到这样一个JSON字符串如下: {"Name": "Tom", "Sex": "Male", "BloodType": "A", "Hobbies": ["篮球", "足球"]} 我需要把这个转换为具

  • java编程abstract类和方法详解

    抽象类和抽象方法常用知识点: (1)抽象类作为被继承类,子类必须实现抽象类中的所有抽象方法,除非子类也为抽象类. 也就是说,如果子类也为抽象类,可以不实现父类中的抽象方法.但是,如果有一个非抽象类 继承于抽象子类,需要实现抽象子类,抽象子类的抽象父类的所有抽象方法,新帐旧账一起算. (2)抽象类不能用final进行修饰. (3)抽象类不能被实例化,也就是说你用的时候不能通过new关键字创建. (4)抽象类中可以包含抽象方法和非抽象方法,抽象方法没有方法体,也就是没有具体实现, 只是定义了有什么功

  • C++实现String类的方法详解

    目录 前言 string模拟实现 string简单实现 string完整实现 完整代码 前言 在C语言中,没有专门用来表示字符串的类型.C语言的字符串是一系列以’\0’为结尾的字符的集合.虽然C语言为这样的字符串提供了一系列的库函数如strcpy, strcmp等等,但这些函数与字符串这个类型是分开的,这不太符合C++中面试对象的思想,所以在C++中封装了一个string类,来帮助我们操作字符串.string该如何使用,我这里就不做赘述了,大家可以去看看官方文档呀 string - C++ Re

  • thinkPHP引入类的方法详解

    本文实例讲述了thinkPHP引入类的方法.分享给大家供大家参考,具体如下: 这里以发送邮件类phpmailer为例 1.将核心文件放入ORG目录下 2.在使用的地方,引入这个类文件 如何引入呢? import('@.ORG.phpmailer'); 这个表示引入当前项目中的ORG中的phpmailer.class.php文件 3.引入之后就可以使用文件中的类了 public function sendEmail() { import('@.ORG.phpmailer'); $mail = ne

  • thinkPHP自定义类实现方法详解

    本文实例讲述了thinkPHP自定义类实现方法.分享给大家供大家参考,具体如下: 1.通过Model调用 <?php /** * 积分模型 api接口 */ class ApiModel{ private $url = 'http://js.yunlutong.com/Customer/Interface'; public function test() { $post_data['action'] = 'sadf'; $post_data['callback'] = '?'; $res = r

  • java.util.ArrayDeque类使用方法详解

    本文为大家介绍了java.util.ArrayDeque类使用方法,供大家参考,具体内容如下 1. ArrayDeque有两个类属性,head和tail,两个指针. 2. ArrayDeque通过一个数组作为载体,其中的数组元素在add等方法执行时不移动,发生变化的只是head和tail指针,而且指针是循环变化,数组容量不限制. 3. offer方法和add方法都是通过其中的addLast方法实现,每添加一个元素,就把元素加到数组的尾部,此时,head指针没有变化,而tail指针加一,因为指针是

  • Python使用描述器实现ORM模型的方法详解

    目录 1.__set__方法:设置属性 2.__get__方法:访问属性 3.__delete__方法:删除属性 4.描述器实现ORM模型: 总结 访问或者修改描述器对象的属性时无法触发__setattr__等方法,只会触发描述器类内部的__set__,__get__,__delete__方法. ORM模型:类名对应表名,对象对应的数据行,类属性对应数据行的各字段,有几个表字段,就绑定几个类属性:往表中增加数据就是创建对象,每创建一个对象,就是增加一行数据记录. ORM框架的功能: 1.建立模型

  • javascript中定义类的方法详解

    JS中定义类的方式有很多种: 1.工厂方式 复制代码 代码如下: function Car(){    var ocar = new Object;    ocar.color = "blue";    ocar.doors = 4;    ocar.showColor = function(){     document.write(this.color)    };    return ocar;   }   var car1 = Car();   var car2 = Car()

  • java中List集合及其实现类的方法详解

    List集合_List接口介绍 特点 1).有序的: 2).可以存储重复元素: 3).可以通过索引访问: List<String> list = new ArrayList<>(); list.add("张无忌"); list.add("张三丰"); list.add("章子怡"); list.add("章子怡");//OK的,可以添加 for(String s : list){ System.out.

随机推荐