【前后端】npm包mysql2的使用__nodejs mysql包升级版

发布于:2025-04-15 ⋅ 阅读:(29) ⋅ 点赞:(0)

不定期更新,建议关注收藏点赞。



还在用mysql包吗?已经过时啦!

简介

mysql2 是一个用于 Node.js 的 MySQL 数据库驱动,它是 mysql 包的升级版,性能更好,支持 Promise 和 async/await,非常适合现代 Node.js 开发。
安装很简单。npm install mysql2

使用说明

const mysql = require('mysql2');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database'
});

connection.connect();

connection.query('SELECT * FROM users', (error, results, fields) => {
  if (error) throw error;
  console.log(results); // 查询结果
});

connection.end();

  • Promise 方式(推荐)
    mysql2 提供 .promise() 接口,可以与 async/await 配合使用,非常方便。
const mysql = require('mysql2/promise');

async function main() {
  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'your_username',
    password: 'your_password',
    database: 'your_database'
  });

  const [rows, fields] = await connection.execute('SELECT * FROM users');
  console.log(rows); // 查询结果

  await connection.end();
}

main().catch(console.error);

//使用占位符防止 SQL 注入
//自动转义参数,防止 SQL 注入。
const [rows] = await connection.execute(
  'SELECT * FROM users WHERE id = ? AND status = ?',
  [1, 'active']
);

//生产环境 连接池
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

async function fetchUsers() {
  const [rows] = await pool.query('SELECT * FROM users');
  console.log(rows);
}
  • 用 ? 【占位符】的方式防止注入是怎么实现的?
    connection.execute('SELECT * FROM users WHERE id = ?', [1]); connection.execute('SELECT * FROM users WHERE id = ? AND status = ?', [1, 'active']);MySQL2 会使用 预处理语句(prepared statements)。
    原理:
  1. 先告诉 MySQL:我要执行一个 SQL 模板(里面有 ? 占位符)
  2. 告诉 MySQL:? 的值是 1(或其他用户输入的内容)
  3. MySQL 自动对参数做转义,不管你传入什么内容(字符串、特殊符号、恶意代码),它都不会被当作 SQL 语法的一部分。
  4. 如果传入sql注入代码['1 OR 1=1'],MySQL2 会自动变成:SELECT * FROM users WHERE id = '1 OR 1=1'这时候就只是查 id 为 “1 OR 1=1” 的记录,而不是执行 OR 逻辑。攻击失效。
  5. mysql 包(老版本)也支持 ? 占位符,并且也可以有效防止 SQL 注入,和 mysql2 的基本原理是一样的:使用占位符 + 参数绑定机制,让用户输入当作“值”处理,而不是“SQL 语句”。