文章目录
- 1. 数据库的基本概念
- 1.1 什么是数据库
- 1.2 常见的数据库及分类
- 1.3 传统型数据库的数据组织结构
- 1.3.1 Excel的数据组织结构
- 1.3.2 传统型数据库的数据组织结构
- 1.3.3 实际开发中库、表、行、字段的关系
- 2. 在Express中操作MySQL
- 2.1 在项目中操作数据库的步骤
- 2.2 安装与配置mysql模块
- 2.2.1 安装ysql模块
- 2.2.2 配置mysql模块
- 2.2.3 测试mysql模块能否正常工作
- 2.3 使用mysql模块操作MySQL数据库
- 2.3.1 查询数据
- 2.3.2 插入数据
- 2.3.3 插入数据的便捷方式
- 2.3.4 更新数据
- 2.3.5 更新数据的便捷方式
- 2.3.6 删除数据
- 2.3.7 标记删除
1. 数据库的基本概念
1.1 什么是数据库
数据库(database)是用来组织、存储和管理数据的仓库。
当今世界是一个充满着数据的互联网世界,充斥着大量的数据。
数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。
为了方便管理互联网世界中的数据,就有了数据库管理系统的概念(简称:数据库)。用户可以对数据库中的数据进行新增、查询、更新、删除等操作。
1.2 常见的数据库及分类
市面上的数据库有很多种,最常见的数据库有如下几个:
- MySQL数据库(目前使用最广泛、流行度最高的开源免费数据库;Community+Enterprise)
- Oracle数据库(收费)
- SQL Server数据库(收费)
- Mongodb数据库(Community+Enterprise)
其中,MySQL、Oracle、.SQL Server属于传统型数据库(又叫做:关系型数据库或SQL数据库),这三者的设计理念相同,用法比较类似。
而Mongodb属于新型数据库(又叫做:非关系型数据库或NoSQL数据库),它在一定程度上弥补了传统型数据库的缺陷。
1.3 传统型数据库的数据组织结构
数据的组织结构:指的就是数据以什么样的结构进行存储。
传统型数据库的数据组织结构,与Excel中数据的组织结构比较类似。因此,我们可以对比着Excel来了解和学习传统型数据库的数据组织结构。
1.3.1 Excel的数据组织结构
每个Excel中,数据的组织结构分别为工作簿、工作表、数据行、列这4大部分组成。
- 整个Excel叫做工作簿
- users和books是工作表
- users工作表中有3行数据
- 每行数据由6列信息组成
- 每列信息都有对应的数据类型
1.3.2 传统型数据库的数据组织结构
在传统型数据库中,数据的组织结构分为**数据库(database)、数据表(table))、数据行(row)、字段((field)**这4大部分组成。
- 数据库类似于Excel的工作簿
- 数据表类似于Excel的工作表
- 数据行类似于Excel的每一行数据
- 字段类似于Excel的列
- 每个字段都有对应的数据类型
1.3.3 实际开发中库、表、行、字段的关系
- 在实际项目开发中,一般情况下,每个项目都对应独立的数据库。
- 不同的数据,要存储到数据库的不同表中,例如:用户数据存储到usrs表中,图书数据存储到books表中。
- 每个表中具体存储哪些信息,由字段来决定,例如:我们可以为users表设计id、username、password这3个字段。
- 表中的行,代表每一条具体的数据,
2. 在Express中操作MySQL
2.1 在项目中操作数据库的步骤
- 安装操作MySQL数据库的第三方模块(ysql)
- 通过mysql模块连接到MySQL数据库
- 通过mysql模块执行SQL语句
2.2 安装与配置mysql模块
2.2.1 安装ysql模块
mysql模块是托管于npm上的第三方模块。它提供了在Node,js项目中连接和操作MySQL数据库的能力。
想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:
npm i mysql # 对于mysql5.x
npm i mysql2 # 对于mysql8.x
2.2.2 配置mysql模块
// 导入mysql模块
const mysql = require('mysql')
// 建立与 MySQL数据库的连接
const db = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'nodejs-study' // 指定操作的数据库
})
2.2.3 测试mysql模块能否正常工作
调用db.query()
函数,指定要执行的SQL语句,通过回调函数拿到执行的结果:
// 检测mysql模块能否正常工作
db.query('SELECT 1', (err, results) => {
if (err) return console.log(err.message)
// 如果能打印出来 [ { '1': 1 } ] 说明没有问题
console.log(results)
})
2.3 使用mysql模块操作MySQL数据库
2.3.1 查询数据
查询users表中的所有数据
db.query('SELECT * FROM users', (err, results) => {
if (err) return console.log(err.message)
// 打印结果
console.log(results)
})
如果执行的是 select 查询语句,则执行的结果是数组
2.3.2 插入数据
插入新的用户信息
通过
affectedRows
判断是否插入数据成功,如果是多行的话建议使用result.affectRows != 0
const userInfo = {
username: "sunliu",
age: 19,
gender: "男"
}
const sqlStr = 'INSERT INTO users VALUES (?, ?, ?)'
db.query(sqlStr, [userInfo.username, userInfo.age, userInfo.gender], (err, result) => {
if (err) return console.log(err.message)
// 插入数据成功
if (result.affectedRows === 1) {
console.log("插入数据成功")
}
})
2.3.3 插入数据的便捷方式
向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据:
const userInfo = {
name: "sunliu",
age: 19,
gender: "男"
}
const sqlStr = 'INSERT INTO users SET ?'
db.query(sqlStr, userInfo, (err, result) => {
if (err) return console.log(err.message)
// 插入数据成功
if (result.affectedRows === 1) {
console.log("插入数据成功")
}
})
数据库表结构:
2.3.4 更新数据
可以通过如下方式,更新表中的数据:
const userInfo = {
name: "sunliu",
age: 50,
gender: "男"
}
const sqlStr = 'UPDATE users SET age=? WHERE name=?'
db.query(sqlStr, [userInfo.age, userInfo.name], (err, result) => {
if (err) return console.log(err.message)
if (result.affectedRows === 1) {
console.log("修改数据成功")
}
})
2.3.5 更新数据的便捷方式
更新表数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速更新表数据:
const userInfo = {
name: "sunliu",
age: 50,
gender: "男"
}
const sqlStr = 'UPDATE users SET ? WHERE name=?'
db.query(sqlStr, [userInfo, userInfo.name], (err, result) => {
if (err) return console.log(err.message)
if (result.affectedRows === 1) {
console.log("修改数据成功")
}
})
2.3.6 删除数据
在删除数据时,推荐根据d这样的唯一标识,来删除对应的数据。示例如下:
const sql = 'delete from users where id=?'
db.query(sql, id, (err, results) => {
if (err) return console.log(err.message)
if (result.affectedRows === 1) {
console.log("删除数据成功")
}
})
2.3.7 标记删除
- 使用DELETE语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作。
- 所谓的标记删除,就是在表中设置类似于status这样的状态字段,来标记当前这条数据是否被删除。
- 当用户执行了删除的动作时,我们并没有执行DELETE语句把数据删除掉,而是执行了UPDATE语句,将这条数据对应的status字段标记为删除即可。
db.query('update users set status=1 where id=?', 7, (err, results) => {
if (err) return console.log(err.message)
if (result.affectedRows === 1) {
console.log("删除数据成功")
}
})