【RuoYi-Eggjs】:把 MyBatis 带到 Node.js

简介: 【RuoYi-Eggjs-MyBatis】将MyBatis优雅引入Node.js,告别SQL字符串拼接。支持XML管理SQL、动态标签、预编译防注入,修改即生效,无需重启。适合Java转Node开发者,提升代码清晰度与安全性,助力Egg.js项目高效开发。GitHub开源,欢迎Star!

【RuoYi-Eggjs】:把 MyBatis 带到 Node.js

如果你是从 Java 转到 Node.js 的全栈开发者,或者你受够了在 JS 代码里用字符串拼接 SQL,那么这篇文章就是为你准备的。本文将带你上手 ruoyi-eggjs-mybatis,体验业务逻辑与 SQL 彻底分离的清爽。


🧐 为什么要折腾这个?

写 Node.js 后端时,你是不是也经常对着代码里那一坨坨拼凑的 SQL 字符串发愁?

  1. 代码乱:SQL 语句夹杂在 JS 逻辑里,想改个查询条件得在一堆引号和加号里找半天。
  2. 动态查询想撞墙:用户一会儿要按名字查,一会儿要按时间查。用 JS 手写 if (name) sql += ... 简直是噩梦,既容易出错又丑陋。
  3. DBA 想打人:由于 SQL 散落在代码各处,做 SQL 审查和性能优化非常困难。

如果你怀念 Java 生态中 MyBatis 那种 "XML 统一管理 SQL""强大的动态标签",那么 ruoyi-eggjs-mybatis 就能完美解决你的痛点,把这种优雅的开发体验带到 Egg.js 项目中。


🚀 核心亮点:不仅仅是把 SQL 挪个位置

这个插件不仅仅是把 SQL 搬到了 XML 里,更重要的是它带来了一套完整的 SQL 编程逻辑:

  • 告别字符串拼接:使用 <where><if> 等标签,让 SQL 像代码一样具备逻辑性。
  • 更安全:默认使用预编译(#{}),自动转义参数,从根源上防止 SQL 注入。
  • 开发超爽:开发环境下修改 XML 无需重启,即改即生效,调试效率拉满。

🛠️ 3分钟快速上手

1. 安装与开启

先装包,然后在 Egg.js 里把插件开起来。

$ npm i ruoyi-eggjs-mybatis --save
// config/plugin.js
exports.mybatis = {
   
  enable: true,
  package: "ruoyi-eggjs-mybatis",
};

2. 告诉插件 XML 在哪

在配置文件里指定 Mapper 文件的存放路径。

// config/config.default.js
const path = require('path');

config.mybatis = {
   
  mapperPath: path.join(appInfo.baseDir, 'mapper'), // XML 文件放这就行
  defaultPageSize: 10, // 默认分页大小
};

3. 你的第一个 XML

假设我们要查用户,在 mapper/ruoyi/ 下新建 SysUserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper/mysql/ruoyi/SysUserMapper.xml">
    <select id="selectUserById">
        SELECT * FROM sys_user WHERE user_id = ?
    </select>
</mapper>

就是这么简单,接下来看它在实战中有多好用。


💡 实战演示:代码是最好的老师

场景一:最让人头大的“多条件组合查询”

这是 MyBatis 最强的地方。以前你需要写几十行 JS 代码来判断拼接 WHERE 子句,现在只需要:

<select id="selectUserList">
    SELECT * FROM sys_user
    <where>
        <if test="userName">
            AND user_name LIKE CONCAT('%', #{userName}, '%')
        </if>
        <if test="status">
            AND status = #{status}
        </if>
        <if test="params.beginTime">
            AND create_time &gt;= #{params.beginTime}
        </if>
    </where>
    ORDER BY create_time DESC
    LIMIT ?, ?
</select>

神奇之处

  • <where> 标签很智能,它会自动去掉第一个多余的 AND
  • 如果所有参数都为空,它甚至连 WHERE 关键字都不会生成。
  • 逻辑清晰,一目了然。

Service 层调用

// 自动处理分页逻辑,无需手动算 offset
const sql = app.mapper(
  'mapper/mysql/ruoyi/SysUserMapper.xml',
  'selectUserList',
  ctx.helper.page(params), 
  params
);
const users = await app.mysql.selects(sql);

场景二:只更新发生变化的字段

做 Update 操作时,用户只传了 email,没传 userName?用 <set> 标签,不用再担心逗号拼错的问题。

<update id="updateUser">
    UPDATE sys_user
    <set>
        <if test="userName">user_name = #{userName},</if>
        <if test="email">email = #{email},</if>
        update_time = NOW()
    </set>
    WHERE user_id = ?
</update>

场景三:批量删除(IN 查询)

不用手动循环拼 ID 了,用 <foreach> 优雅解决:

<delete id="deleteUserByIds">
    DELETE FROM sys_user WHERE user_id IN
    <foreach collection="array" item="userId" open="(" separator="," close=")">
        #{userId}
    </foreach>
</delete>

🛡️ 关于安全:#$ 的区别

这是新手最容易踩的坑,请务必记好:

  • #{param}(强烈推荐)

    • 带套更安全。它会进行预编译,把参数变成占位符 ?
    • 例如:user_name = #{name} -> user_name = 'admin'
    • 能有效防止 SQL 注入,95% 的情况都该用它。
  • ${param}(谨慎使用)

    • 裸奔。直接把字符串拼接到 SQL 里。
    • 适用场景:只有在表名、字段名(如 ORDER BY ${column})动态变化时才用。
    • 警告:一定要在代码里对传入的参数做白名单校验,否则就是给黑客留后门!

🏗️ 完整链路:Service 怎么写?

为了保持代码整洁,建议遵循 Controller -> Service -> Mapper 的三层架构。

Service 层示例
Service 层的职责变得非常纯粹——准备参数,调用 Mapper,获取结果。

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

class UserService extends Service {
   
  async selectUserById(userId) {
   
    const {
    app } = this;
    // 1. 定位 XML 文件
    // 2. 指定 SQL ID
    // 3. 传入参数
    const sql = app.mapper(
      'mapper/mysql/ruoyi/SysUserMapper.xml', 
      'selectUserById',
      [userId]
    );
    return await app.mysql.select(sql);
  }
}

⚖️ 选型建议:用这个还是用 ORM?

  • 如果你喜欢:完全掌控 SQL 细节,处理复杂的报表查询,或者团队里有 DBA 协助优化 SQL —— 选 ruoyi-eggjs-mybatis
  • 如果你喜欢:通过操作对象来操作数据库,不想写一句 SQL,且业务逻辑相对简单的 CRUD —— 选 Sequelize 或 TypeORM

希望这个插件能帮你把 Node.js 的数据层代码打理得井井有条!如果觉得好用,别忘了去 GitHub 上点个 Star 哦。


目录
相关文章
|
3月前
|
SQL XML JavaScript
【RuoYi-Eggjs】:将若依带入 Node.js 世界的企业级后台管理系统
RuoYi-Eggjs 是基于 Egg.js 的企业级后台系统,100% 复刻若依功能,支持 MyBatis XML 风格 SQL、多数据库、JWT 认证、权限控制与代码自动生成,完美对接 RuoYi-Vue3 前端,助力 Node.js 开发者高效构建管理系统。
273 5
|
6天前
|
人工智能 自然语言处理 数据可视化
【RuoYi-SpringBoot3-Pro】:AI 能力再再扩展,打通 RAGFlow 知识库和 Dify 应用平台
【RuoYi-SpringBoot3-Pro】AI能力再升级!无缝集成RAGFlow知识库(支持数据集/文档/块管理及流式对话)与Dify应用平台(对话、知识库、工作流),提供同步、异步、流式三种调用模式,以“外挂”方式灵活扩展企业级AI能力。
115 4
|
3月前
|
人工智能 前端开发 Java
【RuoYi-SpringBoot3-Pro】:接入 AI 对话能力
RuoYi-SpringBoot3-Pro 内置 OpenAI 工具类,支持同步/流式对话、多角色消息与代理配置,兼容 OpenAI 及第三方 API,开箱即用,助力开发者快速集成 AI 聊天功能。
358 0
|
3月前
|
人工智能 自然语言处理 安全
【RuoYi-SpringBoot3-Pro】:使用 UEditor Plus 富文本编辑器替代 quill
【RuoYi-SpringBoot3-Pro】集成UEditor Plus富文本编辑器,替代功能有限的quill。UEditor Plus界面全新,支持文档导入及AI续写、优化、生成等内容创作能力,前后端开箱即用,显著提升编辑体验与开发效率。
348 6
【RuoYi-SpringBoot3-Pro】:使用 UEditor Plus 富文本编辑器替代 quill
|
3月前
|
SQL 关系型数据库 MySQL
【RuoYi-Eggjs】:让 MySQL 更简单
【RuoYi-Eggjs-Mysql】是一款专为Egg.js打造的MySQL插件,基于mysql2封装,提供简洁API、自动驼峰转换、时区支持、SQL执行监控与事务管理,开箱即用,助力Node.js开发者高效操作数据库,提升开发体验。
76 1
【RuoYi-Eggjs】:让 MySQL 更简单
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
【RuoYi-SpringBoot3-Pro】:拒绝“大众脸”!高颜值前端框架选型
拒绝“若依脸”!推荐两款高颜值前端框架:BearJia Vue3(Ant Design Vue 4 + Vite)打造专业现代界面,RuoYi-Vue3-Prettier 全面重构Element Plus,支持TS与Hook封装。视觉升级、代码精简,助你轻松实现差异化后台系统。
369 1
【RuoYi-SpringBoot3-Pro】:拒绝“大众脸”!高颜值前端框架选型
|
存储 机器学习/深度学习 缓存
Hybrid Model Support:阿里云 Tair 联合 SGLang对 Mamba-Transformer 等混合架构模型的支持方案
阿里云 Tair KVCache 联合 SGLang,创新支持 Mamba-Transformer 等混合架构模型。通过双池内存、状态快照等技术,解决异构状态管理难题,实现前缀缓存与推测解码,显著提升 Qwen3-Next 等模型的推理效率,推动大模型迈向高效智能体时代。
|
3月前
|
SQL 人工智能 Java
【RuoYi-SpringBoot3-Pro】:多租户功能上手指南
RuoYi-SpringBoot3-Pro集成MyBatis-Plus多租户插件,自动注入tenant_id过滤条件,实现数据隔离。通过简单配置即可开启多租户,支持系统表免隔离、超级管理员跨租户查看,提升SaaS开发效率。结合AI建表工具,快速完成数据库初始化。
327 7
|
3月前
|
安全 Java Maven
【RuoYi-SpringBoot3-Pro】:ClassFinal 代码加密
本文介绍RuoYi-SpringBoot3-Pro如何集成ClassFinal实现Java代码加密,保护核心业务逻辑。通过Maven插件对class文件与配置文件进行AES加密,防止反编译泄露,支持选择性加密、密码验证与机器码绑定,适用于商业交付、私有化部署等场景,保障知识产权安全。
565 5
|
3月前
|
前端开发 JavaScript 安全
【RuoYi-SpringBoot3-ElementPlus】:若依前端增强版 —— 功能扩展优化
【RuoYi-SpringBoot3-ElementPlus】基于若依Vue3,100%兼容原功能,新增省市区级联、千分位输入、增强上传、UEditor等8+实用组件,集成dayjs、xe-utils、mitt等主流工具库,支持拖拽排序、移动端适配、三级等保自动登出,配备代码检查、Prettier格式化、FTP自动部署,开箱即用,显著提升开发效率与系统安全性。
887 1