带你入坑Nodejs(终篇)

1,477 阅读9分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

nodejs写到终篇了,首先感谢大家这段时间的支持这也是我入行以来第一次写系列篇的文章,也是第一次连续更文,虽然写的不是很好可能在一些大佬眼里都是不值一提的文章,但是这些文章给自己养成了一些良好的习惯,发现自己坚持下来回慢慢喜欢上更文的习惯,在这次更文中也认识了很多掘友,之前好多次都半途而废了没有一次坚持下来的。希望各位也可以试着给自己养成一个好的习惯不论工作中还是生活中都对自己受益终身。各位继续在自己的发展的道路上接着肝吧,互相共勉。加油!奥力给!!!

关系型数据库

关系型数据库:指采用了关系模型来组织数据的数据库。

关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

1.1 关系型数据库简介

案例: 创建一个数据表,能够保存学生的基本信息(学号、姓名、年龄等)和学生每一科的考试成绩。

  1. 一张表的形式

1536371335860.png

缺点: 重复数据太多(数据冗余) 2. 关系型数据库:

1536371845715.png

使用多张数据表联合保存数据。

核心重点: 字段的对应关系

sc表中的 sno要和 student表中的sno对应,sc.sno的值一定要存在于 student.sno

sc表中的cno 要和 course表中的cno对应,sc.cno的值一定要存在于course.cno

缺点: 表多 优点: 数据耦合性低 每个数据表都能够独立管理

1.2 关系模型

目标: 创建student和dept表用来存储学生的基本信息、学院基本信息和学生所属的学院信息。

1536372579821.png

student:学生表,所需字段 学号、姓名、性别、年龄、系别

dept:系别表,所需字段 系号 系名

数据操作

2.1多表查询

关键词: join on

格式:

select * from 表1

join 表2 on 链接条件

链接条件一定是 表1的某个字段 = 表2的某个字段

案例1: 查询学生基本信息,显示系名

表: student dept (一般来讲,主要查询哪个表的数据,哪个表就作为表1, 或者哪个表字段多哪个就做表1)

student (表1 student表有7个字段,要显示6个字段)

dept (表2 有2个字段,只显示1个字段)

字段: student的所有字段, dept.dname

链接条件: student.sdept=dept.did

select student. *, dept.dname from student
join dept on student.sdept = dept.did

2.2添加数据

格式: insert into 表名(字段名1,字段名2,....) values(值1,值2,....)

注意: 字段的顺序要和值的顺序是完全匹配的,自增长类型的主键,可以使用null来填充;MySQL会自动填充数据,如果每个字段都有数据,那么表名后面可以不跟字段名,但是values里面的顺序必须正确。

案例: 向student表中添加一条数据

insert into student (sno,sname,snickname,sage,sgender,stime,sdept)
values(null,'王大锤','car', 10000, '男','2020-02-20',3)

2.3 修改数据

格式:

update 表名 set 字段1=值1, 字段2=值2,... where 修改条件

修改表中的哪一条(几条)数据的 字段1=值1...

案例: 将学号为6的学生姓名改为王,性别改为女

update student set sname='王',sgender='女'
where sno=6

2.4 删除数据

格式: delete from 表名 where 删除条件

案例: 删除学号为4的学生信息

delete from student where sno=4

node 中使用 mysql模块

3.1 mysql模块的作用

mysql模块是一个第三方模块,专门用来操作MySQL数据库。 可以执行增删改查操作。

npm i mysql

3.2 mysql基本用法

在Node中使用MySQL模块一共需要5个步骤:

  1. 加载 MySQL 模块
  2. 创建 MySQL 链接对象
  3. 链接 MySQL 服务器
  4. 执行SQL语句
  5. 关闭链接
//1. 加载 MySQL 模块
const mysql = require('mysql')

//2. 创建 MySQL 链接
const conn = mysql.createConntion({
    host: '127.0.0.1',      // MySQL服务器地址
    user: 'root',           // 用户名
    password: 'root',       // 用户名对应的密码
    database: 'study',      // 要使用的数据库
    port: 3306              // MySQL服务器端口号,3006可不写
})

//3. 链接 MySQL 服务器
conn.connect();

//4. 执行SQL语句
//参数1: 要执行的SQL语句
//参数2: SQL语句中的参数,有占位符时用来设置占位符,可选参数
//参数3: SQL执行完成后触发的回调函数,有两个参数
//      参数1: 错误对象
//      参数2: SQL执行结果
conn.query(sql, (err, result) => {
    //处理错误或者执行结果
})

//5. 关闭链接
conn.end()

3.3 查询 --- read

执行查询类型的SQL语句,查询结果(result)是一个数组,每个单元是对象,对象的属性是数据表的字段名

// 目标:使用mysql模块,从student表中查询出所有学生信息
//       并显示到终端

//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',   //指定MySQL服务器的地址
    user: 'root',        //MySQL服务器的用户名
    password: 'root',    //用户名对应的密码
    database: 'study',   //指定要使用的数据库
    port: 3306           //指定MySQL服务器的端口,如果默认端口可以不写
});

//3. 链接数据库
conn.connect();

//4. 执行SQL语句
const sql = "select * from student";
/**
 * 功能: 执行SQL语句
 * 参数1: 要执行的SQL语句
 * 参数2: 当SQL语句中有占位符时,使用该参数来设置占位符,可选
 * 参数3: SQL语句执行完成后触发的回调函数,有三个参数
 *     err: 如果SQL执行失败则err中保存错误对象信息,成功则为null
 *     result: SQL语句的执行结果
 *     fields: 执行本次SQL语句,涉及到的字段信息,一般不用
 */
//当执行查询的SQL语句时,result中以数组形式记录了查询结果。
//数组中每个单元都是一个对象,并且下标是 数据表的字段名
conn.query(sql, (err, result, fields) => {
    console.log(err);     //错误对象
    console.log(result);  //SQL执行结果
    console.log(fields);
})

//关闭链接
conn.end();

执行结果:

123.jpg

占位符模式:

当SQL语句中使用了占位符,则query方法需要使用参数2

//目标: 查询语句中的占位符

//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'study'
})

//3. 链接数据库
conn.connect();

//4. 执行SQL语句
//查询所有女性学生信息
//在SQL语句中的 ? 就是占位符
const sql = "select * from student where sgender=?";
conn.query(sql, '女', (err, result) => {
    if (err) {
        return console.log(err);
    }

    result.forEach(function (item, index) {
        console.log(item);
    })
})

//5. 关闭链接
conn.end();

3.4 添加 --- create

执行添加类型的SQL语句,查询结果(result)是一个对象,该对象中有两个属性需要记住

  • affectedRows: 受影响行数
  • insertID: 查询数据的主键值
//目标: 向student表中添加一条数据
//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'study'
})

//3. 链接数据库
conn.connect();

//4. 执行SQL语句
const sql = `insert into student 
values(null, '阿托', 'atuo', 9000, '男', '2019-02-18', 1)`;
//当执行添加时,result是一个对象,该对象中包含了两个关键属性
// affectedRows: 受影响行数
// insertID: 新添加好的数据的主键值
//
conn.query(sql, (err, result) => {
    if (err) {
        return console.log(err);
    }

    console.log(result);
})

//5. 关闭链接
conn.end();

执行结果:

image.png

占位符形式: 数据添加时,占位符需要一个对象。 对象的属性是数据表字段名,值是要写入数据表的数据

//目标: 向student表中添加一条数据
//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'study'
})

//3. 链接数据库
conn.connect();

//4. 执行SQL语句
const sql = `insert into student set ?`;
//添加数据时使用站位符,该占位符需要使用一个对象来填充
// 该对象的下标必须是 数据表的字段名
// 带自增长的主键可以不用设置,因为系统会自动设置
const student_data = {
    sname: '蕾娜',
    snickname: 'lena',
    sage: 1000,
    sgender: '女',
    stime: '2019-02-18',
    sdept: 2
}

conn.query(sql, student_data, (err, result) => {
    if (err) {
        return console.log(err);
    }

    console.log(result);
})

//5. 关闭链接
conn.end();

3.5 修改 --- update

执行修改类型的SQL语句,查询结果(result)是一个对象,该对象中有 affectedRows 属性

//目标: 将刘闯的昵称改为lc,年龄改为30

//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'study'
})

//3. 链接数据库
conn.connect();

//4. 执行SQL语句
const sql = "update student set snickname='lc',sage=30 where sno=5";
conn.query(sql, (err, result) => {
    if (err) {
        return console.log(err);
    }

    console.log(result);
})

//5. 关闭链接
conn.end();

占位符模式:

数据修改通常需要两个占位符。 占位符1是要修改的数据,对象形式,属性是数据表字段;占位符2是修改条件,通常是主键值.

//目标: 将刘闯的昵称改为lc,年龄改为30

//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'study'
})

//3. 链接数据库
conn.connect();

//占位符模式:
const sql = "update student set ? where sno=?";
//set之后的? 是要修改的实际数据,必须是一个对象形式
const obj = {
    snickname: 'chuangzi',
    sage:28
}
const sno = 5;

//当一个sql语句中有多个占位符时,参数2需要使用数组形式
//程序解析时,会按照数组的顺序将数据填充到对应占位符的位置
conn.query(sql, [obj, sno], (err, result) => {
    if (err) {
        return console.log(err);
    }

    console.log(result);
})


//5. 关闭链接
conn.end();

3.6 删除 --- delete

执行删除类型的SQL语句,查询结果(result)是一个对象,该对象中有 affectedRows 属性。

//目标: 删除student表中sno=8的数据

//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'study'
})

//3. 链接数据库
conn.connect();

//4. 执行SQL语句
const sql = 'delete from student where sno=8';
conn.query(sql, (err, result) => {
    if (err) {
        return console.log(err);
    }

    console.log(result);
})

//5. 关闭连接
conn.end();

占位符模式:

//目标: 删除student表中sno=8的数据

//1. 加载mysql模块
const mysql = require('mysql');

//2. 创建mysql链接对象
const conn = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'study'
})

//3. 链接数据库
conn.connect();

//4. 执行SQL语句
const sql = 'delete from student where sno=?';
conn.query(sql, 8, (err, result) => {
    if (err) {
    return console.log(err);
    }

    console.log(result);
})


//5. 关闭连接
conn.end();

往期精彩推荐

前端性能优化实战

聊聊让人头疼的正则表达式

获取文件blob流地址实现下载功能

Git 相关推荐

通俗易懂的 Git 入门

git 实现自动推送

我在工作中是如何使用 git 的

面试相关推荐

前端万字面经——基础篇

前端万字面积——进阶篇

更多精彩详见:个人主页