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 理解返回数据结构。

相关推荐
树谷-胡老师19 分钟前
公元前3400年至公元2024年全球国家地理边界演变数据集
数据库·arcgis·信息可视化
疯狂的Alex20 分钟前
2010-2022 同等学力申硕国考:软件工程简答题真题汇总
数据库·oracle·软件工程
Qlittleboy26 分钟前
tp5的tbmember表闭包查询 openid=‘abc‘ 并且(wx_unionid=null或者wx_unionid=‘‘)
数据库·sql·php
li35741 小时前
React 核心 Hook 与冷门技巧:useReducer、useEffect、useRef 及 is 属性全解析
前端·javascript·react.js
快乐是Happy1 小时前
分享一个非常实用的防止重复提交操作
前端·javascript
可子是我的小猫1 小时前
【JS】模块(二)
javascript
云枫晖1 小时前
JS核心知识-执行上下文
前端·javascript
麦当_1 小时前
TanStack Router File-Based Router Mask 完全指南
前端·javascript·设计模式
珍珠奶茶爱好者1 小时前
vue二次封装ant-design-vue的table,识别columns中的自定义插槽
前端·javascript·vue.js
markfeng81 小时前
一文搞懂MySQL字符集
sql·mysql