【RuoYi-Eggjs】:让 MySQL 更简单

【RuoYi-Eggjs】:让 MySQL 更简单

前言

在 Node.js 开发中,操作数据库是最常见的需求之一。虽然 mysql2 库功能强大,但在 Egg.js 项目中直接使用还需要处理连接池、配置管理等繁琐的工作。[ruoyi-eggjs-mysql](https://github.com/undsky/ruoyi-eggjs-mysql) 就是为了解决这个痛点而生的------它是一个基于 mysql2 的 Egg.js 插件,提供了开箱即用的数据库操作能力。

核心特性

🚀 简洁的 API 设计

插件封装了最常用的数据库操作,让代码更加直观:

js 复制代码
// 查询单条记录
const user = await app.mysql.select('SELECT * FROM users WHERE id = 1');

// 查询多条记录
const users = await app.mysql.selects('SELECT * FROM users WHERE age > 18');

// 插入数据
const insertId = await app.mysql.insert("INSERT INTO users (name, age) VALUES ('张三', 25)");

// 更新数据
const affectedRows = await app.mysql.update("UPDATE users SET age = 26 WHERE id = 1");

// 删除数据
const deleted = await app.mysql.del("DELETE FROM users WHERE id = 1");

📊 执行SQL实时输出并显示执行时间

在开发过程中,了解每条 SQL 的执行性能至关重要。ruoyi-eggjs-mysql 插件内置了智能的 SQL 执行监控功能,每次执行 SQL 时都会在控制台实时输出执行信息,让性能优化变得一目了然。当你执行任何数据库操作时,插件会自动在控制台输出:

  • SQL 语句内容:完整的 SQL 命令,方便调试
  • 执行耗时:精确到毫秒的执行时间,帮助定位慢查询

🔄 智能驼峰命名转换

支持自动将数据库字段从 snake_case 转换为 camelCase,让前后端数据格式保持一致:

js 复制代码
// 配置开启驼峰转换
config.mysql = {
  camelCase: true,
  // ...其他配置
};

// 数据库字段:user_id, user_name, created_at
const user = await app.mysql.select('SELECT * FROM users WHERE id = 1');
// 返回:{ userId: 1, userName: '张三', createdAt: '2024-01-01 12:00:00' }

这个功能对于前端开发者特别友好,避免了在代码中手动转换字段名的麻烦。

⏰ 时区问题一劳永逸

mysql2 默认会将时间转换为 UTC。插件默认配置已经解决了这个问题:

js 复制代码
config.mysql = {
  default: {
    timezone: '+08:00',    // 设置为东八区
    dateStrings: true,     // 保持日期为字符串格式
  },
};

配置后,时间字段会保持原样返回,不再有时区困扰。

🔒 内置事务支持

处理转账、批量操作等场景时,事务是必不可少的。插件提供了简单易用的事务 API:

js 复制代码
// 转账示例:从账户 A 转 100 元到账户 B
await app.mysql.transaction([
  "UPDATE accounts SET balance = balance - 100 WHERE user_id = 1",
  "UPDATE accounts SET balance = balance + 100 WHERE user_id = 2",
  "INSERT INTO transactions (from_user, to_user, amount) VALUES (1, 2, 100)",
]);

如果任何一条 SQL 执行失败,所有操作会自动回滚,数据安全有保障。

快速上手

安装

bash 复制代码
npm i ruoyi-eggjs-mysql --save

配置

1. 启用插件

js 复制代码
// config/plugin.js
exports.mysql = {
  enable: true,
  package: "ruoyi-eggjs-mysql",
};

2. 配置数据库连接

js 复制代码
// config/config.default.js
config.mysql = {
  default: {
    port: 3306,
    charset: "utf8mb4",
    multipleStatements: true,
    connectionLimit: 100,
    timezone: '+08:00',      // 时区设置
    dateStrings: true,       // 日期保持字符串格式
  },
  camelCase: false,          // 是否开启驼峰转换
  client: {
    host: "127.0.0.1",
    user: "root",
    password: "your_password",
    database: "your_database",
  },
};

实战示例

下面是一个完整的用户管理 Service 示例:

js 复制代码
// app/service/user.js
const { Service } = require('egg');

class UserService extends Service {
  // 创建用户
  async create(name, age) {
    const insertId = await this.app.mysql.insert(
      `INSERT INTO users (name, age, created_at) VALUES ('${name}', ${age}, NOW())`
    );
    return insertId;
  }

  // 查询单个用户
  async findById(id) {
    return await this.app.mysql.select(`SELECT * FROM users WHERE id = ${id}`);
  }

  // 查询所有用户
  async findAll() {
    return await this.app.mysql.selects('SELECT * FROM users ORDER BY id DESC');
  }

  // 更新用户
  async update(id, data) {
    const affectedRows = await this.app.mysql.update(
      `UPDATE users SET name = '${data.name}', age = ${data.age} WHERE id = ${id}`
    );
    return affectedRows > 0;
  }

  // 删除用户
  async delete(id) {
    const deleted = await this.app.mysql.del(`DELETE FROM users WHERE id = ${id}`);
    return deleted > 0;
  }
}

module.exports = UserService;

多数据库支持

当项目需要连接多个数据库时(如主从分离、跨库查询),插件也能轻松应对:

js 复制代码
// 配置多个数据库
config.mysql = {
  default: { /* 默认配置 */ },
  clients: {
    db1: {
      host: "127.0.0.1",
      database: "database1",
      // ...
    },
    db2: {
      host: "192.168.1.100",
      database: "database2",
      // ...
    },
  },
};

// 使用不同数据库
const db1 = app.mysql.get('db1');
const db2 = app.mysql.get('db2');

const user = await db1.select('SELECT * FROM users WHERE id = 1');
const order = await db2.select('SELECT * FROM orders WHERE user_id = 1');

安全建议

上面的示例为了简洁使用了字符串拼接,但在生产环境中强烈建议使用参数化查询来防止 SQL 注入:

js 复制代码
const pool = app.mysql.pool;

// ✅ 推荐:参数化查询
const [users] = await pool.query('SELECT * FROM users WHERE age > ?', [18]);

// ❌ 不推荐:字符串拼接(有 SQL 注入风险)
const users = await app.mysql.selects(`SELECT * FROM users WHERE age > ${age}`);

总结

ruoyi-eggjs-mysql 是一个轻量但实用的 Egg.js MySQL 插件,它的优势在于:

  • 开箱即用:无需复杂配置,快速集成
  • API 简洁:封装常用操作,代码更清晰
  • 功能实用:驼峰转换、时区处理、事务支持等开发中的痛点都有解决方案
  • 性能优异:基于 mysql2 和连接池技术,性能有保障

如果你正在使用 Egg.js 开发项目,并且需要操作 MySQL 数据库,不妨试试这个插件,相信它会让你的开发效率提升不少!


相关推荐
章豪Mrrey nical5 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
派大鑫wink6 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼6 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII6 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home6 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3216 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446236 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL7 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小信啊啊7 小时前
Go语言切片slice
开发语言·后端·golang
Victor3569 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端