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