学习SqlSugar ORM框架的关键:对其模块与实现原理的详细分析

开发 前端
Core 模块是 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。

责任编辑:姜华 来源: 今日头条
相关推荐

2009-03-24 08:30:54

AndroidGoogle移动os

2009-03-24 09:17:58

驱动GSMAndroid

2009-06-18 14:00:51

2009-11-11 17:02:36

Visual Stud

2010-04-26 18:17:19

Oracle存储过程

2009-12-03 17:41:40

PHP应用发展

2021-10-25 19:52:52

IntentFilte

2009-09-25 14:23:39

2009-09-28 10:39:01

Hibernate基础

2010-08-09 13:15:05

DB2 Capture

2009-11-25 17:05:56

PHP5对象simpl

2009-11-11 14:18:00

动态路由协议

2009-12-18 10:39:50

路由器关键技术

2010-01-06 16:12:52

分析Json stri

2010-04-26 14:32:21

Oracle SQL

2010-04-12 10:53:07

Oracle SQL

2010-03-08 17:18:46

Linux du命令

2010-07-02 11:19:31

IP协议头格式

2009-09-14 16:21:34

LINQ To XML

2009-09-09 09:48:43

Linq延迟加载
点赞
收藏

51CTO技术栈公众号