在现代Web开发中,JavaScript(JS)与MySQL数据库的交互是常见需求,无论是构建动态网站还是开发应用程序,查询MySQL数据库都是核心功能之一,本文将详细介绍JS如何查询MySQL数据库,包括环境搭建、连接方式、查询方法及最佳实践,帮助开发者快速上手。

环境准备与依赖安装
在开始之前,需要确保开发环境已配置妥当,安装Node.js,这是运行JS服务器的必要条件,根据项目需求选择合适的MySQL驱动,对于Node.js,常用的驱动有mysql2和mysql,其中mysql2性能更优且支持Promise,可以通过npm安装:
npm install mysql2
确保MySQL数据库已安装并运行,创建测试数据库和表,
CREATE DATABASE test_db; USE test_db; CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50));
连接MySQL数据库
JS与MySQL的交互需要先建立连接,使用mysql2模块,可以通过以下代码创建连接:
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test_db',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
这里使用了连接池(Connection Pool),可以有效管理数据库连接,避免频繁创建和销毁连接带来的性能损耗。
执行查询语句
连接建立后,可以通过pool.query方法执行SQL查询,查询结果可以是单条记录或多条记录,具体取决于SQL语句,以下是一些常见查询示例:

查询多条记录
async function getUsers() {
try {
const [rows] = await pool.query('SELECT * FROM users');
console.log(rows);
} catch (error) {
console.error('Error fetching users:', error);
}
}
getUsers();
pool.query返回一个数组,第一个元素是查询结果,第二个是字段信息。
查询单条记录
async function getUserById(id) {
try {
const [rows] = await pool.query('SELECT * FROM users WHERE id = ?', [id]);
console.log(rows[0]);
} catch (error) {
console.error('Error fetching user:', error);
}
}
getUserById(1);
使用作为参数占位符,可以有效防止SQL注入攻击。
插入、更新和删除数据
// 插入数据
async function insertUser(name, email) {
try {
const [result] = await pool.query('INSERT INTO users (name, email) VALUES (?, ?)', [name, email]);
console.log('Inserted ID:', result.insertId);
} catch (error) {
console.error('Error inserting user:', error);
}
}
// 更新数据
async function updateUser(id, name) {
try {
const [result] = await pool.query('UPDATE users SET name = ? WHERE id = ?', [name, id]);
console.log('Affected rows:', result.affectedRows);
} catch (error) {
console.error('Error updating user:', error);
}
}
// 删除数据
async function deleteUser(id) {
try {
const [result] = await pool.query('DELETE FROM users WHERE id = ?', [id]);
console.log('Affected rows:', result.affectedRows);
} catch (error) {
console.error('Error deleting user:', error);
}
}
处理异步与错误
数据库操作是异步的,建议使用async/await语法简化代码,务必使用try-catch捕获错误,避免程序因未处理的异常而崩溃。
关闭数据库连接
虽然连接池会自动管理连接,但在某些情况下(如服务器关闭时),需要手动释放连接:
pool.end().then(() => {
console.log('Database pool closed.');
});
最佳实践
- 使用参数化查询:避免SQL注入,永远不要直接拼接SQL字符串。
- 合理配置连接池:根据应用负载调整连接池大小,避免资源浪费或不足。
- 优化查询性能:使用索引、避免
SELECT *、限制返回数据量等。 - 日志记录:记录查询错误和执行时间,便于排查问题。
相关问答FAQs
Q1: 为什么推荐使用mysql2而不是mysql?
A1: mysql2是mysql的升级版,支持Promise API,代码更简洁;同时性能更好,支持更高的并发量。mysql2还提供了额外的功能,如支持预处理语句和JSON数据类型。

Q2: 如何处理数据库连接超时问题?
A2: 可以通过设置connectTimeout参数调整连接超时时间(默认为10秒)。
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
connectTimeout: 30000, // 30秒超时
// 其他配置...
});
如果频繁出现超时,可能是数据库服务器负载过高或网络问题,建议检查服务器状态和网络连接。