前言:sqlSugar出生已经有3年之久了,从1.0到现在的4.x的版本,为了以后方便使用SqlSugar,所以特意花了2个小时来叙述它。

关于SqlSugar

性能:性能最好的ORM之一,具有超越Dapper的性能 ,走的是EMIT够构中间语言动态编译到程序集,完成高性能的实体绑定,达到原生水平。

功能:支持 DbFirst、CodeFirst、数据库维护、链式查询、链式更新、链式删除、链式插入、实体属性、复杂模型的查询、ADO.NET。特别是批量等功能都是货真价实的并非循环操作。

兼容性:支持多种数据库,具体就是SqlSugar的DbType枚举中有MySql、Oracle、SqlLite、SqlServer、PostgreSQL

入门使用

以下代码是创建连接,其中属性构造器的四个值分别为连接字符串、数据库类型、是否自动销毁连接、获取自增列主键信息。

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "Data Source=DESKTOP-OEJGKOO;Initial Catalog=TextInfo;Integrated Security=True",
DbType = SqlSugar.DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});

那我们做一个查询系列吧,数据库还是依旧的Users,实体类应和数据的结构一样,在此其中呢,你也可以指定一些特性,这样是有很大的好处的。

  public class Users
{
public int UserID { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string Address { get; set; }
}

最基本的查询:

var list = db.Queryable<Users>().ToList();//查询所有

这个Queryable就是SqlSugar4的内置方法,我写入的泛型参数必须和数据库一样吗,那我的实体类应该怎么办,我如何在asp.net mvc中,我的model这样也一定会出现诸多的问题,那其实问题很简单,在实体中写上特性即可。

[SugarTable("Users")]
public class Users
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int UserID { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string Address { get; set; }
}

这样问题也就随之解决了,关于UserID这个主键列,数据库中也要设置主键和自增列才会有效,那我们再写一些条件查询、按主键查询、分页查询,以下代码呢根据主键查询,你的model层必须指定才可以,反则是无效的。

var objById = db.Queryable<Users>().InSingle(1);//根据主键查询
var getObjByWhere = db.Queryable<Users>().Where(u => u.UserID == 1);//根据条件查询
var total = 0;
var getPage = db.Queryable<Users>().Where(it => it.UserName == "zaranet").ToPageList(1, 2, ref total);

查询我们基本上都说完了,你们心里一定在想,CRUD的操作,还有3呢,哦?,那其实很简单的,比查询so easy的多。

Users users = new Users() {  UserName = "student hard",   Email="666666@qq.com",  Address="美国洛杉矶" };
int result = db.Insertable(users).ExecuteCommand();//insert
var user2 = new Users(){ UserID = 12, UserName = "厉害了我的ge" };
int result2 = db.Insertable(users).ExecuteCommand();//update
int result3 = db.Deleteable<Users>(1).ExecuteCommand();//bey key del obj

使用SimpleClient优化你的代码

我们之前已经学会用SimpleClient了,但是我们发现我们的查询每次都要通过db.Querytable去搞一些事情,非常的繁琐。我们可以去封装以下Client,创建DbContext;Db.Aop.OnLogExecuting是Sugar给我们提供查看sql的接口;其下图是生成的sql。

DbContext的定义:

    public class DbContext
{
public DbContext()
{
Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "Data Source=DESKTOP-OEJGKOO;Initial Catalog=TextInfo;Integrated Security=True",
DbType = SqlSugar.DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
//调式代码 用来打印SQL
Db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql + "\r\n" +
Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
}
public SqlSugarClient Db;
public SimpleClient<Users> UsersDb {
get { return new SimpleClient<Users>(Db); }
    }

使用DbContext玩转CRUD

其中需要注意的是使用SqlSugar的部分功能的时候,一定要引用newtonSoft.json.dll 9.0.1及以上版本,否则会出现一些错误,比如:

关于使用SqlSugar的查询有很多方法,根据主键啊,where啊,getsingle啊,你回头自己再看看,我这里就不一一列举了。

使用DbContext要在类中去继承自DbContext,这样你的类都是DbContext派生类了,下面代码中,通过一个简单的条件还有一个枚举类型,做了一个最基本的分页查询,那我们如果是多条件呢,难道还要 && 条件吗?

public class UsersService : DbContext
{
public void SearchDemo()
{
var p = new PageModel() { PageIndex = 1, PageSize = 2 };// 分页查询
//分页+排序
var data = UsersDb.GetPageList(u => u.UserName == "zaraNet", p, u => u.UserName, OrderByType.Asc);
Console.WriteLine(p.PageCount);
}
}

我们可以通过IConditionalModel这个类来组合条件,以方便我们的查询,其代码所示:

var p = new PageModel() { PageIndex = 1, PageSize = 2 };// 分页查询
List<IConditionalModel> conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel()
{
FieldName = "id",
ConditionalType = ConditionalType.Equal,
FieldValue = "1"
});
var data = UsersDb.GetPageList(conModels,p,it => it.UserName,OrderByType.Desc);

噢!,其实这样是比较方便了,但是后期维护也是很累的,你看着吧,你想怎么用就怎么用,我们在说一说增删改吧,查我们已经说的差不多了。

首先说一下添加,也是非常简单,直接new对象调用Insert就好,但有一个值得提的是,SqlSugar给我们提供了数组系列,也就是说我们不用循环操作了,其示例代码如下:

var p = new PageModel() { PageIndex = 1, PageSize = 2 };// 分页查询
var user = new Users() { UserName = "zara1", Email = "sad", Address = "asd" };
var user2 = new Users() { UserName = "zaranet", Email = "asd", Address = "zxc" };
UsersDb.Insert(user);//插入
UsersDb.InsertRange(new Users[] {user,user2});

下面是SqlSugar生成的Sql,不难发现插入数组的sql非常的犀利,采用的是insert select 语法。

INSERT INTO [Users]
([UserName],[Email],[Address])
VALUES
(@UserName,@Email,@Address) ;
{"@UserName":"zara1","@Email":"sad","@Address":"asd"} INSERT [Users] ([UserName],[Email],[Address])
SELECT N'zara1' AS [UserName],N'sad' AS [Email],N'asd' AS [Address]
UNION ALL
SELECT N'zaranet' AS [UserName],N'asd' AS [Email],N'zxc' AS [Address]

在说一说更新和删除吧,当然他们同样有着range系列的操作,其代码所示:

SqlSugar的事务简单使用,我通常都是这么用的,通过这种方式是免去 db.CommitTran();这种啰嗦且邋遢代码。

 var result = Db.Ado.UseTran(() =>
{
var obj = UsersDb.GetById(0);
obj.UserName = "事务demo";
UsersDb.Update(obj);
});
if (result.IsSuccess)
{
Console.WriteLine("事务提交了");
//成功
}
else
{
Console.WriteLine(result.ErrorMessage);
}

如何优雅的使用DbContext

UsersService.cs
public class UsersService: DbContext<User>
{
//有特殊需要的时候在重写方法组
}

 DbContext中被改造成了泛型类,你传过来什么我干什么,这样DbContext真的就是管上下文的了,其优雅度从代码中就可以看出!如果你有特殊情况你需要重写方法,你直接重写即可,这个时候你就可以把这个东西想象成三层框架中的BLL.

 public class UsersService : DbContext<Users>
{
public override List<Users> GetList()
{
return base.GetList();
}
}

 其DbContext的最终定义:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar; namespace dapperDemo
{
public class DbContext<T> where T: class,new()
{
public DbContext()
{
Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "Data Source=DESKTOP-OEJGKOO;Initial Catalog=TextInfo;Integrated Security=True",
DbType = SqlSugar.DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
//调式代码 用来打印SQL
Db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql + "\r\n" +
Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
}
public SqlSugarClient Db;
public SimpleClient<Users> UsersDb {
get { return new SimpleClient<Users>(Db);
} }
public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }
/// <summary>
/// 可重写的更新
/// </summary>
public virtual bool Update(T obj)
{
return CurrentDb.Update(obj);
}
public virtual bool Delete(dynamic id)
{
return CurrentDb.DeleteById(id);
}
public virtual List<T> GetList()
{
return CurrentDb.GetList();
}
}
}

  

  喜欢的话,点个赞噢

【Zara原创】SqlSugar4轻量级ORM框架的使用指南的更多相关文章

  1. 轻量级ORM框架初探-Dapper与PetaPoco的基本使用

    一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...

  2. c# 轻量级ORM框架 实现(一)

    发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解. 设计该框架的目的:不想重复的写增删改查,把精力放到功能实现上. 发布改框架的原因:希望给 ...

  3. 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  4. 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  5. .NET轻量级ORM框架Dapper入门精通

    一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...

  6. 轻量级ORM框架Dapper应用一:Dapper安装

    一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...

  7. 分享自己写的基于Dapper的轻量级ORM框架~

    1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...

  8. C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架

    Sweet小马 小马同学的编程日记. C# 性能优化 之 秒表 Stopwatch. 生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagn ...

  9. c# 轻量级 ORM 框架 之 Model解析 (四)

    关于orm框架设计,还有必要说的或许就是Model解析了,也是重要的一个环节,在实现上还是相对比较简单的. Model解析,主要用到的技术是反射了,即:把类的属性与表的字段做映射. 把自己的设计及实现 ...

随机推荐

  1. java去除查询实体字段多值之间空格

    String str = 需要去除的字段; str.replaceAll(",","");

  2. 2013年省赛H题

    2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...

  3. C# 神奇的Web services 请求超时问题 排查分析

    服务器上有两个接口,一个是Web Services(asmx文件)接口,一个是MVC API (普通的GET请求接口) 神奇的事情是这样的,只要我使用WebRequest请求两次,再使用Web Ser ...

  4. CDI Features

    概述 如果说EJB,JPA是之前JEE(JEE5及JEE5之前)中里程碑式的规范,那么在JEE6,JEE7中CDI可以与之媲美,CDI(Contexts and Dependency Injectio ...

  5. RDD算子

    RDD算子 #常用Transformation(即转换,延迟加载) #通过并行化scala集合创建RDD val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8 ...

  6. Cmd命令 查看端口被占用

    1)第一步 打开cmd命令窗口,输入命令:netstat -ano|findstr 输入端口号 2)第二步 继续输入命令:tasklist|findstr  第一步查询到的进程号 3)第三步 根据第二 ...

  7. sqlmap Windows 安装教程

    第一步:下载 python :https://www.python.org/downloads/    (这里有python各种版本,但是一般建议安装3和2.7) sqlmap:https://git ...

  8. react-native 常用的一些插件

    react-native 常用的一些插件 最近在做react-native的app,用到的一些好用的插件,在这儿记录一下 由于返回的后台内容是富文本编辑器Quill,返回的的是Delta对象,使用了q ...

  9. PIL成就你的自信之路

    1.强大的PIL库 在Python中,有一个优秀的图像处理框架,就是PIL库,本博文会分模块,介绍PIL库中的各种方法,并列举相关例子. 学习总结:PIL库可以让我们得到更多的需求,以此来满足我们的需 ...

  10. 排列组合python

    python 的 itertools模块 可以专业的处理的排列组合问题 写在自己博客里,怕下次找不到喽