學(xué)習(xí)SqlSugar ORM框架的關(guān)鍵:對其模塊與實(shí)現(xiàn)原理的詳細(xì)分析
SqlSugar 是一款基于 ADO.NET 的輕量級 ORM 框架,它的核心模塊包括 Core、Ado、Queryable、SqlBuilder 和 Attributes 等,下面就逐一進(jìn)行深度解析。
Core 模塊
Core 模塊是 SqlSugar 的核心模塊,主要實(shí)現(xiàn)了 ORM 映射的核心功能。其中包括了一個代碼生成器,可以根據(jù)相關(guān)配置信息自動生成對應(yīng)的實(shí)體類和數(shù)據(jù)訪問層代碼。
在 Core 模塊中,SqlSugar 使用反射機(jī)制獲取實(shí)體類屬性信息,在運(yùn)行時動態(tài)生成 SQL 語句。同時,SqlSugar 中定義了一系列的委托類型,通過委托實(shí)現(xiàn)對 SQL 語句、參數(shù)值和實(shí)體數(shù)據(jù)的封裝和處理,大大簡化了數(shù)據(jù)訪問層的編寫工作。此外,SqlSugar 中還引入了緩存機(jī)制,大大提高了數(shù)據(jù)訪問效率。
Ado 模塊
Ado 模塊是 SqlSugar 中最底層的模塊,用于對數(shù)據(jù)庫進(jìn)行操作。主要包括了與數(shù)據(jù)庫連接相關(guān)的類和方法,例如 ConnectionConfig、SqlConnection、SqlCommand、SqlDataAdapter 等,通過這些類和方法,SqlSugar 可以實(shí)現(xiàn)與多種類型的數(shù)據(jù)庫連接。
在 Ado 模塊中,SqlSugar 將數(shù)據(jù)庫連接分為兩個部分:連接池和操作命令。在連接池中,SqlSugar 提供了一系列的方法,包括創(chuàng)建連接、獲取連接、釋放連接和關(guān)閉連接等。在操作命令中,SqlSugar 使用 SqlCommand 類對 SQL 語句進(jìn)行執(zhí)行,并借助 SqlParameters 類封裝參數(shù)值。
Queryable 模塊
Queryable 模塊用于實(shí)現(xiàn)查詢功能,它是 ORM 中最常用的模塊之一。該模塊封裝了對數(shù)據(jù)表的查詢操作,使得開發(fā)人員可以通過類似 LINQ 的語法,對數(shù)據(jù)進(jìn)行高效、簡潔、安全地操作。同時,SqlSugar 還提供了 Filter、Join、GroupBy、OrderBy 和 Select 等方法,可以極大地豐富查詢語句的功能。
在 Queryable 模塊中,SqlSugar 定義了一些基本的查詢方法,包括 First、Single、ToList、ToDataTable 等,這些方法返回的對象都繼承自 ISugarQueryable 接口,使得開發(fā)人員可以方便地根據(jù)需要對查詢結(jié)果進(jìn)行轉(zhuǎn)換和處理。
SqlBuilder 模塊
SqlBuilder 模塊用于構(gòu)建 SQL 語句,它允許開發(fā)人員直接使用字符串操作來構(gòu)建 SQL 語句,SqlSugar 會自動將字符串轉(zhuǎn)換成可執(zhí)行的 SQL 語句并執(zhí)行。
在 SqlBuilder 模塊中,SqlSugar 提供了一系列的輔助方法,幫助開發(fā)人員構(gòu)建 SQL 語句。例如,Append 方法用于添加 SQL 片段、AddParameters 方法用于添加 SQL 參數(shù)、ExecuteSqlQuery 方法用于執(zhí)行查詢語句等。
Attributes 模塊
Attributes 模塊包含了 SqlSugar 中定義的特性,其中最常用的是 SugarColumn 特性,用于定義數(shù)據(jù)表和實(shí)體類之間的映射關(guān)系。此外,還有 SugarTable、SugarDatabase、SugarFunction 和 SugarParameter 等多個特性,可以用于定義數(shù)據(jù)表、數(shù)據(jù)庫、函數(shù)和參數(shù)等信息。在 Attributes 模塊中,SqlSugar 使用反射機(jī)制獲取對象的屬性信息,并根據(jù)特性信息進(jìn)行處理。同時,SqlSugar 還充分利用了 C# 中的特性繼承性,使得開發(fā)人員可以方便地對實(shí)體類中的屬性進(jìn)行分類管理和定義。
SqlSugar 的實(shí)現(xiàn)原理主要有以下幾個方面:
1. 利用反射機(jī)制獲取實(shí)體類的屬性信息,并根據(jù)這些信息動態(tài)生成 SQL 語句。
2. 使用 C# 中的委托機(jī)制,消除了開發(fā)人員需要手寫 SQL 語句的繁瑣操作。
3. 通過使用連接字符串,實(shí)現(xiàn)了與多種類型的數(shù)據(jù)庫連接,使得開發(fā)人員可以輕松地切換數(shù)據(jù)庫類型。
4. 使用緩存技術(shù),可以大大提高數(shù)據(jù)訪問的效率。SqlSugar 內(nèi)部采用了一種 “三級緩存” 的方式,將實(shí)體類數(shù)據(jù)緩存在內(nèi)存中,使得在頻繁查詢數(shù)據(jù)時,能夠快速地返回結(jié)果。
SqlSugar 可以與各種對象進(jìn)行關(guān)聯(lián)映射,使得開發(fā)者能夠更加方便地操作數(shù)據(jù)庫。
以下是 SqlSugar 的初級用法:
創(chuàng)建實(shí)體類
使用 SqlSugar 前需要先創(chuàng)建實(shí)體類,并在實(shí)體類中定義與數(shù)據(jù)表中字段相對應(yīng)的屬性,例如:
[SugarTable("Student")]
public class Student
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, Nullable = false)]
public string Name { get; set; }
[SugarColumn(ColumnName = "ClassId")]
public int? Class { get; set; }
}
以上代碼定義了一個名為 “Student” 的實(shí)體類,其中 “SugarTable” 特性指定了數(shù)據(jù)表的名稱,而 “SugarColumn” 特性則針對每一個屬性進(jìn)行了映射,包括列名、數(shù)據(jù)類型、長度、是否允許為空等。
創(chuàng)建數(shù)據(jù)庫連接
在使用 SqlSugar 進(jìn)行操作前,需要先創(chuàng)建數(shù)據(jù)庫連接,例如:
SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "server=localhost;database=MyDatabase;uid=root;pwd=123456",
DbType = DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
以上代碼中,使用 ConnectionConfig 指定了數(shù)據(jù)庫連接字符串、數(shù)據(jù)庫類型、是否自動關(guān)閉連接和主鍵類型等信息,創(chuàng)建 SqlSugarClient 后即可對數(shù)據(jù)庫進(jìn)行操作。
常用操作
SqlSugar 支持大多數(shù)常用的數(shù)據(jù)庫操作,例如查詢、新增、更新和刪除等。以下是一些簡單的示例:
查詢:
var students = Db.Queryable<Student>().ToList();
以上代碼中,使用 “Queryable” 方法獲取 “Student” 數(shù)據(jù)表的所有數(shù)據(jù),并將結(jié)果轉(zhuǎn)換為 List 類型。
新增:
var student = new Student()
{
Name = "binjie09",
Class = 1
};
Db.Insertable(student).ExecuteCommand();
以上代碼中,定義了一個名為 “student” 的新學(xué)生,并使用 “Insertable” 方法將其添加到 “Student” 數(shù)據(jù)表中。
更新:
Db.Updateable<Student>()
.SetColumns(s => new Student() { Name = "binjie09-update" })
.Where(s => s.Name == "binjie09")
.ExecuteCommand();
以上代碼中,使用 “Updateable” 方法對 “Student” 數(shù)據(jù)表進(jìn)行更新操作,將名稱為 “binjie09” 的學(xué)生的名稱改為 “binjie09-update”。
刪除:
Db.Deleteable<Student>().Where(s => s.Class == 1).ExecuteCommand();
以上代碼中,使用 “Deleteable” 方法對 “Student” 數(shù)據(jù)表進(jìn)行刪除操作,刪除班級為 1 的所有學(xué)生。
以上是 SqlSugar 的初級用法,可以幫助您快速入門并實(shí)現(xiàn)基本的數(shù)據(jù)庫操作。
以下是 SqlSugar 的一些高級用法:
多表查詢
使用 SqlSugar 可以輕松實(shí)現(xiàn)多表查詢,例如:
var queryable = Db.Queryable<Student, Class>((s, c) => new object[]
{
JoinType.Inner, s.ClassId == c.Id
}).Select((s, c) => new { s.Id, s.Name, ClassName = c.Name });
上述代碼中,“Student” 和 “Class” 兩個實(shí)體類進(jìn)行了內(nèi)連接,其中 “Student” 類中的 “ClassId” 屬性與 “Class” 類中的 “Id” 屬性相關(guān)聯(lián)。
Lambda 表達(dá)式
SqlSugar 支持Lambda表達(dá)式,可以更加方便地編寫查詢語句,例如:
var list = Db.Queryable<Student>().Where(s => s.Age > 18).ToList();
上述代碼中,使用 “Where” 方法對 “Student” 實(shí)體類進(jìn)行了篩選,只返回年齡大于18歲的學(xué)生信息?!癟oList()” 方法表示將篩選結(jié)果轉(zhuǎn)換成List類型。
存儲過程
SqlSugar 還支持調(diào)用存儲過程,例如:
var result = Db.Ado.UseStoredProcedure<dynamic>(() =>
{
var p1 = new SugarParameter("@Id", 1);
var p2 = new SugarParameter("@Name", "binjie09");
var p3 = new SugarParameter("@Age", 20);
return ("GetStudentInfo", new SugarParameter[] { p1, p2, p3 });
});
上述代碼中,使用 “UseStoredProcedure” 方法調(diào)用名為 “GetStudentInfo” 的存儲過程,并傳遞三個參數(shù)。返回結(jié)果為動態(tài)類型。
事務(wù)處理
SqlSugar 提供了事務(wù)處理功能,可以保證多次數(shù)據(jù)庫操作的原子性,例如:
try
{
Db.Ado.BeginTran();
//...
Db.Ado.CommitTran();
}
catch (Exception ex)
{
Db.Ado.RollbackTran();
}
上述代碼中,使用 “BeginTran” 方法開啟一個事務(wù),在try語句塊中進(jìn)行多個數(shù)據(jù)庫操作,在發(fā)生異常時使用 “RollbackTran” 方法回滾事務(wù),否則使用 “CommitTran” 方法提交事務(wù)。
以上是 SqlSugar 的一些高級用法,可以根據(jù)具體的需求來選擇使用。
官方教程:https://www.donet5.com/Home/Doc。