0


Nodejs使用mysql2操作数据库【完整讲解】

mysql2 相比于 mysql 的优势

mysql2 是一个基于 Node.js 的 MySQL 客户端库,相比于 mysql 库,它具有以下几个优势:

  1. 性能更好:mysql2 库在性能方面进行了优化,使用了更高效的底层实现。它使用了更快的连接池管理和查询执行机制,可以处理更高的并发请求,提供更好的性能表现。
  2. 支持 Promise 和 async/await:mysql2 库原生支持 Promise 和 async/await,使得编写异步代码更加方便和直观。您可以使用 promise().query() 方法执行查询,并使用 await 关键字等待查询结果。
  3. 支持流式查询:mysql2 库支持流式查询,可以通过创建可读流来处理大型查询结果集。这对于处理大量数据或需要逐行处理结果的情况非常有用,可以减少内存占用并提高性能。
  4. 更好的错误处理:mysql2 库提供了更好的错误处理机制,可以更详细地捕获和处理数据库操作中的错误。它返回的错误对象包含更多有用的信息,如 SQL 语句、错误代码和错误堆栈等,有助于更好地调试和排查问题。
  5. 支持预处理语句:mysql2 库支持预处理语句,可以使用占位符来安全地构建和执行 SQL 查询。这可以防止 SQL 注入攻击,并提高应用程序的安全性。

安装

npminstall mysql2

连接数据库

要使用 mysql2 连接到 MySQL 数据库,您需要安装 mysql2 包,并使用适当的连接参数来创建连接。以下是一个示例,展示了如何使用 mysql2 连接到 MySQL 数据库:

const mysql =require("mysql2");// 创建数据库连接const connection = mysql.createConnection({host:"localhost",// 主机地址user:"root",// 用户名password:"password",// 密码port:3306,// 端口号,默认为 3306database:"mydatabase",// 数据库名称charset:"UTF8_GENERAL_CI",// 连接字符集,默认为 UTF8_GENERAL_CIconnectTimeout:10000,// 连接超时时间,单位为毫秒multipleStatements:false// 是否允许一个 query 中有多个 MySQL 语句,默认为 false});// 连接到数据库
connection.connect((err)=>{if(err){
    console.error("Error connecting to database:", err);return;}
  console.log("Connected to database");// 在这里执行数据库操作});// 在数据库连接关闭时触发
connection.on("end",()=>{
  console.log("Database connection closed");});// 在发生错误时触发
connection.on("error",(err)=>{
  console.error("Database error:", err);});// 关闭数据库连接
connection.end();

在这个示例中,我们使用

mysql.createConnection()

方法创建了一个数据库连接,并传递了连接参数(主机名、用户名、密码和数据库名称)。然后,我们使用

connection.connect()

方法来连接到数据库。

在连接成功后,您可以在回调函数中执行数据库操作。在这个示例中,我们只是简单地输出连接成功的消息,但您可以在这里执行任何数据库操作,如查询、插入、更新等。

请注意,为了确保数据库连接的正确关闭,我们监听了

end

事件,并在事件处理程序中关闭了连接。此外,我们还监听了

error

事件,以处理可能发生的数据库错误。

最后,我们使用

connection.end()

方法来关闭数据库连接。

请根据您的实际情况修改连接参数,以适应您的 MySQL 数据库的配置。

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

连接数据库之后,可以使用

query()

方法对数据库进行增删改查操作。

具体的语法格式:

connection.query(sql,params,callback)

,以下是对

query()

方法的参数进行详细说明:

  • sql:要执行的 SQL 查询语句,可以是 SELECT、INSERT、UPDATE、DELETE 等。
  • params(可选):一个数组,包含要传递给 SQL 查询的参数。这些参数可以用于预处理语句中的占位符。
  • callback:一个回调函数,用于处理查询结果或错误。回调函数接收两个参数:errresultserr 是一个错误对象(如果有错误发生),results 是查询结果。

以下是一个示例,展示了如何使用

query()

方法执行 SQL 查询并处理结果:

const mysql =require("mysql2");// 创建数据库连接const connection = mysql.createConnection({host:"localhost",user:"root",password:"password",database:"mydatabase"});// 连接到数据库
connection.connect((err)=>{if(err){
    console.error("Error connecting to database:", err);return;}
  console.log("Connected to database");// 执行 SQL 查询,可以用??代替表名、字段、索引名;用?代替数据。const sql ="SELECT * FROM users WHERE age > ?";const params =[18];
  connection.query(sql, params,(err, results)=>{if(err){
      console.error("Error executing query:", err);return;}
    console.log("Query results:", results);});});// 在数据库连接关闭时触发
connection.on("end",()=>{
  console.log("Database connection closed");});// 在发生错误时触发
connection.on("error",(err)=>{
  console.error("Database error:", err);});// 关闭数据库连接
connection.end();

在这个示例中,我们执行了一个 SELECT 查询,查找年龄大于 18 的用户。我们使用了预处理语句,并将参数

[18]

传递给

query()

方法。

在回调函数中,我们处理了查询结果或错误。如果查询成功,我们打印出查询结果

results

请根据您的实际需求修改 SQL 查询语句、参数和处理逻辑。您可以执行任何有效的 SQL 查询,并根据需要处理查询结果或错误。

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

以下是一个使用mysql2模块执行SQL查询的示例:

const mysql =require('mysql2');// 创建数据库连接const connection = mysql.createConnection({host:'localhost',user:'root',password:'password',database:'mydatabase'});// 执行SQL查询
connection.execute('SELECT * FROM users WHERE age > ?',[18],function(err, results, fields){if(err){
      console.log('[SELECT ERROR] - ', err.message);return;}
    console.log(results);// console.log(fields);});// 关闭数据库连接
connection.end();

在这个例子中,我们创建了一个名为

mydatabase

的数据库连接,并执行了一个查询语句,查找年龄大于18岁的用户。如果查询成功,结果将会在控制台打印出来。你可以取消注释掉

console.log(fields)

这行代码来查看字段信息。

请确保将

localhost

root

password

mydatabase

替换为你自己的数据库连接信息。

execute()

query()

之间的区别:

下面是

execute()

query()

之间的区别:

  1. 参数化查询:execute()方法支持参数化查询,可以使用占位符(例如?)来代替查询中的参数,而query()方法不支持参数化查询,需要通过字符串拼接来传递参数。
  2. 回调函数:execute()query()方法都接受一个回调函数作为参数,用于处理查询结果。但是,execute()方法的回调函数有三个参数(err, results, fields),分别表示错误信息、查询结果和字段信息;而query()方法的回调函数有两个参数(err, results),只表示错误信息和查询结果。
  3. 错误处理:在execute()方法中,需要手动处理错误,通过判断err参数是否存在来确定是否有错误发生。而query()方法会自动处理错误,如果发生错误,会将错误信息传递给回调函数的err参数。
  4. 返回结果:无论是execute()还是query()方法,都会返回一个结果集对象。但是,execute()方法返回的结果集对象中包含更多的信息,如受影响的行数等。
  5. 预编译:execute()方法支持预编译,可以提前编译SQL语句,以提高执行效率。而query()方法不支持预编译。

连接池

通过重新使用以前的连接,连接池可以保持打开状态,从而减少连接到MySQL服务器的时间。在Node.js中,可以使用

mysql.createPool()

方法来创建连接池。它的语法格式如下:

const mysql =require('mysql2');// 创建连接池const pool = mysql.createPool({host:'localhost',user:'root',password:'password',database:'mydatabase',connectionLimit:10,// 最大连接数queueLimit:0,// 排队等待连接的最大请求数,0表示无限制waitForConnections:true// 当连接池达到最大连接数时,是否等待可用连接});

使用连接池进行数据库操作可以使用

pool.query()

pool.execute()

方法,也可以手动获取连接进行操作。下面是使用连接池进行数据库操作的示例代码:

使用

pool.query()

方法:

const mysql =require('mysql2');// 创建连接池const pool = mysql.createPool({host:'localhost',user:'root',password:'password',database:'mydatabase',connectionLimit:10});// 使用pool.query()方法执行查询
pool.query('SELECT * FROM users',function(err, results, fields){if(err){
        console.log('[QUERY ERROR] - ', err.message);return;}

    console.log(results);});// 关闭连接池
pool.end();

使用

pool.execute()

方法:

const mysql =require('mysql2');// 创建连接池const pool = mysql.createPool({host:'localhost',user:'root',password:'password',database:'mydatabase',connectionLimit:10});// 使用pool.execute()方法执行查询
pool.execute('SELECT * FROM users',function(err, results, fields){if(err){
        console.log('[EXECUTE ERROR] - ', err.message);return;}

    console.log(results);});// 关闭连接池
pool.end();

手动获取连接进行数据库操作:

const mysql =require('mysql2');// 创建连接池const pool = mysql.createPool({host:'localhost',user:'root',password:'password',database:'mydatabase',connectionLimit:10});// 从连接池中获取连接
pool.getConnection(function(err, connection){if(err){
        console.log('[CONNECTION ERROR] - ', err.message);return;}// 执行查询操作
    connection.query('SELECT * FROM users',function(err, results, fields){
        connection.release();// 释放连接回连接池if(err){
            console.log('[QUERY ERROR] - ', err.message);return;}

        console.log(results);});});// 关闭连接池
pool.end();

使用 Promise

在之前通过query()和execute()操作数据库时都是通过回调函数的形式获取放返回的数据。而我们可以使用Promise将异步转化为同步使用Promise来实现异步操作可以通过async/await和promise()函数两种方式。

  • 一种是通过 async\await 来实现,
  • 种是通过 promise() 函数来实现。

下面是使用async/await和createConnection()、createPool()的方式创建数据库操作的示例代码:

使用async/await和createConnection()的方式:

const mysql =require('mysql2');// 创建连接const connection = mysql.createConnection({host:'localhost',user:'root',password:'password',database:'mydatabase'});// 封装查询函数functionquery(sql){returnnewPromise((resolve, reject)=>{
        connection.query(sql,function(err, results, fields){if(err){reject(err);}else{resolve(results);}});});}// 使用async/await进行数据库操作asyncfunctionfetchData(){try{const results =awaitquery('SELECT * FROM users');
        console.log(results);}catch(err){
        console.log('[QUERY ERROR] - ', err.message);}finally{
        connection.end();}}fetchData();

使用async/await和createPool()的方式:

const mysql =require('mysql2');// 创建连接池const pool = mysql.createPool({host:'localhost',user:'root',password:'password',database:'mydatabase',connectionLimit:10});// 封装查询函数functionquery(sql){returnnewPromise((resolve, reject)=>{
        pool.query(sql,function(err, results, fields){if(err){reject(err);}else{resolve(results);}});});}// 使用async/await进行数据库操作asyncfunctionfetchData(){let connection;try{
        connection =await pool.promise().getConnection();const results =await connection.query('SELECT * FROM users');
        console.log(results);}catch(err){
        console.log('[QUERY ERROR] - ', err.message);}finally{if(connection){
            connection.release();}
        pool.end();}}fetchData();

使用promise()函数和createConnection()的方式:

const mysql =require('mysql2');// 创建连接const connection = mysql.createConnection({host:'localhost',user:'root',password:'password',database:'mydatabase'});// 封装查询函数functionquery(sql){returnnewPromise((resolve, reject)=>{
        connection.query(sql,function(err, results, fields){if(err){reject(err);}else{resolve(results);}});});}// 使用promise()函数进行数据库操作query('SELECT * FROM users').then(results=>{
        console.log(results);}).catch(err=>{
        console.log('[QUERY ERROR] - ', err.message);}).finally(()=>{
        connection.end();});

无论是使用async/await还是promise()函数,都可以将异步操作转化为同步的方式来完成对数据库的操作。根据个人的喜好和项目需求,选择适合的方式来使用Promise。

标签: 数据库 mysql node.js

本文转载自: https://blog.csdn.net/No_Name_Cao_Ni_Mei/article/details/134827386
版权归原作者 wusp1994 所有, 如有侵权,请联系我们删除。

“Nodejs使用mysql2操作数据库【完整讲解】”的评论:

还没有评论