后端-Node系列四:Mysql数据库

154 阅读9分钟

菜鸟编程 - mysql数据库教程

1:cors、jsonp、如何跨域

1.1:接口的跨域问题

//------------------------------ 接口的跨域问题 ------------------------------------
我们通过在浏览器打开页面, 属于本地file协议, 而我们请求的接口是HTTP协议, 请求协议不同,所以就是跨域
而jsonp只能处理get方式的跨域, 不能处理post的, 唯一的方式就是cors方式

CORS

1.2: 使用cors中间件解决跨域问题

//--------------------------------- 使用cors插件解决跨域问题 ------------------------------------
1: 安装插件
2: 在接口页面中,导入插件, 全局挂载插件
3:重启服务器: nodemon ./15使用express写接口.js
【此时点击,就能成功返回数据, 因为每个请求中的data对携带了一个数据对象,成功访问数据后,在控制台中打印数据】

1.3: 了解cors的概念以及注意事项

cors原理就是在服务器端设置了响应头,他有兼容性问题,详情见图

1.4:了解Access-Control-Allow-Origin的作用

res.setHeader('Access-Control-Allow-Origin允许谁访问', 'http://xxxxx.cn允许这个访问')

1.5:了解Access-Control-Allow-Headers的作用

//-------------------- 了解Access-Control-Allow-Headers的作用 -----------------------------
cors支持9个请求头,,如果客户端向服务器发送了额外的请求头信息, 则需要在服务器端,通过Access-Control-Allow-Headers 对额外的请求头进行声明, 否则这次骑牛就会失败
res.setHeader('Access-Control-Allow-Header', 'Content-Type', 'x-Custom-Header') 多个请求头之间需要用逗号隔开

1.6:了解Access-Control-Allow-Methods的作用

响应头部,默认只支持3种: get, post, head
只允许支持4种请求的写法: res.setHeader('Acess-Control-Allow-Methods', 'POST, GET, DELETE, HEAD')
如果允许所有, 就直接: res.setHeader('Access-Control-Allow-Mthods', '*')允许所有的http请求方法

1.7:简单请求的概念

请求分为2大请求: 简单请求, 预检请求
请求方式为 get POST HEAD 三者之一
HTTP头信息不能超过图中所描述的

1.8: 预检请求的概念

预检请求就是get,post,head之外, 请求头中有自定义头部, 或服务器发送了application/json格式的数据, 

1.9:简单请求和预检请求的区别

//----------------------- 简单请求和预检请求的区别 --------------------------
发起delete请求,验证会触发options请求
1: 在html页面发起delete请求
2:在路由接口中定义一个delete接口
3:在服务器js中,引入路由接口, 开启服务器, 【15xx.js, nodemon 15.xx.js4:  页面点击delete删除, 能触发options请求, 和delete请求【chrome看不到,只有火狐看的到options请求】

2:jsonp

2.1:回顾jsonp的概念与特点

//------------------------- 回顾jsonp的概念与特点 ------------------------------
jsonp的接口就是通过浏览器的src睡醒,请求·服务器上的数据, 同时返回一个函数的调用, 这种请求就是jsonp, 他不是ajax请求, 因为没有使用XMLHTTPRequest这个对象。 它只支持get请求

2.2:使用express写jsonp接口

//---------------------------- 使用express写jsonp接口 -----------------------------
使用express写jsonp接口
1: 在页面点击发起请求:点击按钮,发起get请求, 请求方式为get, 请求地址, 和请求类型是jsonp, 成功返回数据后, 就将数据打印在浏览器控制台中
2:在服务器中定义接口:app.get请求方式(请求接口地址, ) 获取到查询参数的callback字符串, 携带数据, 将callback后面数据打印到控制台中
3: 火狐返回的数据:Object{name:'zs', age:22}
【总结其实,页面的是jquery的$.ajax发起的数据请求, 而服务器使用的是express的方式通过get请求, 将数据响应给控制台】
JSON.stringify将对象转换为json格式的字符串
【知道怎们使用express插件jsonp格式请求的接口, 怎么处理jsonp的数据就行了, 点击发起请求的是普的jquery中的$.ajax请求】

3:数据库

3.1:数据库的基本概念

//-------------------- 什么是数据库 ------------------------
存储管理数据, 增删改查

//-------------------- 常见的数据库及分类 ------------------------
我们我要学mysql数据库, 其次就是mongdb,
 communtiy 社区版免费版, enterprise企业收费版

3.2:了解传统型数据库的数据组织结构

//----------------------- 了解传统型数据库的数据组织结构 -------------------------------
数据库类似于表格软件
数据表类似与表格的工资表格
数据行类似于excel的每一行数据
字段类似于一列数据
每个字段电脑都有对应的数据类型

3.3: 实际开发中库、表、行、字段之间的关系

每个相对对应独立的数据库,不同数据存储在不同的表格中, 存储的信息由字段决定, 表中的行代表每一条具体的数据

3.4: 安装mysql

//------------------------- 了解需要安装哪些MySQL相关的软件 ----------------------------
mysql_server 管理数据和服务的软件, mysql workbench 可视化软件

//------------------------- 介绍在Mac下如何安装MySQL ----------------------------
具体查看Mac系统安装Mysql--> readme.md文件一步步按照截图安装即可

//------------------------- 演示如何在Windows10系统上安装MySQL ----------------------------
安装教程查看-->Windows系统安装教程-->README.md
或者跟视频一步步同步安装【可靠,推荐!】

//-------------------------  使用MySQL Workbench连接数据库 ----------------------------
打开MySQL Workbench -->点击MySQL Connections 登录用户

3.5: 了解MySQL Workbench主界面的组成部分

//------------------------- MySQL Workbench主界面的组成部分 -------------------------------
主界面组成部分-->菜单栏--> 工具栏---> 数据库列表---> 信息区域---> 代码编辑区域---> 输出区域
点击右侧隐藏--点击左侧切换到schema

4:使用可视化界面创建数据库、表、字段

4.1: 创建数据库

4.2: 创建数据表、字段等相关知识

//------------------------- 创建数据表、字段等相关知识 -------------------------------
创建实操流程:
1:创建表--> 2:表名称---> 3:列:字段名称-->4:字段的描述-->5创建表格-->6: Apply创建表格-->7:Apply创建表格 -->8:表格创建成功-->9:表格用户信息

DataType  数据类型
int 整数数值类型
varchar 字符串类型
tinyint 布尔值类型

字段复选框标识:
PK 唯一标识, 只能有一个
NN 必填不能为空
UQ 只能有一个, 一个数据库中不能有第二个
AI 值自动累加

4.3: 向表中写入数据

//------------------------- 向表中写入数据 -------------------------------
非常简单-->右键select --> 只需要填写username和password即可,点击Apply就会创建表格【会自动加上id和默认的状态值】

5:SQL语句操作Mysql数据库

5.1:SQL语句基本概念

//------------------------- 什么是SQL -------------------------------
SQL是一门查询语言, 以编程形式操作数据库里面的数据

//------------------------- SQL能够做什么以及哪些SQL常用语句 -------------------------------SQL语句实现增删改查
查询 select   插入 insert into   更新 update    删除 delete
4SQL语法
where条件,   and和or运算符,   order by 排序,   count()函数

5.2:SELECT查询语句

5.2.1:SELECT语句的语法格式

//------------------------- SELECT语句的语法格式 -------------------------------
select查询, 查询的结果存储在一个结果表中,称为结果集
SELECT 查询 FROM 来自那一个表的名称
5.2.2:SELECT语句的两种用法

//------------------------- SELECT语句的两种用法 -------------------------------
查询所有
select * from users

查询用户名和密码
select username,  password from users

5.3:INSERT INTO 插入一条数据

//------------------------- INSERT INTO 插入一条数据 -------------------------------
插入一条数据
插入新的数据 insert into  users表 (列名,列名 ) values 值是 ('xxxx', ''xxxx)
查询是否插入成功  select  * from users 查询所有数据, 数据插入成功

5.4:UPDATE修改单列

//------------------------- INSERT INTO 插入一条数据 -------------------------------
修改单列
update users修改这个表格中的 set password 设置密码 = 'xxx' where id=4条件是id为4的用户

修改多列
update users set password='admin123', status=1 where id=2

5.5:DELETE删除指定id的用户

//------------------------- DELETE删除指定id的用户 -------------------------------
delete from users where id=4  删除来自用户表中id为4的这个用户

5.6:WHERE循环方式查询

//------------------------- WHERE循环方式查询 -------------------------------
查询id > 2的用户
select * from users where id>2

查询id >= 2的用户
select * from users where id >=2

查询用户名不是ls的用户
select * from users where username <> 'ls'
select * from user where username != 'ls'

5.7:AND和OR运算符

and相当于 与 && 同时满足 , or 相当于 或者 || 满足其一即可

//------------------------- INSERT INTO 插入一条数据 -------------------------------
and相当于 与 && 同时满足
or 相当于 或者 ||  满足其一即可

查询状态为0, 并且 id < 3
select * from users where status=0 and id<3

查询状态为1, 或者 用户名为zs的用户
select * from users where status=1 or username='zs'

5.8:ORDER BY升序

//------------------------- ORDER BY升序 -------------------------------
order by 升序
select * from users order by status  状态从小到大

order by xx desc 降序 id从大到小
select * from users order by id desc

5.9:ORDER BY 多重排序

//------------------------- ORDER BY 多重排序 -------------------------------
多重排序
先状态从大到小desc, 后名称从小到大
select * from users order by status desc, username asc

5.9.1:COUNT函数查询总条数

//------------------------- COUNT函数查询总条数 -------------------------------
count 查询总条数
select count(*) from users where status=0
查询所有状态为0的用户, 会返回总条数 

5.9.2:AS关键字为列设置别名

//------------------------- AS关键字为列设置别名 -------------------------------
as 别名
将count(*) 改名为 total
select count(*) as total from users where status=0

将username和passwprd改为 uname 和 upwd
select count(*) as uname, password as upwd from users

5.9.3:如何保存和打开.sql的文件

//------------------------- 如何保存和打开.sql的文件 -------------------------------
1: 先保存, 2: 在找到文件,打开查看

6:安装mysql包,用js方式操作数据库

6.1:项目中操作MySQL数据库的3个步骤

//------------------------- 项目中操作MySQL数据库的3个步骤 -------------------------------
安装MySQL模块对数据操作
1;安装模块
2; 连接到数据库
3:调用mysql模块执行SQL语句

6.2:安装与配置mysql模块

//------------------------- 安装与配置mysql模块 -------------------------------
安装与使用mysql
1: 初始化包管理文件
2: 下载mysql包
3:导入包,创建基础的mysql数据库连接

6.3:测试连接Mysql是否成功

//------------------------- 测试连接Mysql是否成功 -------------------------------
测试连接是否成功
通过db.query测试数据库能否连接成功, err表示失败, results表示成功

6.4:使用SELECT语句查询数据

//----------------------- 使用SELECT语句查询数据 -------------------------------
查询数据库中的数据:
将查询语句,写在变量里面, 这样更简洁。
db.query(查询语句, (err, results) => {  })
查询的结果是一个数组,中包含多个对象

6.5: 使用INSERT INTO语句插入数据

//-----------------------  使用INSERT INTO语句插入数据 -------------------------------
向数据表中插入一条新数据
1: 定义要插入的数据 : const user = { username: 'Spider-woMan3', password: 'pcc135' }
2:定义要插入到哪个数据表中, 插入到谁 :const sqlStr = 'insert into users (username, password) values (?, ?)'
3:调用db.query将(数据表, [要插入的数据]): 插入成功,能返回一个数组
db.query(sqlStr, [user.username, user.password], (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('插入数据成功')
    }
})  通过打印results能接收到一个对象, 对象中有属性, affetcedRows=1,表示插入数据成功
打开数据库,查看多了一条数据

6.6: 说明id的唯一性

//-----------------------  说明id的唯一性 -------------------------------
id是直接3-->跳到了9, 因为之前的id虽然删除了, 但是它具有唯一标识,你也不能在用了

6.7: 插入数据的便捷方式

//-----------------------  插入数据的便捷方式 -------------------------------
添加数据
1: 数据格式不变: const user = { username: 'Spider-woMan6', password: 'pcc136' }
2:要插入到哪个位置: const sqlStr = 'insert into users set ?'
3:调用query方法将数据,插入到数据表中,并打印:
db.query(sqlStr, user, (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('插入数据成功')
    }
})

6.8:使用UPDATE语句更新数据

//----------------------- 使用UPDATE语句更新数据 -------------------------------
修改数据库中的数据
1:调用要插入的数据:const user = { id: 9, username: 'Spider-woMan99', password: 'pcc199' }
2:定义要插入数据表中的那个位置:const sqlStr = 'update users set username=?, password=? where id=?'
3:使用query实现数据修改:db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('数据更新成功')
    }
})
数据库中的数据修改成功

6.9:更新数据的便捷方式

//----------------------- 更新数据的便捷方式 -------------------------------
修改数据库中的数据,快捷方式
1:调用要插入的数据:const user = { id: 10, username: 'Spider-woMan10', password: 'pcc1010' }
2:定义要插入数据表中的那个位置:const sqlStr = 'update users set ? where id=?'
3:使用query实现数据修改:db.query(sqlStr, [user, user.id], (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('数据更新成功')
    }
})
数据库中的数据修改成功

6.9.1:DELETE语句删除数据

//----------------------- DELETE语句删除数据 -------------------------------
删除数据
1: 定义要删除数据表中的哪条数据: const sqlStr = 'delete from users where id=?'
2:调用query传入id,根据id将数据删除: db.query(sqlStr, 10, (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('数据删除成功')
    }
})
3: 数据库就少了这条数据

6.9.2: 如何实现标记删除

//----------------------- 如何实现标记删除 -------------------------------
伪删除, 做了标记而已,就是修改了status=1
1:直接调用query中的update方法去修改数据, 将个id的用户,状态改为1,表示删除
db.query('update users set status=1 where id=?', 3, (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('数据删除成功')
    }
})
数据库中的这个id的status就是1,表示已经删除了

下一篇:后端-Node系列五:session、JWT身份认证