物联网服务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 ❤️

技术要求

  • HTMLCSSJavaScript基础更好,当然也没事,就直接运行实例代码学习

专栏介绍

  • 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的物联网web开发,而且能够部署到公网访问。

🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝

1. 前言

在前一篇

中我们讲解了如何搭建mysql数据库服务器并且能够进行简单的CURD操作,那么本篇我们继续来学习一下如何使用NodeJs连接MySQL

注意:

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应用进程管理器

物联网服务NodeJs-5天学习第二天篇② —— 网络编程(TCPHTTPWeb应用服务)

物联网服务NodeJs-5天学习第二天篇③ ——Express Web框架 和 中间件