Node第三方包 【mysql2】

news2024/12/24 3:43:10

文章目录

  • 🌟前言
  • 🌟访问数据库
  • 🌟MySQL驱动
  • 🌟mysql2
    • 🌟安装
  • 🌟方法
    • 🌟连接数据库
    • 🌟通过 query() 方法执行SQL语句
    • 🌟通过 execute() 方法执行SQL语句
  • 🌟使用连接池
    • 🌟连接池技术介绍
    • 🌟mysql2连接池
  • 🌟使用 Promise
    • 🌟async\await操作数据库
    • 🌟promise()函数操作数据库
  • 🌟写在最后

在这里插入图片描述

🌟前言

哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们带领大家初识一下 Node第三方包 mysql2 ;让我们一起来看看吧🤘

🌟访问数据库

如果要在Nodejs中去访问一个MySQL数据库,必须安装一个MySQL驱动,有了这个MySQL驱动才能跟MySQL数据库建立连接,然后执行各种各样的SQL语句。

🌟MySQL驱动

如果我们要访问数据库,必须得跟数据库建立一个网络连接,那么这个连接由谁来建立呢?

其实答案就是这个MySQL驱动,他会在底层数据库建立网络连接,有网络连接,接着才能去发送请求给数据库服务器!

在这里插入图片描述

因此,操作MySQL需要Nodejs版本的MySQL驱动,对于Java、PHP、Perl、.NET、Python、Ruby等各种常见的编程语言,MySQL都会提供对应语言的MySQL驱动,让各种语言编写的系统通过MySQL驱动去访问数据库。

🌟mysql2

mysql2是一个高性能的MySQL驱动程序。

为什么使用mysql2而不是经典的mysql库?主要基于以下原因:

  • 更高的性能!
  • 支持PreparedStatement,多次查询性能更高,书写SQL更简单;
  • 自带Promise包装器,可以直接使用async/await语法;
  • 绝大部分api和mysql库兼容,意味着mysql的文档和线上资料亦可作为参考。

PreparedStatement是预编译的,对于批量处理可以大大提高效率会。也就是说PreparedStatement先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。

🌟安装

npm install --save mysql2

示例

const mysql = require('mysql2');
// 创建到数据库的连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'test'
});

// 简单查询
connection.query(
  'SELECT * FROM `table` WHERE `name` = "Page" AND `age` > 45',
  function(err, results, fields) {
    console.log(results); // results contains rows returned by server
    console.log(fields); // fields contains extra meta data about results, if available
  }
);

// 使用占位符
connection.query(
  'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
  ['Page', 45],
  function(err, results) {
    console.log(results);
  }
);

🌟方法

🌟连接数据库

使用数据库之前,需要先连接数据库。语法格式:

mysql.createConnection(option)

其中 option 为连接数据库的配置项。如下为部分配置项:

参数名称参数描述
host主机地址 (默认:localhost)
user用户名
password密码
port端口号 (默认:3306)
database数据库名
charset连接字符集(默认:‘UTF8_GENERAL_CI’,注意字符集的字母必须大写)
connectTimeout连接超时(单位:毫秒)
multipleStatements是否许一个query中有多个MySQL语句( 默认: false)

我们使用语句创建一个连接:

const mysql = require('mysql2');
// 创建到数据库的连接
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'test'
});

🌟通过 query() 方法执行SQL语句

连接数据库之后,可以使用query()方法对数据库执行SQL操作。语法格式:

connection.query(sql,params,callback)
参数名称参数描述
sql表示具体的SQL语句,可以使用 PreparedStatement 防止SQL注入。
params表示参数,使用方法如下例。
callback是一个回调函数,表示执行完成之后,返回结果。有三个参数(err, results, fields),分别表示错误信息,结果,表的字段信息。

也可以通过组装SQL语句,可以用??代替表名、字段、索引名;用?代替数据。具体实例如下所示:

connection.query(
    'SELECT * from xxx where id=?',
    [100],
    function (error, results, fields) {
        if (error) throw error;
        console.log('The solution is: ', results[0].solution);
    }
);

🌟通过 execute() 方法执行SQL语句

execute()方法也是用于执行SQL语句

connection.execute(
    'select * from admin where AdminID = ?', [2],
    function(err, results, fields) {
        if (err) {
            console.log('[SELECT ERROR] - ', err.message);
            return;
        }
        console.log(results);
        // console.log(fields);
    }
)

execute()和query()之间的区别:

  • query是在node装SQL语句,而 execute 则是利用MySQL 的 PreparedStatement 机制来预编译SQL语句
  • execute 的优势是数据库原生支持的预编译机制,性能更高
  • query 的优势是更灵活,例如可以用??代替表名、字段、索引名;用?代替数据

🌟使用连接池

🌟连接池技术介绍

服务器可以快速创建和断开数据库连接,但对于高并发的后端服务器而言,数据库连接的频繁创建与断开,是非常重的负担。若在客户端与服务端交互前,可以事先创建若干连接并提前放置在连接池中,需要时可以从连接池直接获取,数据传输完成后,将连接归还至连接池中,从而减少频繁创建和释放连接所造成的开销。

连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

在这里插入图片描述
在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接池中获取,这样就可以避免连接随意的建立、关闭造成的开销。

当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。如果存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。如果没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最大连接数),如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的maxWaitTime(最大等待时间)进行等待,如果等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。

🌟mysql2连接池

具体的语法格式:

mysql.createPool()

其中的参数和createConnection()中的参数基本相同,但是多了几个对连接池的设定:

参数名称参数描述
host主机地址 (默认:localhost)
user用户名
password密码
port端口号 (默认:3306)
database数据库名
charset连接字符集(默认:‘UTF8_GENERAL_CI’,注意字符集的字母必须大写)
connectTimeout连接超时(单位:毫秒)
multipleStatements是否许一个query中有多个MySQL语句( 默认: false)
waitForConnections表示连接超额是否等待
connectionLimit一次创建的最大连接数
queueLimit表示可以等待的连接的个数一次创建的最大连接数
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    database: 'test',
    password: "123456",
    waitForConnections: true, //连接超额是否等待
    connectionLimit: 10, //一次创建的最大连接数
    queueLimit: 0 //可以等待的连接的个数
});

在创建完连接池之后,可以使用和createConnection()连接相同的方式使用池(使用pool.query()和pool.execute()。也可以通过连接池手动获取连接进行数据库操作。

🌟使用 Promise

通过query()和execute()操作数据库时都是通过回调函数的形式获取放返回的数据。而我们可以使用Promise将异步转化为同步,以同步的方式来完成对数据库的操作。

在使用 Promise 时,分为两种方式:

  • 通过 async\await 来实现
  • 通过 promise() 函数来实现

在使用 Promise 时,需要require mysql2/promise:

const mysql = require('mysql2/promise');

🌟async\await操作数据库

通过async\await 和createConnection()的方式结合进行数据库操作

const mysql = require('mysql2/promise');
async function pro_createConnection() {
    let connection = await mysql.createConnection({
        host: "localhost",
        user: "root",
        password: "123456",
        database: "student",
        multipleStatements: true
    });

    let [results] = await connection.execute(
        'select * from admin where AdminID = ?', [1]
    )
    console.log(results);
}
pro_createConnection();

通过async\await 和createPool()的方式结合进行数据库操作

const mysql = require('mysql2/promise');
const pool = mysql.createPool({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "student",
    waitForConnections: true, //连接超额是否等待
    connectionLimit: 10, //一次创建的最大连接数
    queueLimit: 0 //可以等待的连接的个数
});
async function pro_createPool() {

    let [results] = await pool.execute(
        'select * from admin where AdminID = ?', [1]
    )
    console.log(results);
}
pro_createPool()

🌟promise()函数操作数据库

通过 promise() 函数和createConnection()的方式结合进行数据库操作

const mysql = require('mysql2');
let connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "student",
    multipleStatements: true
});
connection.promise().query('select * from admin where AdminID = ?', [1])
    .then(([rows, fields]) => {
        console.log(rows);
    })
    .catch(console.log)
    .then(() => connection.end());

通过 promise() 函数 和 createPool() 的方式结合进行数据库操作

const pool = mysql.createPool({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "student",
    waitForConnections: true, //连接超额是否等待
    connectionLimit: 10, //一次创建的最大连接数
    queueLimit: 0 //可以等待的连接的个数
});
pool.promise().query('select * from admin where AdminID = ?', [1])
    .then(([rows, fields]) => {
        console.log(rows);
    })
    .catch(console.log)

在使用 Promise 完成数据库操作时,除了上述实例中需要添加的部分,其余部分,如创建连接和连接池,query() 和 execute() 等的使用方法不变。

🌟写在最后

更多Node知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

研报精选230419

目录 【行业230419东吴证券】AACR2023本土药企临床进展:“秒懂”全球创新药系列研究之会议追踪 【行业230419浙商证券】大制造行业估值手册:周度数据跟踪 【行业230419东方财富证券】2023上海车展前瞻:自主争先,迎接智能电动新时代…

#Chrome扩展程序开发教程--03:Manifest

#Chrome扩展程序开发教程--03:Manifest 引言1、基本介绍2、必须属性3、重要属性3.1、permissions、host_permissions、optional_permissions、optional_host_permissions3.2、background3.3、content_scripts3.4、action3.5、options_page3.6、options_ui3.7、icons…

C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

TiDB实战篇-Data Migration (DM) 同步数据

目录 简介 原理 任务管理 ​编辑同步拓扑示例 使用场景 限制 硬件配置 安装&升级 部署 生成配置文件 生成配置文件模板 更具自身的机器修改 部署 启动集群&查看集群 实战 上游数据库前提 配置mysql的相关配置 编写DM的MySQL相关配置 把MySQL和DM …

【JavaEE】Bean的作用域和生命周期

目录 Bean的作用域 作用域分类 设置作用域 通过注解设置 通过配置文件设置 Bean的生命周期 Bean的作用域 Bean的作用域是指:在整个Spring容器中Bean的行为模式。这个模式有六种。 作用域分类 singleton:单例作用域。 在这个模式下,容器…

网络地址转换应用

如图所示,企业使用一台AR 路由器作为出口设备,路由器配置NAT Outbound为私网用户提供访问Internet服务,同时配置NAT Server将私网WEB服务器发布到公网上,对外网用户提供服务。运营商仅为该单位分配了一个公网IP,此地址既作为AR出接口的IP地址,也作为NAT Outbound和NAT Se…

【Atlas500】华为Atals MindStudio配置指南

目录 安装推理用ubuntu版docker配置docker内的ssh服务安装ubuntu系统中的依赖项:检查root用户的umask安装依赖项安装CANN连接到CANN Setting 安装推理用ubuntu版docker 华为的atlas500自带的欧拉系统是一个裁剪系统,一般通过在其上运行官方的ubuntu dock…

【消息队列】Kafka高水位和Leader Epoch原理

什么是高水位 首先高水位也就是HW,而对应的有LEO,其实这都是Kafka副本中针对位移的概念,其目的就是为了保证多副本间数据的一致性。 LEO (Log End Offet):每个副本的最后一个offset,LEO其实就是…

你猜我猜不猜 (猜数字游戏) 快来小玩一把叭

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C语言》专栏,笔者用重金(时间和精力)打造,将C语言知识一网打尽,希望可…

解决Vue热更新失效问题

解决Vue热更新失效 一、问题描述二、出现原因三、解决方案四、总结 🚀 欢迎访问我的个人博客:https://wk-blog.vip 一、问题描述 之前在本地测试Vue项目时,是可以热更新的,但是最近一段时间发现Vue的热更新失效了。然后通过vs co…

【大厂直通车】美团_测开面经

哈喽,大家好,我是小浪;那么最近暑假实习,日常实习是卷的飞起,无论是开发岗,测试岗,算法岗,都一片死寂;不过还是有很多大佬,成功绞杀很多大厂,offer也是拿到手软; 团子暑期实习offer: 📱本专栏致力于持续更新最新各大厂面经,实习消息,招聘要求; 那么目前价格…

ISCSI个人理解与简要说明

ISCSI个人理解与简要说明 一、如何理解ISCSI二、iscsi 命令iscsiadm(管理客户端)tgtadm(管理服务端) 三、ISCSI中的概念四、从DAS,NAS,SAN的角度扩展理解ISCSI 一、如何理解ISCSI 理解一个东西&#xff0c…

Niginx的rewrite

常用的Nginx正则表达式 ^匹配输入字符串的起始位置 $匹配输入字符串的结束位置 *匹配前面的字符零次或多次。如“ol*" 能匹配"o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol" 能匹配“ol"及“ol1”、“olll", 但不能匹配“o” ?…

服务器版本的表白墙

目录 1.步骤 2.提供两个接口: 3.流程 4.代码 1.前端代码 2.sql创建表 3.后端代码 MessageServlet.java DBUtil.java 1.步骤 1.约定前后端交互的接口 2.开发服务器代码 a.编写servlet处理前端发来的请求 b.编写数据库代码,存储获取关键的数据 3.开发客户端代码 a.基于…

java学习中遇到的问题及解答

你好,我想问一下,为什么在idea编译环境下,有异常的地方它会报错,让你主动添加抛出错误代码呢? 在Java中,有两种类型的异常,一种是受检异常(checked exception)&#xff0…

一级结构规范 合集

极限状态设计原则4.1限态4.11 极限状态可分为承载能力极限状态、正常使用极限状态和耐久性极限状态。极限状态应符合下列规定:1当结构或结构构件出现下列状态之一时,应认定为超过了承载能力极限状态;1) 结构构件或连接因超过材料强度而破坏,或因过度变形…

安捷伦E4433B信号发生器

E4433B Agilent E4433B ESG-D系列 4G信号发生器安捷伦250kHz-4GHz 品  牌: Agilent 简单介绍 频率范围: E4430B 250K-1GHz E4431B 250K-2GHz E4432B 250K-3GHz E4433B 250K-4GHz 18320918653 供单信道和多信道CDMA用的测量卡用于I和Q的20 MH…

第六章 建造者模式

文章目录 前言一、传统方式解决盖房子需求完整代码抽象房子类 AbstractHouse实现子类 普通房子实现子类 高楼大厦客户端盖房子 二、引入建造者模式建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者完整代码House类 (产品角色)抽象父类(抽象建…

Node内置模块 【Event事件模块】

文章目录 🌟前言🌟Event事件模块🌟EventEmitter类🌟加载events模块🌟实例化eventEmitter对象 🌟事件方法列表🌟使用事件🌟异步与同步 🌟写在最后 🌟前言 哈喽…

ZLMeidiaKit实现推流时(FFmpeg推rtmp流)时非127.0.0.1被拒绝需要鉴权的解决方式

场景 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放: 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放_霸道流氓气质的博客-CSDN博客 在上面搭建ZLMedia…