【物联网服务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,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.4 创建数据表 —— CREATE TABLE

要在数据库中创建一个新表,可以使用MySQL CREATE TABLE语句。 CREATE TABLE语句是MySQL中最复杂的语句之一。

基本语法:

CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];

其中,[表定义选项]的格式为:

<列名1> <类型1> [,] <列名n> <类型n>

CREATE TABLE 命令语法比较多,其主要是由表创建定义(create-definition)、表选项(table-options)和分区选项(partition-options)所组成的。

这里我们在nodejs库里面新增一个表todos,测试一下效果:

// 第一步:引入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 createTodos = `create table if not exists todos(
            id int primary key auto_increment,
            title varchar(255)not null,
            completed tinyint(1) not null default 0
        )`;

        connect.query(createTodos, function(err, results, fields) {
             if (err) {
                console.log(err.message);
             } else {
                // 查看数据库中所有的表
                connect.query('SHOW FULL TABLES',function(err,result){
                    if(err){
                        console.log(`SQL error:${err}`)
                    }else{
                        console.log(result);
                    }
                });
             }
        });
    }
})

在这里插入图片描述

3.总结

篇②主要介绍nodejs下的mysql简单使用,关于mysql深入学习请自行搜索学习,博主很难在一篇文章中深入讲解,更多的是抛砖引玉。麻雀虽小五脏俱全,初学者需要慢慢理解并加以实际应用。

参考资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机菜鸟哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值