Node.js 操作 MySQL 数据库

环境检查
  1. Node.js 环境验证

    bash 复制代码
    node -v  # 确认版本 ≥14.x
    npm -v    # 确认能正常输出
  2. MySQL 服务检查

    bash 复制代码
    # Linux
    systemctl status mysql
    
    # Windows (CMD)
    sc query MySQL

数据库与表创建
  1. 创建数据库

    sql 复制代码
    CREATE DATABASE users 
      CHARACTER SET utf8mb4 
      COLLATE utf8mb4_unicode_ci;
    USE users;
  2. 关闭外键检查并建表

    sql 复制代码
    SET FOREIGN_KEY_CHECKS = 0;
    
    CREATE TABLE t_users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(100) NOT NULL,
      gender TINYINT(1),
      borndate DATE,
      address VARCHAR(255)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    -- 插入测试数据
    INSERT INTO t_users (name, gender, borndate, address) VALUES
    ('郭靖', 1, '2000-01-01', '襄阳'),
    ('黄蓉', 0, '2001-05-05', '桃花岛');
    
    SET FOREIGN_KEY_CHECKS = 1;

Node.js 连接数据库
  1. 项目初始化

    bash 复制代码
    npm init -y
    npm install mysql2
  2. index.js 基础连接

    javascript 复制代码
    const mysql = require('mysql2');
    
    const connection = mysql.createConnection({
      host: 'localhost',
      user: 'root',
      password: 'your_password',
      database: 'users'
    });
    
    connection.connect((err) => {
      if (err) throw err;
      console.log('MySQL connected!');
      connection.end(); // 测试后关闭
    });

查询操作
  1. query.js 简单查询

    javascript 复制代码
    const connection = mysql.createConnection({ /* 配置同上 */ });
    
    connection.query('SELECT * FROM t_users', (err, results) => {
      if (err) throw err;
      console.log(results);
      connection.end();
    });
  2. 条件查询

    javascript 复制代码
    const sql = 'SELECT * FROM t_users WHERE name LIKE ? AND borndate < ?';
    const params = ['%郭%', '2003-12-31'];
    connection.query(sql, params, (err, results) => {
      // 处理结果
    });
  3. 获取字段信息

    javascript 复制代码
    connection.query('SELECT * FROM t_users WHERE id > ?', [5], 
      (err, results, fields) => {
        console.log(fields.map(f => f.name)); // 输出字段名
      }
    );

新增操作 (insert.js)新增作 (insert.js)
javascript 复制代码
const sql = `
  INSERT INTO t_users 
    (name, gender, borndate, address) 
  VALUES (?, ?, ?, ?)`;
const params = ['梅超风', 1, '2004-07-09', '古墓'];

connection.query(sql, params, (err, result) => {
  console.log('Insert ID:', result.insertId);
  connection.end();
});

修改操作 (update.js)修改作 (update.js)
javascript 复制代码
const sql = 'UPDATE t_users SET name=?, address=? WHERE id=?';
const params = ['张三丰', '武当山', 3];

connection.query(sql, params, (err, result) => {
  console.log('Affected rows:', result.affectedRows);
  connection.end();
});

关键点总结

安全实践

  • 使用 ? 占位符防止 SQL 注入。
  • 参数数组顺序需与 SQL 中的占位符严格匹配。
  1. 连接管理

每次操作后调用 connection.end() 释放资源。

  1. 错误处理

回调函数中优先检查 err 对象。

  1. 数据类型

确保 JS 中的数据类型与 MySQL 字段匹配(如日期格式为 YYYY-MM-DD)。

  1. 调试技巧

打印 resultsfields 理解返回数据结构。

相关推荐
猫猫不是喵喵.5 分钟前
Vue2 的 Vuex 状态管理与 Vue3 的 Pinia 状态管理
前端·javascript·vue.js
xqqxqxxq21 分钟前
MySQL 数据类型笔记
数据库·笔记·mysql
Logintern0944 分钟前
理解MySQL数据库的“事务与锁”
数据库·mysql
看昭奚恤哭1 小时前
Flutter 布局核心思想
开发语言·javascript·flutter
朱容zr3331331 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
麻瓜code1 小时前
【Redis 】数据类型、持久化与过期删除
数据库·redis·缓存
空杆推不起1 小时前
穿透 Flink CDC 表层用法:数据库日志捕获机制、Flink Source 运行时、端到端一致性底层原理详解
大数据·数据库·flink
朝阳5811 小时前
Cesium `Camera.flyTo`:“飞过去“
javascript
朱容zr3331332 小时前
请解释“回表”的概念。
java·前端·数据库
大黄说说2 小时前
EF Core 避坑指南:查询慢、循环查询、并发更新问题如何解决
java·服务器·数据库