SqlSugar入门级教程+实例 (.net core下的)
官方参考:http://www.codeisbug.com/Doc/8
前言:这应该是目前最好用的ORM框架之一了,而且支持.net core,网上除了官方文档其他参考就少了点,自己整理了一下,大致包括:
· 概念
· 一个小demo(会涉及到T4模板生成Model)
· 常见用法(增删改查)
数据库是sqlserver2012,vs2017版本的,其他还有什么想到再补充。
(2019-12-15更新:大半年没上博客今天看到邮件评论提醒上来看一下,当时没有想到这篇笔记会有那么多人看,我现在自己回看实在汗颜,写的啥玩意儿,尤其是配置那块,当时也是copy的项目代码,再后来因为离职也忘了更新代码,而现在我已经用不到sqlsugar了,不过也正因为如此,才更觉得sqlsugar好用,对于一些没有自己框架的小公司小项目其实是个不错的选择。年底我会抽空重新写个项目,这篇权且看看好了)
一:概念
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 = ;
model.Name = "abc";
model.CourseId = ;
var test = DB.Insertable(model).ExecuteCommand();
return test > ;
}
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),测试通过。
代码我整理一下再贴上来。
SqlSugar入门级教程+实例 (.net core下的)的更多相关文章
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道
ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道 语雀: https://www.yuque.com/yuejiangliu/dotnet/ ...
- .NET Core下使用gRpc公开服务(SSL/TLS)
一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇 ...
- Selenium 2.0 WebDriver 自动化测试 使用教程 实例教程 API快速参考
Selenium 2.0 WebDriver 自动化测试 使用教程 实例教程 API快速参考 //System.setProperty("webdriver.firefox.bin" ...
- Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类
本文目录 1. 前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...
- BDD实战篇 - 在.NET Core下安装Specflow
这是<如何用ABP框架快速完成项目 >系列中的一篇文章. BDD很赞!比TDD先进很多,能够大大提高编码效率. 让我们动手起来吧!先在.NET Core下安装Specflow! 官网教程在 ...
- freemarker语法介绍及其入门教程实例
# freemarker语法介绍及其入门教程实例 # ## FreeMarker标签使用 #####一.FreeMarker模板文件主要有4个部分组成</br>#### 1.文本,直接输 ...
- Kivy 中文教程 实例入门 简易画板 (Simple Paint App):3. 随机颜色及清除按钮
1. 随机颜色 通过前面的教程,咪博士已经带大家实现了画板的绘图功能.但是,现在画板只能画出黄色的图案,还十分单调,接下来咪博士就教大家,如何使用随机颜色,让画板变得五彩斑斓. 改进后的代码如下: f ...
- Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖
ylbtech-Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖 1.返回顶部 1. Java 实例 - 方法覆盖 Java 实例 前面章节中我们已经学习了 Jav ...
- Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un
ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法 Java 实例 汉诺塔(又称河内塔)问题是源 ...
随机推荐
- 带你彻底理解RSA算法原理,很简单的
1. 什么是RSA RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法. 在了解RSA算法之前,先熟悉下几个术语 根据密钥的使用方法,可以将密码分为 对称密码 和 公钥密码 对称 ...
- CodeForces祝贺上紫
还是靠手速了. 不少比赛,经常差几分钟/一个细节就能AC一道比较难的题目. 加油! P.S 只能当成休闲性质,不能再当成正业了.迈向科研...
- 使用vue-cli脚手架和vue-router搭建项目(一)
之前做的项目一直比较简单,并没有引入整个路由库.今天准备练习下
- 使用CGIHTTPServer搭建简单网站
目录 一.前提准备 二.搭建web网站 如何快速搭建web网站?这个问题对于我这样的小白来说简直就是一脸懵逼毫无头绪.在学习python的过程接触到了 CGI 编程,至于CGI是什么?怎么运行的?这我 ...
- NOI2019赛前两周被吊打记录
7.1 T1看了半天发现会个暴力FWT,然后突然返发现随便容斥一下就好了 T2猜了个只有13和23的,结果打个表发现伪了,然后标号不只一种连搜索都写错了,也没想过可以轮廓线dp,菜哭了o(╥﹏╥)o ...
- electron-vue中关闭烦人的es语法检查
本项目环境是 electron-vue搭建的项目,项目结构根vue-cli创建的项目结构稍微有所不同 主要修改的地方有3个 把这3个文件里面的以下代码全部删掉 { test: /\.(js)$/, e ...
- delphi mysql
Delphi2006连接Mysql5.1 2.DBExpress+dbxopenmysql50.dll可能很多人会奇怪,dbxopenmysql50.dll是什么东东?DBExpress不就是数据库连 ...
- Lua的控制流程
一.条件语句 if语句 if语句是由一个布尔表达式作为条件判断,或者紧跟其他语句组成. if else语句 if语句可以是else搭配使用,在if条件表达式为false时执行else语句代码 if嵌套 ...
- idea从零搭建简单的springboot+Mybatis
需用到的sql /* Navicat MySQL Data Transfer Source Server : localhost root Source Server Version : 80012 ...
- STM32F427VI 电流