前言

新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力。

新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马。

作者认为新人应该先打好基础,不要直接学习框架,例如先掌握 SQL 再使用 EFCore 框架。

作者只传授数年内不会变化的知识,让新手学习快速进入跑道受益终身。

分享使我快乐,请务必转发给同学,朋友,让大家都少走一些弯路!!


本文主要讲解关系型数据库的使用,学会常用的 SQL 语句,了解 SQL 注入,以及如何在 Asp.net core WebApi 中使用进行 CRUD 增删改查。

关系型数据库主流有的:mysql、postgresql、sqlserver、oracle 等等,为了方便学习本文主要以 SQLite 本地数据库以例,其他数据库的使用方法基本相似。


如何使用 SQLite 数据库

安装数据库管理工具:Navicat Permium

创建好数据库后,双击左侧 test.db 即可打开。

右击左侧 Tables -> New Table 创建新表。

每个表必须设置一个主键字段(唯一),编辑好字段,以及类型之后, ctrl + s 保存表。

点击如何按钮创建 SQL 运行窗口:

输入 SELECT 'hello world' 执行:


SQL 运算符

  • 算术运算符:+ - * / %
  • 比较运算符:= != <> > < >= <=
  • 逻辑运算符:AND OR

SQL Insert 语句

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN)

自增列不需要指定插入,如上面创建好的表 table01:

INSERT INTO table01 (name)
VALUES ('name01'); SELECT last_insert_rowid();

SELECT last_insert_rowid() 返回插入的 id 值。

批量插入:

INSERT INTO table01 (name)
VALUES ('name01'), ('name02'), ('name03')

使用一个表来填充另一个表:

INSERT INTO table01 (column1, column2, ... columnN)
SELECT column1, column2, ...columnN
FROM table02
[WHERE condition]

SQL Select 语句的基本语法如下:

SELECT column1, column2, columnN FROM table_name

在这里,column1, column2...是表的字段,他们的值即是您要获取的。如果您想获取所有可用的字段,那么可以使用下面的语法:

SELECT * FROM table_name

排序:

SELECT * FROM table_name ORDER BY column_1, column_2 DESC

返回前 10 条记录:

SELECT * FROM table_name LIMIT 10

返回第 10-20 条记录:

SELECT * FROM table_name LIMIT 10 OFFSET 10

SQL Where 子句

WHERE 子句用于指定从一个表或多个表中获取数据的条件。如果满足给定的条件,即为真(true)时,则从表中返回特定的值。您可以使用 WHERE 子句来过滤记录,只获取需要的记录。

WHERE 子句不仅可用在 SELECT 语句中,它也可用在 UPDATE、DELETE 语句中。

SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;

SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;

SELECT * FROM COMPANY WHERE AGE IS NULL;

SELECT * FROM COMPANY WHERE AGE IS NOT NULL;

SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';

SELECT * FROM COMPANY WHERE AGE IN (25, 27);

SELECT * FROM COMPANY WHERE AGE NOT IN (25, 27);

SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;

SELECT AGE FROM COMPANY WHERE EXISTS(SELECT AGE FROM COMPANY WHERE SALARY > 65000);

SELECT * FROM COMPANY WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000 LIMIT 1);

GROUP BY 子句用于与 SELECT 语句一起使用,来对相同的数据进行分组。在 SELECT 语句中,GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 子句之前。

ID          NAME        AGE         ADDRESS     SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
8 Paul 24 Houston 20000.0
9 James 44 Norway 5000.0
10 James 45 Texas 5000.0
SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME

产生以下结果:

NAME        SUM(SALARY)
---------- -----------
Allen 15000
David 85000
James 20000
Kim 45000
Mark 65000
Paul 40000
Teddy 20000

HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果。WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。

SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY name HAVING count(name) > 2

产生以下结果:

NAME        SUM(SALARY)
---------- -----------
James 20000

DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。

SELECT DISTINCT name FROM COMPANY

产生以下结果:

NAME
----------
Paul
Allen
Teddy
Mark
David
Kim
James

SQL Join 语句

Join 子句用于结合两个或多个数据库中表的记录,比如常用的 LEFT JOIN、INNER JOIN、RIGHT JOIN

SELECT a.*, b.* FROM table01 a
INNER JOIN table02 b ON b.id = a.id
WHERE a.id > 0

SQL Update 语句

UPDATE COMPANY SET ADDRESS = 'Texas', SALARY = 20000.00 WHERE ID = 6;

SQL Delete 语句

DELETE FROM COMPANY WHERE ID = 7;

在 Asp.net core WebApi 中使用 SQLite

需要了解 ado.net 几大对象,任何数据库都必须实现它们:

  • DbConnection:数据库连接对象
  • DbCommand:数据库SQL命令对象
  • DbParameter:SQL命令参数对象

在我们上一篇文章的项目里安装 sqlite ado.net 类库:

编写 Insert_table01、Select_table01 两个 HTTP 接口代码:

[HttpPost("Insert_table01")]
public int Insert(string name)
{
using (var conn = new SqliteConnection("data source=d:/code/test01.db"))
{
conn.Open();
var cmd = conn.CreateCommand();
//cmd.CommandText = $"insert into table01(name) values('{name}'); select last_insert_rowid();";
//注意:上面 SQL 注入漏洞,解决办法使用 SQL 参数化对象
cmd.CommandText = $"insert into table01(name) values(@name); select last_insert_rowid();";
cmd.Parameters.AddWithValue("@name", name);
var id = int.Parse(cmd.ExecuteScalar().ToString());
return id;
}
} [HttpPost("Select_table01")]
public List<object> Select()
{
var list = new List<object>();
using (var conn = new SqliteConnection("data source=d:/code/test01.db"))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = $"select * from table01";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(new { id = reader.GetInt32(0), name = reader.GetString(1) });
}
}
}
return list;
}

实际项目中,大可不必使用上述代码,但是必须要了解他们,DbCommand 常用的执行命令方法:

  • ExecuteScalar 返回第一行第一列(一般用于 INSERT)
  • ExecuteReader 返回记录读取对象(一般用于 SELECT)
  • ExecuteNonQuery 返回执行SQL受影响的行(一般用于 UPDATE/DELETE)

使用 ORM 操作 SQLite 数据库

这里介绍作者的开源作者 FreeSql,它是一个支持 .NETFramework 4.0+ 之后所有 dotnet 版本的 ORM(包括 .net core),支持十几种数据库。

这里为什么要介绍 FreeSql,出于私心,也出于爱心,虽然 EFCore 官方 ORM 好用,但还是会有部分人吐槽,主要原因:

  • 版本更新节凑太快,前后不兼容问题
  • 只对自家 sqlserver 支持比较友好,社区 mysql、postgresql 也支持得不错
  • 对国产数据库支持不友好

作者在写本系列的一个愿望,是希望新手少走弯路直通罗马,这是出于爱心。作者不反对学习 EFCore,如果有条件等有了一些基础再学习更好。


使用 FreeSql 需要先安装对应的 nuget 包,因为我们操作的是 Sqlite 数据库,所以只需要安装 FreeSql.Provider.Sqlite :

在 Program.cs 中以 单例注入 IFreeSql 对象:

using FreeSql;
using FreeSql.Internal;
using System.Diagnostics; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers();
builder.Services.AddSwaggerGen();
builder.Services.AddSingleton(provider =>
{
var fsql = new FreeSqlBuilder()
.UseConnectionString(DataType.Sqlite, "data source=d:/code/test01.db")
.UseNameConvert(NameConvertType.ToLower) //实体类 -> 表(小写)
.UseNoneCommandParameter(true)
.UseAutoSyncStructure(true) //CRUD 时自动创建表
.UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText + "\r\n"))
.Build();
return fsql;
}); var app = builder.Build();

编辑实体体 Table02:

using FreeSql.DataAnnotations;

public class Table02
{
[Column(IsPrimary = true, IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
}

编写 Insert_table02、Select_table02 两个 HTTP 接口代码:

readonly IFreeSql _fsql;
public WeatherForecastController(IFreeSql fsql)
{
_fsql = fsql;
} [HttpPost("Insert_table02")]
public long Insert2(string name)
{
var id = _fsql.Insert(new Table02 { Name = name }).ExecuteIdentity();
return id;
} [HttpPost("Select_table02")]
public List<Table02> Select2()
{
return _fsql.Select<Table02>().ToList();
}

F5 运行使用 Swagger 测试效果如下:

观察控制台输出内容,实体类(Table02)与 表(table02)映射,FreeSql 会自动帮我们创建表:

分别添加 name01、name02、name03 后,查询 Select_table02 接口:


毕业题目

1、HTML 前端输入用户和密码,提交给 WebApi 服务端接口验证,反馈信息:用户不存在、密码不正确、用户和密码都正确。

2、HTML 前端输入注册信息(用户名、密码、姓名、生日),提交给 WebApi 服务端接口创建用户,返回信息:用户名格式不合法、用户名已被注册、密码格式不合法,生日格式不合法,注册成功。

3、HTML 前端输入发表文章信息(标题、正文,发表时间),提交给 WebApi 服务端接口发表文章,返回信息:标题太长,发表成功。

4、HTML 前端采用 AJAX 请求 WebApi 服务端接口,查询文章(标题、发表用户,发表时间)列表,按发表时间排序。

5、HTML 前端采用 AJAX 请求 WebApi 服务端接口,查询文章详细信息(标题、正文、发表用户,发表时间),显示正文。


系列文章导航

原创保护,转载请注明出处:https://www.cnblogs.com/FreeSql/p/16782488.html

Asp.net core 少走弯路系列教程(八)数据库 CRUD 增删改查学习的更多相关文章

  1. cocos2d-x-lua基础系列教程六(lua-table增删改查)

    lua-table库 1.插入 table.insert () --假设没有设定位置.默认last位置 样例: myTable = { 1, 2, 3 } myTable.insert(myTable ...

  2. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

  4. 国产化之路-统信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 达梦DM8实现简单增删改查操作

    专题目录 国产化之路-统信UOS操作系统安装 国产化之路-国产操作系统安装.net core 3.1 sdk 国产化之路-安装WEB服务器 国产化之路-安装达梦DM8数据库 国产化之路-统信UOS + ...

  5. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

  6. shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)

    shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查) Shell脚本与MySQL数据库交互(增删改查) # 环境准备:安装mariadb 数据库 [ro ...

  7. 学习ASP.NET Core Blazor编程系列十八——文件上传(中)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  8. abp(net core)+easyui+efcore仓储系统——展现层实现增删改查之控制器(六)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...

  9. SQLite 入门教程(四)增删改查,有讲究

    增删改查操作,其中增删改操作被称为数据操作语言 DML,相对来说简单一点. 查操作相对来说复杂一点,涉及到很多子句,所以这篇先讲增删改操作,以例子为主,后面再讲查操作. 一.插入数据 INSERT I ...

  10. 009杰信-创建购销合同Excel报表系列-2-建立购销合同(增删改查)

    前面一篇文章已经分析好了数据库的表,这篇文章针对购销合同表做一个增删改查. 和之前的表的增删该查类似. 项目结构如下:

随机推荐

  1. @所有Mac用户 刺客信条系列登陆Mac平台!

    [历史性的跨越] 在无数Mac游戏爱好者的热切期盼中,终于将风靡全球的3A级巨作--刺客信条系列,成功移植至MacOS系统!这意味着,无论是穿梭于中世纪欧洲的隐秘巷弄,还是翱翔于维多利亚时代的伦敦天际 ...

  2. xcode 12.3 mac m1

  3. idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法

  4. MySQL - [17] Oracle、SQLServer、MySQL数据类型对比

    题记部分 一.数据类型对比 对应关系 (1)整数类型 Oracle的NUMBER(*,0) 对应 SQL Server的INT 和 MySQL的INT Oracle的BIGINT 可能需要映射到SQL ...

  5. FineReport - [01] 概述

    Gartner报表平台全球市场唯一入选国产软件! 一.FineReport 是什么?有什么用途? FineReport 是一款企业级Web报表工具,由帆软自主研发,秉持零编码的理念,易学易用且功能强大 ...

  6. MongoDB 8.0这个新功能碉堡了,比商业数据库还牛

    MongoDB 8.0这个新功能碉堡了,比商业数据库还牛 引言 MongoDB 8.0已经推出有一段时间了,相比之前的版本推出的新功能,8.0版本的新功能集中在提升性能和可维护性上面,可以说是目前性能 ...

  7. php获取类名

    <?php class ParentClass { public static function getClassName() { return __CLASS__; } } class Chi ...

  8. C语言 链表操作

    #include<stdio.h>#include<stdlib.h>struct node{    int data;    struct node *next;};int ...

  9. 使用Istio灰度发布

    目录 灰度发布 1. Istio 1.1 Istio介绍 1.2 Istio是如何工作的 2. 安装Istio 2.1 环境 2.2 得到二进制文件 2.3 安装istio 3. 部署bookinfo ...

  10. python初学习一

    #1.切片操作 左闭右开 s='Hello word' print(s[0:5]) #2.更新字符串 s1='hello word' s2='python' print(s1[0:6]+s2) #3. ...