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。