为了账号安全,请及时绑定邮箱和手机立即绑定

【Zara原创】SqlSugar4轻量级ORM框架的使用指南

标签:
SQL Server

前言: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,实体类应和数据的结构一样,在此其中呢,你也可以指定一些特性,这样是有很大的好处的。

+ View Code?


publicclassUsers  {      publicintUserID { get; set; }      publicstringUserName { get; set; }      publicstringEmail { get; set; }      publicstringAddress { get; set; }  }

最基本的查询:

?

1var 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();//insertvar 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); } <br>    }

使用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 ALLSELECT N'zaranet' AS [UserName],N'asd' AS [Email],N'zxc' AS [Address]

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

View Code

 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

?

1UsersService.cs

?


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

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

?


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

 其DbContext的最终定义:

+ View Code

原文出处:https://www.cnblogs.com/ZaraNet/p/9988180.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消