MySQL: Node.js连接MySQL实战开发

最后更新:2026-08-26

前端开发者学后端,Node.js + MySQL 是最佳起点。

本课讲解用 Node.js 操作 MySQL。

100%
graph TB
    A[Node.js 应用] --> B[mysql2 驱动]
    B --> C[连接池]
    C --> D[获取连接]
    D --> E[参数化查询]
    E --> F{操作类型}
    F -->|查询| G[execute SELECT]
    F -->|插入| H[execute INSERT]
    F -->|更新| I[execute UPDATE]
    F -->|删除| J[execute DELETE]
    F -->|事务| K[beginTransaction]
    K --> L[commit / rollback]
    D --> M[释放连接回池]

1. 你将学到


2. 一个真实的故事

(1) 痛点:学完SQL却不会在项目中用

前端开发者学完了 SQL,但用 Node.js 写后端时一脸茫然:手写 SQL 字符串拼接容易被注入,连接管理混乱导致数据库连接耗尽,异步回调嵌套让代码难以维护。

(2) mysql2+连接池+参数化查询的解法

用 mysql2 驱动(支持 Promise)、连接池管理连接、参数化查询防注入。

维度 手动拼接SQL mysql2+连接池
SQL注入风险 极高 零(参数化查询)
连接管理 混乱(可能耗尽) 自动管理(池化复用)
代码风格 回调地狱 async/await
生产就绪

3. 安装与连接

▶ 示例:安装 mysql2

BASH
npm install mysql2

▶ 示例:创建连接

JAVASCRIPT
const mysql = require('mysql2/promise');

async function main() {
    const connection = await mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'Root123!',
        database: 'mydb'
    });
    
    const [rows] = await connection.execute('SELECT VERSION()');
    console.log(rows);
    
    await connection.end();
}

main();
▶ 试一试

4. 连接池

JAVASCRIPT
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'Root123!',
    database: 'mydb',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

// 使用连接池查询
const [rows] = await pool.execute('SELECT * FROM users WHERE id = ?', [1]);

5. CRUD 操作

▶ 示例:查询数据

JAVASCRIPT
// 查询所有用户
const [users] = await pool.execute('SELECT * FROM users');

// 条件查询
const [user] = await pool.execute(
    'SELECT * FROM users WHERE id = ?', 
    [userId]
);
▶ 试一试

▶ 示例:插入数据

JAVASCRIPT
const [result] = await pool.execute(
    'INSERT INTO users (username, email) VALUES (?, ?)',
    ['alice', 'alice@email.com']
);
console.log(result.insertId);
▶ 试一试

▶ 示例:更新数据

JAVASCRIPT
const [result] = await pool.execute(
    'UPDATE users SET email = ? WHERE id = ?',
    ['new@email.com', 1]
);
console.log(result.affectedRows);
▶ 试一试

▶ 示例:删除数据

JAVASCRIPT
const [result] = await pool.execute(
    'DELETE FROM users WHERE id = ?',
    [1]
);
console.log(result.affectedRows);
▶ 试一试

6. 防止 SQL 注入

(1) 错误:字符串拼接

JAVASCRIPT
// 危险!SQL 注入
const sql = `SELECT * FROM users WHERE username = '${username}'`;

(2) 正确:参数化查询

JAVASCRIPT
// 安全:参数化查询
const [rows] = await pool.execute(
    'SELECT * FROM users WHERE username = ?',
    [username]
);

7. 事务封装

JAVASCRIPT
async function transfer(fromId, toId, amount) {
    const conn = await pool.getConnection();
    
    try {
        await conn.beginTransaction();
        
        await conn.execute(
            'UPDATE accounts SET balance = balance - ? WHERE id = ?',
            [amount, fromId]
        );
        
        await conn.execute(
            'UPDATE accounts SET balance = balance + ? WHERE id = ?',
            [amount, toId]
        );
        
        await conn.commit();
        return { success: true };
    } catch (error) {
        await conn.rollback();
        return { success: false, error: error.message };
    } finally {
        conn.release();
    }
}

8. ORM 简介

ORM 说明
Sequelize 老牌 ORM,功能全
Prisma 新一代,类型安全
TypeORM TypeScript 支持好
Knex.js 查询构建器
JAVASCRIPT
// Prisma 示例
const users = await prisma.user.findMany({
    where: { status: 'active' },
    include: { orders: true }
});

❓ 常见问题

Q 用 mysql 还是 mysql2?
A 推荐 mysql2(支持 Promise、性能更好)。
Q 连接池大小设多少?
A 一般 10-20,根据并发量调整。
Q 什么时候用 ORM?
A 复杂项目用 ORM 简化开发,简单项目用原生 SQL 更灵活。
Q mysql 和 mysql2 区别?
A mysql 是旧驱动只支持回调,mysql2 支持 Promise+性能更好,推荐 mysql2。
Q 连接池大小设多少?
A 公式为 CPU核心数×2+磁盘数,普通 Web 应用 10-20 即可。

📖 小节


📝 作业

  1. 基础题(难度⭐):用 Node.js 连接 MySQL,查询并打印用户列表。

  2. 进阶题(难度⭐⭐):实现完整的 CRUD API(增删改查)。

  3. 挑战题(难度⭐⭐⭐):实现转账功能,包含事务和错误处理。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏