目录
1. 数据库准备
# 创建数据库 expressdatabase
create database expressdatabase;
# 查看所有数据库
show databases ;
# 切换数据库
use expressdatabase;
# 查看当前数据库
select database() ;
# 创建 users 用户信息表
create table users (
id int primary key not null unique auto_increment comment '用户ID,这是用户信息的唯一标识',
username varchar(45) not null unique comment '用户的登录名',
password varchar(45) not null comment '用户的登录密码',
status tinyint(1) not null default 0 comment '用户的状态,是一个布尔值。0表示用户状态正常,1表示用户被禁用。'
) comment '用户信息表';
# 插入数据
insert into users(username, password) values ('张三', '123456'), ('李四', 'abc123');
insert into users(username, password) values ('小红', '654321');
2. 在项目中操作数据库的步骤
- ① 安装操作 MySQL 数据库的第三方模块(mysql)
- ② 通过 mysql 模块连接到 MySQL 数据库
- ③ 通过 mysql 模块执行 SQL 语句
3. 安装与配置 mysql 模块
3.1 安装 mysql 模块
mysql 模块是托管于 npm 上的
第三方模块
。它提供了在 Node.js 项目中
连接
和
操作
MySQL 数据库的能力。
想要在项目中使用它,需要先运行如下命令,将 mysql 安装为项目的依赖包:
npm install mysql
3.2 配置 mysql 模块
在使用 mysql 模块操作 MySQL 数据库之前,
必须先对 mysql 模块进行必要的配置
,主要的配置步骤如下:
// 1. 导入 mysql 模块
const mysql = require('mysql')
// 2. 建立与 mysql 数据库的连接关系
const database = mysql.createPool({
host: '127.0.0.1', //数据库的 ip 地址
user: 'root', // 登录数据库的账号
password: '123456', // 登录数据库的密码
database: 'expressdatabase', // 指定要操作哪个数据
})
3.3 测试 mysql 模块能否正常工作
调用 database.query() 函数,指定要执行的 SQL 语句,通过回调函数拿到执行的结果:
// 检测 mysql 模块能否正常工作
database.query('select 1', (err, results) => {
// mysql 模块工作期间报错了
if (err) {
return console.log(err.message)
}
// 能够成功的执行 sql 语句
console.log(results)
})
输出下述结果,则代表数据库连接正常:
运行代码后报以下错误:
ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client undefined
错误原因:
-
这个错误表明客户端不支持服务器所要求的认证协议。在 MySQL 8.0 版本之后,默认的认证插件从
mysql_native_password
变成了caching_sha2_password
。而一些旧版本的 MySQL 客户端可能只支持mysql_native_password
认证方式,当客户端尝试连接使用新认证方式的 MySQL 服务器时,就会出现此错误。
解决方案三种:
① 更新 MySQL 客户端
- 将 MySQL 客户端更新到支持
caching_sha2_password
认证协议的版本。
② 修改 MySQL 服务器的认证方式
- 使用管理员账户登录 MySQL。
- 执行以下 SQL 语句来修改用户的认证方式:
ALTER USER 'your_username'@'your_host' IDENTIFIED WITH mysql_native_password BY 'your_password';
把 your_username
替换成你的用户名,your_host
替换成主机名(通常是 localhost
),your_password
替换成你的密码。
- 执行以下语句来刷新权限:
FLUSH PRIVILEGES;
③ 在连接配置中指定认证方式
// 1. 导入 mysql 模块
const mysql = require('mysql');
// 2. 建立与 mysql 数据库的连接关系
const database = mysql.createPool({
host: '127.0.0.1', // 数据库的 ip 地址
user: 'root', // 登录数据库的账号
password: '123456', // 登录数据库的密码
database: 'expressdatabase', // 指定要操作哪个数据
authPlugin: 'mysql_native_password' // 指定认证方式
});
4. 使用 mysql 模块操作 MySQL 数据库
4.1 查询数据
查询 users 表中所有的数据:
// 查询 users 表中所有的数据
const sqlStr = 'select * from users'
database.query(sqlStr, (err, results) => {
// 查询数据失败
if (err) {
console.log(err.message)
}
// 查询数据成功
// 注意:如果执行的是 select 查询语句,则执行的结果是数组
console.log(results)
})
4.2 插入数据
向 users 表中新增数据, 其中
username
为
Spider-Man
,
password
为
pcc321
。示例代码如下:
/ 向 users 表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
const user = {
username: 'Spider-Man',
password: 'pcc123'
}
// 定义执行的 sql 语句
const sql = 'insert into users(username, password) values (?, ?)'
// 执行 sql 语句
database.query(sql, [user.username, user.password], (err, results) => {
// 执行 sql 语句失败了
if (err) {
console.log(err.message)
}
// 执行成功了
// 注意: 如果执行的是 insert into 插入语句,则 results 是一个对象
// 可以通过 affectedRows 属性,来判断是否插入数据成功
if (results.affectedRows === 1) {
console.log('插入数据成功。')
}
})
4.3 插入数据的便捷方式
向表中新增数据时,如果
数据对象的每个属性
和
数据表的字段
一一对应
,则可以通过如下方式快速插入数据:
- 英文的问号(?)表示占位符
// 演示插入数据的快捷方式
const user2 = {
username: 'Spider-Man2',
password: 'pcc4321'
}
// 定义执行的 sql 语句
const sql = 'insert into users set ?'
// 执行 sql 语句
database.query(sql, user2, (err, results) => {
if (err) {
return console.log(err.message)
}
if(results.affectedRows === 1 ) {
console.log('插入数据成功。')
}
})
4.4 更新数据
可以通过如下方式,更新表中的数据:
// 更新 id = 6 的用户信息
const user = {
id: 6,
username: 'aaa',
password: '000'
}
// 定义 sql 语句
const sql = 'update users set username = ?, password = ? where id = ?'
// 执行 sql 语句
database.query(sql, [user.username, user.password, user.id], (err, rusults) => {
if (err) {
return console.log(err.message)
}
// 注意:执行了 update 语句之后,执行的结果,也是一个对象,可以通过 affectedRows 判断是否更新成功
if (rusults.affectedRows === 1) {
console.log('更新成功。')
}
})
4.5 更新数据的便捷方式
更新表数据时,如果
数据对象的每个属性
和
数据表的字段
一一对应
,则可以通过如下方式快速更新表数据:
// 演示更新用户信息的快捷方式
const user = {
id: 6,
username: 'bbb',
password: '111'
}
// 定义 sql 语句
const sql = 'update users set ? where id = ?'
database.query(sql, [user, user.id], (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('更新数据成功。')
}
})
4.6 删除数据
在删除数据时,推荐根据 id 这样的唯一标识,来删除对应的数据。示例如下:
// 1. 删除 id 为 5 的用户
const sql = 'delete from users where id = 5'
// 2. 调用 query 方法执行 sql 语句的同时,为占位符指定具体的值
// 注意:如果 sql 语句中有多个占位符,则必须使用数组为每个占位符指定具体的值
// 如果 sql 语句中只有一个占位符,则可以省略数组
database.query(sql , 5, (err, results) => {
if (err) {
return console.log(err.message)
}
// 注意:执行 delete 语句之后,结果也是一个对象,也包含 affecedRows 属性
if (results.affectedRows === 1) {
console.log('删除用户信息成功。')
}
})
4.7 标记删除
- 使用 DELETE 语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作。
- 所谓的标记删除,就是在表中设置类似于 status 这样的状态字段,来标记当前这条数据是否被删除。
- 当用户执行了删除的动作时,我们并没有执行 DELETE 语句把数据删除掉,而是执行了 UPDATE 语句,将这条数据对应的 status 字段标记为删除即可。
// 标记删除
const sql = 'update users set status = ? where id = ?'
database.query(sql, [1, 6], (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('标记删除成功。')
}
})