MySQL: Desenvolvimento prático: conectando o Node.js ao MySQL

Última atualização: 2026-08-26

Para desenvolvedores front-end que estão aprendendo desenvolvimento back-end, o Node.js + MySQL é o melhor ponto de partida.

Esta aula explica como trabalhar com o MySQL usando o Node.js.

100%
graph TB
    A[Node.js Applications] --> B[mysql2 Driver]
    B --> C[Connection Pool]
    C --> D[Get the link]
    D --> E[Parametric Queries]
    E --> F{Operation Type}
    F -->|Search| G[execute SELECT]
    F -->|Insert| H[execute INSERT]
    F -->|Update| I[execute UPDATE]
    F -->|Delete| J[execute DELETE]
    F -->|Transactions| K[beginTransaction]
    K --> L[commit / rollback]
    D --> M[Release the connection back to the pool]

1. O que você vai aprender


2. Uma história real

(1) Desafio: Ter aprendido SQL, mas não saber como aplicá-lo em projetos

Desenvolvedores front-end que aprenderam SQL muitas vezes ficam perdidos ao escrever código back-end com Node.js: a concatenação manual de strings SQL os torna vulneráveis a ataques de injeção, o gerenciamento inadequado das conexões leva ao esgotamento das conexões com o banco de dados e os callbacks assíncronos aninhados tornam o código difícil de manter.

(2) Solução para pool de conexões no MySQL 2+ + consultas parametrizadas

Utilize o driver mysql2 (que oferece suporte a Promises), o pool de conexões para gerenciar conexões e consultas parametrizadas para evitar ataques de injeção.

Dimensão Criação manual de consultas SQL Pool de conexões do MySQL 2+
Risco de injeção de SQL Extremamente alto Zero (consultas parametrizadas)
Gerenciamento de conexões Não gerenciado (pode esgotar-se) Gerenciamento automático (agrupamento e reutilização)
Estilo de codificação Callback Hell async/await
Pronto para produção

3. Instalação e conexão

▶ Exemplo: Instalando o mysql2

BASH
npm install mysql2

▶ Exemplo: Criando uma conexão

JAVASCRIPT
// ⚙️ Requires: npm install mysql2, running MySQL server
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();
▶ Experimente

4. Pool de conexões

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

// Querying Using a Connection Pool
async function queryWithPool() {
    const [rows] = await pool.execute('SELECT * FROM users WHERE id = ?', [1]);
    console.log(rows);
}
queryWithPool();

5. Operações CRUD

▶ Exemplo: Consulta de dados

JAVASCRIPT
// Search All Users
async function queryUsers() {
    const [users] = await pool.execute('SELECT * FROM users');

    // Conditional Query
    const userId = 1;
    const [user] = await pool.execute(
        'SELECT * FROM users WHERE id = ?',
        [userId]
    );
    console.log(users, user);
}
queryUsers();
▶ Experimente

▶ Exemplo: Inserção de dados

JAVASCRIPT
async function insertUser() {
    const [result] = await pool.execute(
        'INSERT INTO users (username, email) VALUES (?, ?)',
        ['alice', 'alice@email.com']
    );
    console.log(result.insertId);
}
insertUser();
▶ Experimente

▶ Exemplo: Atualização de dados

JAVASCRIPT
async function updateUser() {
    const [result] = await pool.execute(
        'UPDATE users SET email = ? WHERE id = ?',
        ['new@email.com', 1]
    );
    console.log(result.affectedRows);
}
updateUser();
▶ Experimente

▶ Exemplo: Exclusão de dados

JAVASCRIPT
async function deleteUser() {
    const [result] = await pool.execute(
        'DELETE FROM users WHERE id = ?',
        [1]
    );
    console.log(result.affectedRows);
}
deleteUser();
▶ Experimente

6. Prevenção de injeção de SQL

(1) Erro: concatenação de strings

JAVASCRIPT
// Danger! SQL injection
const sql = `SELECT * FROM users WHERE username = '${username}'`;

(2) Correto: Consulta parametrizada

JAVASCRIPT
// Safe: Parameterized query
async function safeQuery(username) {
    const [rows] = await pool.execute(
        'SELECT * FROM users WHERE username = ?',
        [username]
    );
    console.log(rows);
}
safeQuery('alice');

7. Encapsulamento de transações

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. Introdução ao ORM

ORM Descrição
Sequelize Um ORM de longa data com uma gama completa de recursos
Prisma Segurança de última geração, baseada em tipos
TypeORM Bom suporte a TypeScript
Knex.js Construtor de consultas
JAVASCRIPT
// Prisma Example
async function getActiveUsers() {
    const users = await prisma.user.findMany({
        where: { status: 'active' },
        include: { orders: true }
    });
    console.log(users);
}
getActiveUsers();

❓ Perguntas Frequentes

P: Devo usar o mysql ou o mysql2? R: Recomendamos o mysql2 (ele oferece suporte a Promises e apresenta melhor desempenho).

P: Qual deve ser o tamanho do pool de conexões? R: Geralmente, entre 10 e 20, ajustado de acordo com a simultaneidade.

P: Quando se deve usar o ORM? R: Use o ORM para simplificar o desenvolvimento em projetos complexos; use SQL nativo para obter maior flexibilidade em projetos simples.

P: Qual é a diferença entre mysql e mysql2? R: O mysql é o driver mais antigo, que suporta apenas callbacks, enquanto o mysql2 suporta Promises e oferece melhor desempenho. Recomendamos o mysql2.

P: Qual deve ser o tamanho do pool de conexões? R: A fórmula é: número de núcleos da CPU × 2 + número de discos; para um aplicativo web típico, 10 a 20 é suficiente.


📖 Resumo


📝 Exercícios

  1. Problema básico (Dificuldade: ⭐): Use o Node.js para se conectar ao MySQL, consultar o banco de dados e exibir a lista de usuários.

  2. Exercício avançado (Dificuldade: ⭐⭐): Implemente uma API CRUD completa (Criar, Ler, Atualizar, Excluir).

  3. Desafio (Dificuldade: ⭐⭐⭐): Implemente um recurso de transferência de fundos, incluindo transações e tratamento de erros.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%