mysql2 是一个基于 Node.js 的 MySQL 客户端库,相比于 mysql 库,它具有以下几个优势:
性能更好:mysql2 库在性能方面进行了优化,使用了更高效的底层实现。它使用了更快的连接池管理和查询执行机制,可以处理更高的并发请求,提供更好的性能表现。
支持 Promise 和 async/await:mysql2 库原生支持 Promise 和 async/await,使得编写异步代码更加方便和直观。您可以使用 promise().query() 方法执行查询,并使用 await 关键字等待查询结果。
支持流式查询:mysql2 库支持流式查询,可以通过创建可读流来处理大型查询结果集。这对于处理大量数据或需要逐行处理结果的情况非常有用,可以减少内存占用并提高性能。
更好的错误处理:mysql2 库提供了更好的错误处理机制,可以更详细地捕获和处理数据库操作中的错误。它返回的错误对象包含更多有用的信息,如 SQL 语句、错误代码和错误堆栈等,有助于更好地调试和排查问题。
支持预处理语句:mysql2 库支持预处理语句,可以使用占位符来安全地构建和执行 SQL 查询。这可以防止 SQL 注入攻击,并提高应用程序的安全性。
npm install mysql2
要使用 mysql2 连接到 MySQL 数据库,您需要安装 mysql2 包,并使用适当的连接参数来创建连接。以下是一个示例,展示了如何使用 mysql2 连接到 MySQL 数据库:
const mysql = require("mysql2"); // 创建数据库连接 const connection = mysql.createConnection({ host: "localhost", // 主机地址 user: "root", // 用户名 password: "password", // 密码 port: 3306, // 端口号,默认为 3306 database: "mydatabase", // 数据库名称 charset: "UTF8_GENERAL_CI", // 连接字符集,默认为 UTF8_GENERAL_CI connectTimeout: 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()方法对数据库进行增删改查操作。
具体的语法格式:connection.query(sql,params,callback),以下是对 query() 方法的参数进行详细说明:
以下是一个示例,展示了如何使用 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 查询,并根据需要处理查询结果或错误。
以下是一个使用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()之间的区别:
通过重新使用以前的连接,连接池可以保持打开状态,从而减少连接到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()方法,也可以手动获取连接进行操作。下面是使用连接池进行数据库操作的示例代码:
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();
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();
在之前通过query()和execute()操作数据库时都是通过回调函数的形式获取放返回的数据。而我们可以使用Promise将异步转化为同步使用Promise来实现异步操作可以通过async/await和promise()函数两种方式。
下面是使用async/await和createConnection()、createPool()的方式创建数据库操作的示例代码:
const mysql = require('mysql2'); // 创建连接 const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'mydatabase' }); // 封装查询函数 function query(sql) { return new Promise((resolve, reject) => { connection.query(sql, function(err, results, fields) { if (err) { reject(err); } else { resolve(results); } }); }); } // 使用async/await进行数据库操作 async function fetchData() { try { const results = await query('SELECT * FROM users'); console.log(results); } catch (err) { console.log('[QUERY ERROR] - ', err.message); } finally { connection.end(); } } fetchData();
const mysql = require('mysql2'); // 创建连接池 const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'mydatabase', connectionLimit: 10 }); // 封装查询函数 function query(sql) { return new Promise((resolve, reject) => { pool.query(sql, function(err, results, fields) { if (err) { reject(err); } else { resolve(results); } }); }); } // 使用async/await进行数据库操作 async function fetchData() { 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();
const mysql = require('mysql2'); // 创建连接 const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'mydatabase' }); // 封装查询函数 function query(sql) { return new Promise((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。