不定期更新,建议关注收藏点赞。
还在用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)。
原理:
- 先告诉 MySQL:我要执行一个 SQL 模板(里面有 ? 占位符)
- 告诉 MySQL:? 的值是 1(或其他用户输入的内容)
- MySQL 自动对参数做转义,不管你传入什么内容(字符串、特殊符号、恶意代码),它都不会被当作 SQL 语法的一部分。
- 如果传入sql注入代码
['1 OR 1=1']
,MySQL2 会自动变成:SELECT * FROM users WHERE id = '1 OR 1=1'
这时候就只是查 id 为 “1 OR 1=1” 的记录,而不是执行 OR 逻辑。攻击失效。 - mysql 包(老版本)也支持 ? 占位符,并且也可以有效防止 SQL 注入,和 mysql2 的基本原理是一样的:使用占位符 + 参数绑定机制,让用户输入当作“值”处理,而不是“SQL 语句”。