SqlSugar入门级教程+实例 (.net core下的)

2023-05-16

官方参考:http://www.codeisbug.com/Doc/8

前言:这应该是目前最好用的ORM框架之一了,而且支持.net core,网上除了官方文档其他参考就少了点,自己整理了一下,大致包括:

         · 概念

         ·  一个小demo(会涉及到T4模板生成Model)

         · 常见用法(增删改查)

数据库是sqlserver2012,vs2017版本的,其他还有什么想到再补充。

 

 

一:概念

1.优势

支持.NET 4.0+ 和 .NET CORE

支持主流数据库:SQL Server,MySql,Oracle,Sqlite等;

 

2.安装

Nuget直接搜索

项目是Core安装sqlSugarCore版本,.Net安装sqlSugar。

 

3.连接

通过参数ConnnectionConfig创建连接,ConnectionConfig有6个属性:

1. ConnectionString: 连接字符串 (必填)

2. Data Type: 数据库类型 (必填)

3. IsAutoCloseConnection: 是否自动释放数据库,默认false

4. InitKeyType: 读取主键和自增列信息的方式,默认SystemTable

5. More Settings: 全局设置

6. ConfigureExternalServices: 可以扩展你想要的序列化方式和缓存方式等服务

 

例:

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()

{

ConnectionString = Config.ConnectionString,

  DbType = DbType.SqlServer,         

  IsAutoCloseConnection = true,       

  InitKeyType = InitKeyType.SystemTable  

});

 

不过后面的版本有变动,以下是4.6.1版本的:

 

SqlSugar对象不能是静态变量,但可以是静态属性。

例:

Public static SqlSugarClient Instance

{

get => new SqlSugarClient(xx);
]

Var db = 类.Instance;

db.Queryable<T>().ToList;

 

 

二:项目实例

1:新建项目:.net core

我选择空模板,其他的也行,建议MVC

 

2.添加两个类库(我习惯分层写,也可以不分层)

一定是添加不要在上面新建

 

 

3.在ORM层安装sqlSugar,.net选第一个就好了

 

4.使用T4模板生成Model

a.先在sql server中建好表,数据库名:SqlSugarDemo

[表Student]:

 

b.右键项目->添加文本模板,名字随便起,后缀tt

 

c.写好tt模板保存一下就会刷新出model,Teacher和Course表先不用管

(tt模板里的内容自行百度,我照搬公司的就不贴了,其实都差不多,SqlSugarBase.cs是下一步建的,我截图晚了)

 

5.在ORM层新建SqlSugarBase类,用来提供DB访问对象,代码可以参考官方文档:(代码已修正,本页最底下


using SqlSugar;

namespace SqlSugarDemo.ORM
{
    public class SqlSugarBase
    {
        public static string DB_ConnectionString { get; set; }
  
        public static SqlSugarClient DB
        {
            get => new SqlSugarClient(new ConnectionConfig()
            {
                    ConnectionString = DB_ConnectionString,
                    DbType = DbType.SqlServer,
                    IsAutoCloseConnection = true,
                    InitKeyType = InitKeyType.SystemTable,
                    IsShardSameThread = true
                }
            );           
        }
    }
}  

SqlSugarBase

 

6.配置Startup.cs和appsettings.json,跟我一样建空模板的要在Web层(API)手动添加:(代码已修正,本页最底下


using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using SqlSugarDemo.ORM;

namespace SqlSugarDemo
{
    public class Startup
    {
        readonly private IConfiguration _Configuration;
        public Startup(IConfiguration configuration)
        {
            this._Configuration = configuration;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            SqlSugarBase.DB_ConnectionString = this._Configuration.GetConnectionString("connectionString");   //为数据库连接字符串赋值

        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

                routes.MapRoute(
                    name: "default1",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

        }


        //public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        //{
        //    if (env.IsDevelopment())
        //    {
        //        app.UseDeveloperExceptionPage();
        //    }

        //    app.Run(async (context) =>
        //    {
        //        await context.Response.WriteAsync("Hello World!");
        //    });
        //}
    }
}  

startup.cs

以上代码有参考:https://www.cnblogs.com/kuangliwen/p/7895646.html


  "connectionString": "Server=127.0.0.1;Database=SqlSugarDemo;Integrated Security=False;User ID=sa;Password=sa;",
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  }
}  

appsettings.json

 

7.添加逻辑代码和控制类(可以不分开写)

在Service层右键添加HomeService.cs


using SqlSugarDemo.ORM;
using SqlSugarDemo.ORM.Entity;
using System.Collections.Generic;

namespace SqlSugarDemo.Service
{
    public class HomeService : SqlSugarBase
    {
        public List<Student> GetList()
        {
            return DB.Queryable<Student>().ToList();
        }
    }
}  

HomeService.cs

DB.Queryable<Student>().ToList();   相当于select * from Student

 

在Web层右键添加HomeController.cs(代码已修正,本页最底下


using Microsoft.AspNetCore.Mvc;
using SqlSugarDemo.Service;

namespace SqlSugarDemo.API
{
    public class HomeController : Controller
    {
        readonly HomeService _HomeService;
        public HomeController(HomeService homeService)
        {
            _HomeService = homeService;
        }

        [HttpGet]
        public IActionResult Index()
        {
            var result =   _HomeService.GetList();
            ViewBag.Result = result;
            return View();
        }
    }
}  

HomeController.cs

 

8.最后别忘了添加Index页面

最终项目结构:

我觉得这个项目结构不是很好,随意看看

 编译通过,运行我报500的错误(惨兮兮),原因还在找,可能第6步有点问题,所以不能验证结果,反正过程大致是这么个过程。

//0810更新:数据库连接有问题,稍后修改

//0813更新:全部代码已修改完毕,详见底部

 

 

三:SqlSugar常用方法总结

先上之前的三张表:

[Student]

[Teacher]

[Course]

很简单的三张表,Id都是主键自增,其中Student.CourseId = Course.Code = Teacher.CourseId

 

 【查询】

1. 查询所有


var result = DB.Queryable<Student>().ToList();  

相当于 :

select * from Student;

 

2. 跟据主键查询:id为方法参数


var result =  DB.Queryable<Student>().InSingle(id);  

相当于 :

select * from Student where Id = id;

 

3. 根据给定的字段查询:name为方法参数


var result = DB.Queryable<Student>().Where(s => s.Name == name);  

相当于:

select * from Student where Name = name;

 

4. 模糊查询:方法参数key为关键字


var result = DB.Queryable<Student>().Where(s => s.Name.Contains(key)).ToList();  

相当于:

select * from Student where Name  like ‘%key%’;

 

5. 双表查询


var result = DB.Queryable<Student, Teacher>((a, b) => new object[] {
             JoinType.Left,a.CourseId==b.CourseId})
             .Select((a, b) => new { Student = a.Name, Teacher = b.Name }).ToList();  

以上将结果返回匿名对象,要是返回实体对象,第三行new 一个model就行了。

相当于:

select Student.Name student,Teacher.Name teacher

from Student

left join Teacher

on Student.CourseId = Teacher.CourseId;

 

6. 三表查询,根据给定id查询学生姓名,老师和课程名称


var result = DB.Queryable<Student, Teacher, Course>((a, b, c) => new object[] {
                        JoinType.Left,a.CourseId == b.CourseId,
                        JoinType.Left,b.CourseId == c.Code
                    })
                    .Where(a => a.Id == id)
                    .Select((a, b, c) => new  { Student = a.Name, Teacher = b.Name,Course = c.name }).ToList();  

以上同样返回匿名对象

相当于:

select Student.Name student,Teacher.Name teacher,Course.name course  

from Student

left join Teacher

on Student.CourseId = Teacher.CourseId

left join Course

on Course.Code = Teacher.CourseId

where Student.Id = id;

 

7. 分页,以第四条为例,方法参数pageIndex为页数,pageSize为条数


var result = DB.Queryable<Student>().Where(s => s.Name.Contains(key)).ToPageList(pageIndex, pageSize).ToList();  

 

 

【删除】

1. 根据主键删除,id为方法参数


var result = DB.Deleteable<Student>().In(id).ExecuteCommand();  

相当于:

Delete from Student where Id = id;

 

2. 根据主键批量删除,ids为方法参数


var result = DB.Deleteable<Student>().In(ids).ExecuteCommand();  

 

3. 根据给定字段删除,name为方法参数


var result = DB.Deleteable<Student>().Where(s => s.Name == name).ExecuteCommand();  

相当于:

Delete from Student where Name = name;

 

4. 批量删除,key为关键字


var result = DB.Deleteable<Student>().Where(s => s.Name.Contains(key)).ExecuteCommand();  

相当于:

Delete from Student where Name like’%a%’;

 

 【添加】

以向表Student添加数据为例:

 

 


public bool Insert()
        {
            Student model = new Student();
            model.StuId = 8;
            model.Name = "abc";
            model.CourseId = 2;
            var test = DB.Insertable(model).ExecuteCommand();
            return test > 0;
        }  

ps:关键就是:DB.Insertable(model).ExecuteCommand()   这一句。

<StudentModel>不一定要写,可以使用匿名对象;

model赋值也可以放到添加方法里,比如:

var test = DB.Insertable(new StudentModel

{

Name = "abc",

//这里想要添加几个字段就写几个

}).ExecuteCommand()

 

【更新】

跟添加类似,DB.Insertable(model).ExecuteCommand()  改为  DB.Updateable(model).ExecuteCommand();

 

 



 

代码修改:

Startup.cs:


public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }

        public void ConfigureServices (IServiceCollection services)
        {
            services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseStaticFiles();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }  

SqlSuagrBase:(连接字符串本来应该在appsettings里的,这个示范不太好,不过作为小demo就不考虑那么多了)


public abstract class SqlSugarBase
    {
        public SqlSugarClient DB => GetInstance();

        SqlSugarClient GetInstance()
        {
            string connectionString = "Server=127.0.0.1;Database=SqlSugarDemo;Integrated Security=False;User ID=sa;Password=sa;";

            var db = new SqlSugarClient(
                new ConnectionConfig
                {
                    ConnectionString = connectionString,
                    DbType = DbType.SqlServer,
                    IsShardSameThread = true
                }
            );
            return db;
        }
    }  

Home Controller:这里把Index删了,重新写了查询方法,View里面的Index也可以不用了。


 [HttpGet]
        public List<Student> GetList()
        {
            var result = _HomeService.GetList();
            return result;
        }
  

代码到这里就结束了,下面我添加了一个单元测试来测试这个方法(引用Xunit),测试通过。

代码我整理一下再贴上来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SqlSugar入门级教程+实例 (.net core下的) 的相关文章

  • 5. 事务隔离级别之Read Committed

    这篇我们学习事务隔离级别Read Committed xff0c 顾名思义 xff0c 就是读已提交 xff0c 一个事务只能看到其他并发的已提交事务所作的修改 很显然 xff0c 该级别可以解决Read Uncommitted中出现的 脏
  • 6. 事务隔离级别之Repeatable Read

    接下来我们学习Mysql默认的事务隔离级别Repeatable Read xff0c 顾名思义 xff0c 可重复读 xff0c 也即在一个事务范围内相同的查询会返回相同的数据 延续上面的栗子 xff1a 1 小明很开心自己考了69分 xf
  • 7.事务隔离级别之Serializable

    最后我们学习一下最高的事务隔离级别Serializable xff0c 顾名思义 xff0c 可串行化的 xff0c 也即并发事务串行执行 很显然 xff0c 该级别可以避免前面讲到的所有问题 xff1a 脏读 不可重复读 和 幻读 代价是
  • 6. 消息发送重试

    当连接失败 xff0c Celery会自动重试发送消息 xff0c 我们可以对重试行为进行设置 xff0c 譬如说多久重试一次 最大重试次数或者干脆不重试 xff01 当然这只是官方文档说的 xff0c 我在Windows上进行测试 xff
  • 1. RabbitMQ安装

    RabbitMQ作为消息队列 xff0c 在分布式系统中具有举足轻重的作用 xff0c 能够方便地解耦各个组件 xff1b OpenStack之所以具有高扩展性 xff0c RabbitMQ功不可没 虽然一直都在用 xff0c 但没有进行过
  • 1. Tornado实现聊天室

    Tornado的异步I O机制使其很适合处理长连接的场景 xff0c 在官方提供的Demo中就有一个简单的聊天室实现 xff0c 大致做法如下 xff1a 1 提供一个全局的消息缓存 2 每次获取新消息时 xff0c 如果缓存中没有新消息出
  • D435i运行VINS-mono以及Kalib标定

    D435i运行VINS mono以及Kalib标定 系统说明 xff1a Ubuntu 18 04 内核版本 xff1a 5 4 0 1 运行VINS mono 参考博客VINS xff08 D435i xff09 测试 问题 xff1a
  • ESP8266/ESP01 Server模式中TCP Client无法接收到数据

    硬件环境 xff1a ESP01 ESP8266 Windows7 xff0c 网络调试助手 xff0c 串口调试助手 先设置ESP8266的服务器模式 AT 43 CIPMUX 61 1 AT 43 CIPSERVER 61 1 8080
  • ROS报错:TF_OLD_DATA ignoring data from the past for frame leftwheel_link

    现象 xff1a rviz 中提示no transform from XX to odom 原因 xff1a lt param name 61 34 use sim time 34 value 61 34 true 34 gt 中use s
  • STM32-寄存器编程-使用寄存器点亮LED

    一 工程文件的建立 1 我们建立一个 工程模板 文件夹 xff0c 在它下面在新建4个文件夹 Listing存放编译器编译适合产生的C 汇编 链接的列表信息Project存放工程Output存放编译产生的调用信息 hex文件 预览信息 封装
  • VC 与VS的区别以及各个版本之间的对应关系

    各个版本之间的对应关系 使用windows平台搞开发时 xff0c 下载第三方库时经常会遇到文件名以VCxx版本号命令 xff0c VC版本如何转换成对应的VS的版本呢 xff0c 这里总结一下vc和vs的关系 Microsoft Visu
  • C/C++永不过时,不服来辩!

    序言 当你需要为你的项目放弃不同部分的时候 xff0c C 43 43 能帮你做到 当你需要不同抽象层次不同的性能要求时 xff0c C 43 43 能帮你做到 如果用别的语言 xff0c 你会发现那个语言只能做某几类的 而C 43 43
  • 标准c++库和stl库,boost库,qt库的总结(一)

    用了很长时间是stdio iostream 等头文件 xff0c 一直有个疑惑 xff0c 也用了很长一段是键的stl标准库中个别的类 xff0c 间接性的知道了boost库 xff0c qt库等一系列的库 昨天在有用到 include l
  • 激光雷达的结构和分类

    在蔚来ET7的发布会上 xff0c 李斌特别指出 xff0c ET7搭载了1550nm的激光雷达 小鹏P5搭载的两颗大疆览沃车规级激光雷达在ROI区域积分时间0 1秒下 xff0c 能等效144线 极狐阿尔法S HI版搭载的华为的车规版激光
  • STM32之串口通信之printf重定向

    当我们在学习一款CPU时 xff0c 最经典的实验莫过于流水灯了 xff0c 掌握流水灯的话就基本等于学会操作I O口了 xff0c 那么在学会I O之后 xff0c 相对于我们来说会把学习串口的操作放在第二位 在程序运行的时候我们可以点亮
  • 网络RTK——主辅站误差改正法(MAC)

    主辅站误差改正法的基本思想是 xff0c 首先 xff0c 将基准网内所有基准站的相位距离转换到公共整周未知数水平 xff0c 即整周模糊度被消除 其次 xff0c 计算各个误差改正项 xff0c 充分考虑误差的色散和非色散特性 xff0c
  • Centos7 thinkphp6 安装 swoole 小皮面板环境

    环境准备 xff1a centos 7 thinkphp6 nginx 小皮面板 本想着根据官方指引https www kancloud cn manual thinkphp6 0 1359700 完成安装 xff0c 结果中间波折挺多 x
  • 关于qt中加载gif图片,cpu占用过高的解决发办法

    1 将gif图拆分成若干张静态png图 xff1b 2 程序启动 xff0c QImage对象list中 xff1b 3 使用定时器或者多线程来控制label setPixmap加载的QImage对象 xff1b 关于gif显示快慢的问题
  • linux下命令行方式的音量控制

    输入命令 xff1a alsamixer xff1b 设置系统音量 xff0c 这个百分比会有一定的误差存在 amixer set Speaker 100 设置系统麦克风 amixer set Mic 100 c 43 43 代码可以执行运
  • Ubuntu检测ip有效性 且 修改系统ip

    正则表达式实现检测IP地址是否有效 bool UntilTool CheckIPAddrIsVaild string str regex check ip 34 25 0 5 2 0 4 0 9 1 0 9 0 9 1 9 0 9 1 9

随机推荐

  • clion同一个项目创建多个可执行文件

    简述需求 xff1a 需要写多个可执行文件 xff0c 但是文件一些工具类等都是通用的 xff0c 比较麻烦的就是创建多个项目 xff0c 下来让你一个项目中生成多个可执行文件 xff0c 用到那个编译那个就可以了 默认创建好项目后 xff
  • Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++(Windows)【真正的小白版】

    写在前面的前面 xff1a 这篇文章vscode和cpp插件版本有点老了 xff0c 仅供大家参考 xff0c 最新的和最详细的更新见我的另一篇文章 xff1a https blog csdn net bat67 article detai
  • linux服务端下的c++ udp socket demo

    linux服务端 udp socket demo 如下 xff1a 创建接受数据的socket int iSock 61 socket PF INET SOCK DGRAM 0 printf 34 socket ss d n 34 iSoc
  • ROS个别命令的使用 ros ros2

    ros1 录包 rosbag record a O filename bag 解释 xff1a a是把所有的包都进行录制 xff0c O表示后面需要跟输出的文件名字 xff0c o的话系统会自己添加录制日期为文件名上 xff1b rosba
  • 浅析 自动驾驶、遥控驾驶、平行驾驶区别

    以下内容仅为个人粗浅理解 xff0c 欢迎大家留言指正 图片内容来源于互联网 xff0c 图片权利归图片作者所有 xff0c 本文仅引用 自动驾驶 xff1a 重点在车端 xff0c 自动驾驶相关资源部署在车端 xff0c 或大部分算力等都
  • CNN图像分割简史:从R-CNN到Mask R-CNN(译)

    一直想总结一下CNN在图像分割中的发展脉络 xff08 主要是R CNN及其改进方法 xff09 xff0c 看到一篇不错的英文博文 A Brief History of CNNs in Image Segmentation From R
  • c: __FILE__, __LINE__

    这是编译器内置宏 xff0c 这些宏定义不仅可以帮助我们完成跨平台的源码编写 xff0c 灵活使用也可以巧妙地帮我们输出非常有用的调试信息 注意 xff0c 是双下划线 xff0c 而不是单下划线 FILE 包含当前程序文件名的字符串 LI
  • 当数组遇到mybatis in 的时候

    我想实现 多个id 传入sql 语句 的操作 1 我试着将数组 stringUtils join 数组 34 34 数组转string 并以逗号分隔 没成功 因为传到sql 里是 123 234 435 xff0c 而我们需要的是 123
  • jeesite中的ztree应用

    话不多说 xff0c 直接开始一二三 jeesite页面上通过以自定义jstl lt sys treeselect gt 方式引入树形选择 1 lt sys treeselect id 61 34 company 34 name 61 34
  • getByte()用法小结

    在Java中 xff0c String的getBytes 方法是得到一个操作系统默认的编码格式的字节数组 这个表示在不同情况下 xff0c 返回的东西不一样 xff01 String getBytes String decode 方法会根据
  • plsql 导出表和表数据

    导出数据表结构 打开pl sql客户端 Tools Export User Objects xff08 工具 导出用户对象 xff09 按图选择自己需要导出的表 xff0c 在选择导出文件位置 导出表数据 Tools Exports Tab
  • String的按值传递,java传参都是传值

    看完绝对清晰 java中对象作为参数传递给一个方法 xff0c 到底是值传递 xff0c 还是引用传递 xff1f pdd xff1a 所谓java只有按值传递 xff1a 基本类型 值传递 xff1b 引用类型 xff0c 地址值传递 x
  • Bili视频弹幕播放器后台源码

    介绍 此款播放器源码添加及修复了很多功能 xff0c 且所有源码均本地化 xff0c 不存在外链的情况 xff0c 测试环境 xff1a PHP7 0 43 MySQL5 6 播放器跨域远程下一集代码 xff1a 说明 xff1a 就是你的
  • 小程序与java的session问题

    一般web开发中 xff0c 我们需要通过session将数据用户重要数据存储到session中 xff0c 而由于html自带cookie xff0c 能够帮助我们存储从服务器端发送jsessionid到客户端浏览器 xff0c 客户端发
  • mac下java开发环境配置

    1 下载并安装jdk xff0c 配置环境变量 jdk1 8下载地址 xff1a http www oracle com technetwork java javase downloads jdk8 downloads 2133151 ht
  • 数组协变

    在某些情况下 xff0c 即使某个对象不是数组的基类型 xff0c 我们也可以把它赋值给数组元素 这种属性叫做协变 xff08 covariance xff09 在下面的情况下可以使用协变 xff1a 数组是引用类型数组 在赋值的对象类型和
  • 策略模式

    策略模式 由于最近在研究学习设计模式 xff0c 我会用自己的理解方式来表述对设计模式的学习和认识 xff0c 通过最常用 好记的案例来记住和使用设计模式 xff0c 希望对设计代码方面有所提高和改进 一 应用背景 在软件开发中常常遇到这种
  • Vs2010与VC的区别

    VS2010与VC 43 43 编译器的区别 xff1a 1 VS2010并不是针对C 43 43 的 xff0c C 43 43 只是它的一小部分 xff0c 它更加关注 net平台程序开发 xff08 主要是C VB xff0c C 4
  • 通过OAuth2.0方式弹出授权页面获得用户基本信息

    获取微信用户的个人的信息的时候 xff0c 要特别注意的是有两个不同的Access Token xff0c 他们产生的方式不一样 xff0c 一种是使用AppID和AppSecret获取的access token xff0c 一种是OAut
  • SqlSugar入门级教程+实例 (.net core下的)

    官方参考 xff1a http www codeisbug com Doc 8 前言 xff1a 这应该是目前最好用的ORM框架之一了 xff0c 而且支持 net core xff0c 网上除了官方文档其他参考就少了点 xff0c 自己整