物联网服务NodeJs-5天学习第四天存储篇② ——NodeJs连接操作mysql 8.0
Posted 单片机菜鸟哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了物联网服务NodeJs-5天学习第四天存储篇② ——NodeJs连接操作mysql 8.0相关的知识,希望对你有一定的参考价值。
【NodeJs-5天学习】第四天存储篇② ——NodeJs连接操作mysql 8.0
面向读者群体
- ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
- ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️
- ❤️ 本篇创建记录 2023-03-12 ❤️
- ❤️ 本篇更新记录 2023-03-12 ❤️
技术要求
- 有HTML、CSS、JavaScript基础更好,当然也没事,就直接运行实例代码学习
专栏介绍
- 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的物联网web开发,而且能够部署到公网访问。
🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝
1. 前言
在前一篇
中我们讲解了如何搭建mysql数据库服务器并且能够进行简单的CURD操作,那么本篇我们继续来学习一下如何使用NodeJs连接MySQL
。
注意:
- 本篇是基于 【NodeJs-5天学习】第四天存储篇① ——安装使用mysql 8.0 进行讲解,所以务必先学习该篇。
2. mysql模块
基本上分为几个步骤:
- ① 安装操作MySQL数据库的第三方模块(
mysql
) - ② 通过mysql模块
连接
到MySQL 数据库 - ③ 通过mysql模块
执行
SQL语句
2.1 安装mysql模块
终端上执行命令:
npm install mysql --save
模块官方说明(建议多看看):
这里官方也给了一个简单的demo使用案例。
// 第一步:引入mysql模块
var mysql = require('mysql');
// 第二步:创建数据库连接,这里参数会很多
var connection = mysql.createConnection(
host : 'localhost', // 主机地址
user : 'root', // 用户名
password : '123456', // 用户密码
database : 'nodejs', // 数据库名
port : 3306 // 端口号,默认3306
);
// 第三步:正式发起数据库连接
connection.connect();
// 第四步:执行查询操作
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields)
if (error) throw error;
console.log('The solution is: ', results[0].solution);
);
// 第五步:关闭数据库
connection.end();
基本上可以分为五个操作步骤:
- 引入模块
- 创建连接
连接参数最好去看看官方文档说明
同时包括ssl参数:
- 发起连接
目前支持一次性连接和Pool连接池两种方式
- CURD操作
需要我们写好
sql
语句,然后使用query
方法执行对应语句即可
- 关闭数据库
包括两个方法:
end
(一般推荐使用这个方法)destory
2.2 操作mysql模块
2.2.1 基本连接进行数据库连接
这里创建一个simple_mysql.js 文件:
// 第一步:引入mysql模块
let mysql = require("mysql");
// 连接参数
const db_config=
host : 'localhost', // 主机地址
user : 'root', // 用户名
password : '123456', // 用户密码
database : 'nodejs', // 数据库名
port : 3306 // 端口号,默认3306
// 第二步:创建数据库连接,这里参数会很多
let connect=mysql.createConnection(db_config)
// 第三步:正式发起数据库连接
connect.connect(function(err)
if(err)
console.log(`mysql连接失败: $err!`);
else
console.log("mysql连接成功!");
)
// 第四步:执行查询操作
let sqlQuery="select * from test";
connect.query(sqlQuery,function(err,result)
if(err)
console.log(`SQL error: $err!`);
else
console.log(result);
closeMysql(connect);
)
//查询成功后关闭mysql
function closeMysql(connect)
connect.end((err)=>
if(err)
console.log(`mysql关闭失败:$err!`);
else
console.log('mysql关闭成功!');
)
执行该文件,可以看到打印效果:
整个执行过程:
- 通过mysql模块的createConnection()来创建一个数据库连接(注意只是创建了,还没有连接);
- 然后通过createConnection()返回对象的connect()方法进行数据库连接
- 通过query()方法进行数据库操作
- end()方法关闭数据库;通过destory()方法也可以关闭数据库,不过没有回调函数,直接关闭;
注意:
- 以上代码只能一次性链接数据库,如果数据库出现问题无法连接(可以通过关闭数据库服务)不能自动再次连接
这里创建一个autoconnect_mysql.js (支持自动连接)文件:
// 第一步:引入mysql模块
let mysql = require("mysql");
// 连接参数
const db_config=
host : 'localhost', // 主机地址
user : 'root', // 用户名
password : '123456', // 用户密码
database : 'nodejs', // 数据库名
port : 3306 // 端口号,默认3306
// 第二步:创建数据库连接,这里参数会很多
let connect=mysql.createConnection(db_config)
console.log('createConnection 创建连接')
// 第三步:正式发起数据库连接
connect.connect(function(err)
if(err)
console.log(`mysql连接失败: $err,正在重新连接...`)
setTimeout(function()
autoConnect(connect);
,2000); //2s重新连接
else
console.log("mysql连接成功!")
sqlQuery(connect)
)
// 第四步:执行查询操作
function sqlQuery(connect)
console.log('query 执行sql语句')
//基本的查询语句
let sqlQuery="select * from test";
connect.query(sqlQuery,function(err,result)
if(err)
console.log(`SQL error: $err!`);
else
console.log(result);
closeMysql(connect);
);
//查询成功后关闭mysql
function closeMysql(connect)
connect.end((err)=>
if(err)
console.log(`mysql关闭失败:$err!`);
else
console.log('mysql关闭成功!');
)
let time = 0; //控制连接次数
const maxTime = 10; // 最大连接次数
//数据连接失败后自动连接控制连接次数
function autoConnect(connect)
if(time < maxTime)
time++;
connect.connect(function(err)
if(err)
console.log(`mysql自动连接:$time`);
setTimeout(function()
autoConnect(connect)
,2000);
else
console.log("mysql连接成功!");
sqlQuery(connect);
);
else
console.log("真尽力连不上,检查其他问题吧!");
测试过程:
- 先保证mysql服务正常运行,再运行autoconnect_mysql js文件
- 关闭mysql服务,再运行autoconnect_mysql js文件
这里设置了自动链接次数为10次,如果超过这10次还连不上就没办法咯;
2.2.2 pool连接池进行数据库连接
以上就是通过mysql模块进行基础链接,接下来看看mysql连接池来连接数据库,连接池的主要可以服用已有的链接,而不像普通链接那样用一次关闭一次连接,不关闭连接会照成资源浪费;
这里创建一个pool_mysql.js 文件:
// 第一步:引入mysql模块
let mysql = require("mysql");
// 连接参数
const db_config=
host : 'localhost', // 主机地址
user : 'root', // 用户名
password : '123456', // 用户密码
database : 'nodejs', // 数据库名
port : 3306 // 端口号,默认3306
// 第二步:创建数据库连接池,这里参数会很多
let pool=mysql.createPool(db_config)
// 第三步:正式发起数据库连接
pool.getConnection(function(err,connect)//通过getConnection()方法进行数据库连接
if(err)
console.log(`mysql链接失败$err`);
else
// 第四步:执行查询操作
connect.query('select * from test',function(err,result)
if(err)
console.log(`SQL error:$err`)
else
console.log(result);
connect.release();//释放连接池中的数据库连接
pool.end();//关闭连接池
);
)
执行以上文件。
- 通过连接池
createPool
()方法连接数据库的方式与通过createConnection
()方法用法一致; - 然后通过
getConnection
()方法来对数据库进行连接 release
()释放连接池中的数据库连接,注意只是单纯的释放并没有关闭,如果有下次对数据库的访问还是会用上的pool.end
()方法是关闭连接池,完全关闭可以理解为对数据库的完全关闭;
2.2.3 CURD操作
2.2.3.1 插入数据 —— INSERT
数据库与表创建成功以后,需要向数据库的表中插入数据。在 MySQL 中可以使用 INSERT 语句向数据库已有的表中插入一行或者多行元组数据。
INSERT 语句有两种语法形式,分别是 INSERT…VALUES 语句和 INSERT…SET 语句。
INSERT…VALUES
语句(支持插入多行数据,对于多行场景下性能更好),通用语法:
INSERT INTO [表名]([列名],[列名])
VALUES
([列值],[列值])),
([列值],[列值])),
([列值],[列值]));
- <表名>:指定被操作的表名。
- <列名>:指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…)
- VALUES 或 VALUE 子句:该子句包含要插入的数据清单。数据清单中数据的顺序要和列的顺序相对应。
INSERT…SET
语句(插入单行,支持部分列),通用语法:
INSERT INTO [表名]
SET <列名1> = <值1>, <列名2> = <值2>, <列名3> = <值3>;
这里我们往test表里面插入数据测试一下效果:
// 第一步:引入mysql模块
let mysql = require("mysql");
// 连接参数
const db_config=
host : 'localhost', // 主机地址
user : 'root', // 用户名
password : '123456', // 用户密码
database : 'nodejs', // 数据库名
port : 3306 // 端口号,默认3306
// 第二步:创建数据库连接池,这里参数会很多
let pool=mysql.createPool(db_config)
// 第三步:正式发起数据库连接
pool.getConnection(function(err,connect)//通过getConnection()方法进行数据库连接
if(err)
console.log(`mysql链接失败$err`);
else
// 第四步:执行查询操作
connect.query('select * from test',function(err,result)
if(err)
console.log(`SQL error:$err`)
else
console.log(result);
);
let insertSql = 'insert into test set name = \\'花无缺\\''
connect.query(insertSql,function(err,result)
if(err)
console.log(`SQL error:$err`)
else
console.log(result);
);
let insertSql2 = 'insert into test(name) values (\\'小鱼儿\\'),(\\'如来神掌\\')'
connect.query(insertSql2,function(err,result)
if(err)
console.log(`SQL error:$err`)
else
console.log(result);
);
)
同时也看看 DBeaver显示的数据:
说明我们是插入数据成功。
注意:我们这里有重复数据,主要是博主进行了多次操作
2.2.3.2 更新数据 —— UPDATE
在 MySQL 中可以使用 UPDATE 语句来修改、更新一个或多个表的数据。
语法格式:
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
[ORDER BY 子句] [LIMIT 子句]
- <表名>:用于指定要更新的表名称。
- SET 子句:用于指定表中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字 DEFAULT 表示列值。
- WHERE 子句:可选项。用于限定表中要修改的行。若不指定,则修改表中所有的行。
- ORDER BY 子句:可选项。用于限定表中的行被修改的次序。
- LIMIT 子句:可选项。用于限定被修改的行数。
- 修改一行数据的多个列值时,SET 子句的每个值用逗号分开即可。
这里我们把test表里面名字为“花无缺”改成“花有缺”,测试一下效果:
// 第一步:引入mysql模块
let mysql = require("mysql");
// 连接参数
const db_config=
host : 'localhost', // 主机地址
user : 'root', // 用户名
password : '123456', // 用户密码
database : 'nodejs', // 数据库名
port : 3306 // 端口号,默认3306
// 第二步:创建数据库连接池,这里参数会很多
let pool=mysql.createPool(db_config)
// 第三步:正式发起数据库连接
pool.getConnection(function(err,connect)//通过getConnection()方法进行数据库连接
if(err)
console.log(`mysql链接失败$err`);
else
// 第四步:执行查询操作
connect.query('select * from test',function(err,result)
if(err)
console.log(`SQL error:$err`)
else
console.log(result);
);
let insertSql = 'UPDATE test SET name = \\'花有缺\\' WHERE name = \\'花无缺\\''
connect.query(insertSql,function(err,result)
if(err)
console.log(`SQL error:$err`)
else
connect.query('select * from test',function(err,result)
if(err)
console.log(`SQL error:$err`)
else
console.log(result);
);
);
)
2.2.3.3 删除数据 —— DELETE
在 MySQL 中,可以使用 DELETE
语句来删除表的一行或者多行数据。
语法格式为:
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
- <表名>:指定要删除数据的表名。
- ORDER BY 子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。
- WHERE 子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。
- LIMIT 子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值。
在不使用 WHERE 条件的时候,将删除所有数据。
这里我们把test表里面名字为“花有缺”的数据全部删掉,测试一下效果:
// 第一步:引入mysql模块
let mysql = require("mysql");
// 连接参数
const db_config=
host : 'localhost', // 主机地址
user : 'root', // 用户名
password : '123456', // 用户密码
database : 'nodejs', // 数据库名
port : 3306 // 端口号,默认3306
// 第二步:创建数据库连接池,这里参数会很多
let pool=mysql.createPool(db_config)
// 第三步:正式发起数据库连接
pool.getConnection(function(err,connect)//通过getConnection()方法进行数据库连接
if(err)
console.log(`mysql链接失败$err`);
else
// 第四步:执行查询操作
connect.query('select * from test',function(err,result)
if(err)
console.log(`SQL error:$err`)
else
console.log(result);
);
let deleteSql = 'DELETE FROM test WHERE name = \\'花有缺\\''
connect.query(deleteSql以上是关于物联网服务NodeJs-5天学习第四天存储篇② ——NodeJs连接操作mysql 8.0的主要内容,如果未能解决你的问题,请参考以下文章
物联网服务NodeJs-5天学习第四天存储篇④ ——基于MQTT的环境温度检测,升级存储为mysql
物联网服务NodeJs-5天学习第四天存储篇③ ——基于物联网的WiFi自动打卡考勤系统,升级存储为mysql,提醒功能改为QQ
物联网服务NodeJs-5天学习第三天实战篇② ——基于物联网的WiFi自动打卡考勤系统
物联网NodeJs-5天学习第四天存储篇⑤ ——PM2,node.js应用进程管理器