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.
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
- Instalação e conexão com o driver mysql2
- Configuração do pool de conexões
- Operações CRUD
- Consultas parametrizadas (prevenção de injeção de SQL)
- Encapsulamento de transações
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
npm install mysql2
▶ Exemplo: Criando uma conexão
// ⚙️ 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();
4. Pool de conexões
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
// 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();
▶ Exemplo: Inserção de dados
async function insertUser() {
const [result] = await pool.execute(
'INSERT INTO users (username, email) VALUES (?, ?)',
['alice', 'alice@email.com']
);
console.log(result.insertId);
}
insertUser();
▶ Exemplo: Atualização de dados
async function updateUser() {
const [result] = await pool.execute(
'UPDATE users SET email = ? WHERE id = ?',
['new@email.com', 1]
);
console.log(result.affectedRows);
}
updateUser();
▶ Exemplo: Exclusão de dados
async function deleteUser() {
const [result] = await pool.execute(
'DELETE FROM users WHERE id = ?',
[1]
);
console.log(result.affectedRows);
}
deleteUser();
6. Prevenção de injeção de SQL
(1) Erro: concatenação de strings
// Danger! SQL injection
const sql = `SELECT * FROM users WHERE username = '${username}'`;
(2) Correto: Consulta parametrizada
// 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
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 |
// 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
- mysql2 é um driver do MySQL para o Node.js que oferece suporte a Promises
- O pool de conexões reutiliza conexões para melhorar o desempenho
- Consultas parametrizadas evitam injeção de SQL
- Transações garantem a consistência dos dados
- O ORM simplifica as operações com bancos de dados
📝 Exercícios
-
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.
-
Exercício avançado (Dificuldade: ⭐⭐): Implemente uma API CRUD completa (Criar, Ler, Atualizar, Excluir).
-
Desafio (Dificuldade: ⭐⭐⭐): Implemente um recurso de transferência de fundos, incluindo transações e tratamento de erros.