前言: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(); } } }
喜歡的話,點個贊噢👍。