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

宝塔 Apache 部署 Node.js 项目:挂到子路径,不影响同机其他站点 阅读详情

【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 哦。


STK中的传感器、雷达、发射机、接收机、天线 本文根据STK手册介绍了传感器、雷达、发射机、接收机、天线等对象的基本属性,简略分析了它们的不同之处。 阅读详情

相关推荐

开关电源|控制方式PWM、PFM、混合调制

频率调制器根据误差放大器的输出大小来改变方波信号的频率,若负载电流突然增加,输出电压 Vout随之下降,反馈电压 VFB 减小,此时误 差放大器的输出增高,频率调制器输出方波信号的频率增大,增加电感充电次数;若负载电流突然增加,输出电压Vom随之下降,反馈电压Vr减小,此时误差放大器的输出增高,PWM比较器输出方波信号的占空比增大,增加电感充电时间:若负载电流突然下降,PWM比较器输出方波信号的占空比减小,减少电感充电时间,从而稳定输出电压。它是在固定开关频率下,通过改变脉冲宽度来调节占空比的。

weixin_46969363的博客 1万+

【RuoYi-Eggjs】:多数据库与 MyBatis 特性详解

RuoYi-Eggjs 项目通过精心设计的数据库抽象层,实现了 一行配置切换数据库 的能力,同时引入了 Java 开发者熟悉的 MyBatis XML 风格来编写 SQL,让业务逻辑与数据访问完美分离

AI时代超级个体,专注AI应用落地,开发经验分享 987

Python Selenium调用IE11报错全解析:从环境配置到稳定运行

在Web自动化测试领域,Selenium作为主流的跨浏览器测试框架,其核心原理是通过WebDriver协议与不同浏览器的驱动程序进行通信,实现对浏览器行为的模拟与控制。这一技术为软件测试的自动化、回归测试的效率提升提供了重要价值,广泛应用于金融、政务等对遗留系统兼容性要求高的行业场景。然而,当技术栈涉及过时的浏览器如IE11时,环境配置的复杂性显著增加,特别是Python与Selenium的组合常遭遇驱动兼容性、安全设置等挑战。本文聚焦于解决Python Selenium驱动IE11时的典型报错问题,深入剖

weixin_28834765的博客 323

【RuoYi-Eggjs】:让 MySQL 更简单

`ruoyi-eggjs-mysql` 是一款基于 `mysql2` 的 Egg.js 插件,通过提供简洁 API、实时 SQL 监控、智能驼峰转换及事务支持等开箱即用的功能,解决了繁琐的配置痛点,从而显著提升开发效率。

AI时代超级个体,专注AI应用落地,开发经验分享 409

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现

本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。

weixin_33724046的博客 437

H5获取手机相机或相册图片两种方式-Android通过webview传递多张照片给H5

H5调用公共获取图片文件方法,在android手机端,H5主要依赖Webview,这边在webview声明并重写该方法onShowFileChooser使用工具类打开相机或相册,可以两种方式安卓原生方式或者利用第三方组件库方式选中图片,返回uri列表给H5H5收到uri照片列表,并且使用前端方式展示创造价值,乐哉分享!

m0_74823947的博客 3096

【RuoYi-Eggjs】:告别手写,自动生成代码

【RuoYi-Eggjs】:告别手写,自动生成代码 , MyBatis 风格的 Service 代码生成器

AI时代超级个体,专注AI应用落地,开发经验分享 597

东华大学2020考研计算机OJ题目解答分享——进阶篇(4)

4 一个月的天数 作者: Turbo时间限制: 1S章节: 分支结构 问题描述 : 输入年和月,输出该月有几天。 输入说明 : 输入两个整数,中间以空格分隔,第一个整数表示年,第二个整数表示月。 输出说明 : 输出该年该月的天数,输出时,行首与行尾均无空格,仅输出一个整数。 输入范例 : 2000 2 输出范例 : 29 解答思路: 闰年和质数出题一样频繁,简单必会 AC代码 #include...

qq_38344326的博客 472

【RuoYi-Eggjs】:将若依带入 Node.js 世界的企业级后台管理系统

若依 Nodejs 版本,基于 Eggjs,100% 实现若依(RuoYi-Vue)系统功能。

AI时代超级个体,专注AI应用落地,开发经验分享 1280

ArXiv 2026 即插即用 | Transformer篇 | WeightFormer:告别二次复杂度!无注意力的线性时间 Transformer,泛化能力拉满

WeightFormer是一种创新的动态Transformer架构,其核心创新在于通过双动态算子(空间自适应动态卷积和双边激活动态线性)实现输入自适应的特征提取。该模块采用静态-动态权重融合机制和低秩预测技术,在仅增加5%参数量的情况下显著提升模型泛化能力。相比传统Transformer,WeightFormer在ImageNet-1K上提升2.3%精度,小样本任务提升12%,同时保持线性计算复杂度。模块可直接替换标准Transformer块,特别适合轻量级视觉任务,实现了精度与效率的平衡。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 132

基于STM32+华为云设计的智慧农业灌溉系统(2023升级版)(158)

本项目设计一种基于STM32的智慧农业监测系统。该系统能够检测空气温度、湿度、光强度和土壤湿度等关键指标,并自动调节浇水量,实现作物生长环境的精细化管理。同时,本项目还支持本地LCD屏幕数据显示和通过ESP8266上传数据到华为云物联网平台,同时搭建流媒体服务器实现摄像头远程监控。最重要的是,本项目将利用Qt开发Android手机APP,使用户可以远程查看监测情况,了解农作物生成情况。

1万+

【RuoYi-Eggjs】:缓存,让你的应用飞起来

为 RuoYi-Eggjs 量身定制的缓存插件,基于强大的 cache-manager 生态,提供了开箱即用的缓存能力

AI时代超级个体,专注AI应用落地,开发经验分享 1288

(王道计算机组成原理笔记)第一章计算机系统概述-第二节:计算机系统层次结构 1(计算机系统组成、计算机硬件)

文章目录一:冯诺依曼体系结构(1)存储程序计算机(2)层次结构二:计算机硬件概述(1)存储器A:存储元、存储单元、存储体、存储字和存储字长B:MAR 一:冯诺依曼体系结构 在冯诺依曼体系结构中,计算机的硬件主要有**存储器,运算器,控制器,输入和输出设备(也叫做I/O设备)**组成。 (1)存储程序计算机 冯诺依曼体系结构也叫做存储程序计算机,计算器和计算机的唯一区别就是计算器是不能编程的,只能做电路板中设定好的固定的运算。 这也就意味着计算器本质就是一个不能编程的计算机,其在硬件层面已经将逻辑写死,如果

快乐江湖的博客 1万+

【RuoYi-Eggjs】:限流,为 API 保驾护航

基于 rate-limiter-flexible 的限流插件,用于保护 API 免受恶意请求和过载。

AI时代超级个体,专注AI应用落地,开发经验分享 1002

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

基于Ant Design Vue的ruoyi-ant前端框架终极指南

在当今快速发展的Web开发领域,选择一个合适的前端框架至关重要。ruoyi-ant作为一款基于Ant Design Vue的现代化前端工程框架,为企业级应用开发提供了完美的解决方案。本文将带您深入了解这款框架的核心特性,并分享5分钟快速部署的实战经验。 ## 🚀 为什么选择ruoyi-ant前端框架? ruoyi-ant框架集成了Vue.js的响应式特性和Ant Design Vue的优雅组

gitblog_00131的博客 1031

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Windows开发工具环境管理:Git、Node.js、Python多版本与PATH冲突排查

Windows开发工具安装成功却无法运行,或始终调用错误版本?本文围绕Git、Node.js、Python及Codex CLI,系统讲解PowerShell命令解析、PATH环境变量、版本管理器冲突、npm脚本入口、Python install manager与虚拟环境管理。通过可复制的排查命令、Mermaid流程图、只读诊断工具和离线PATH实验,帮助开发者建立稳定、清晰、可复现的Windows开发工具链。

flyingonpine的博客 694

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Node.js CLS 布局偏移检查:图片不标尺寸,页面内容跳来跳去

本文介绍一个无依赖的 Node.js 工具,用于检查网页中导致累积布局偏移(CLS)的图片和 iframe 缺失尺寸问题。通过原生 fetch 抓取页面,匹配未声明 width/height 的 img 与 iframe,快速定位布局跳动风险点。建议为所有媒体元素显式设置尺寸,提升页面稳定性与 SEO 排名。

SEO_juper的博客 175

用 Node.js 搭建 EPUB 问答助手:从文本切片、向量检索到 RAG

本文用 Node.js 串起了一个 EPUB 问答助手的完整链路:用 adm-zip 与 cheerio 解析电子书,按句子边界做带重叠的文本切片,用本地 Embedding 模型建立向量索引,通过余弦相似度召回相关片段,最后把片段拼进提示词交给大模型生成有依据的回答。整条链路没有黑盒,每个环节都可以单独替换和调优。下一步可以尝试的方向包括:引入 BM25 与向量检索的混合召回、增加重排序模型、把索引迁移到向量数据库,以及为回答补充更精确的页码或段落定位。

m0_62937412的博客 296

Node.js 标题层级跳级检查:H1 直接蹦到 H3,机器读着费劲

本文介绍一个无需依赖的 Node.js 工具,用于检查网页标题层级是否跳级(如 H1 直接到 H3),确保内容结构清晰。工具通过原生 fetch 获取页面内容,解析所有标题并按顺序输出,标出跳级位置。强调标题应逐级递进、每页仅一个 H1、标题需有实际内容。合理层级有助于搜索引擎和 AI 理解页面结构,提升可读性与排名。运行命令:node heading-check.js https://example.com/page。

SEO_juper的博客 212

TanStack Router 更新构建工具链:Node.js 兼容性、路由分割与前端工程实践

本文分析了前端路由框架升级带来的隐性风险,以 TanStack Router 2026 年更新为例,揭示现代路由系统深度参与构建流程的特性。文章指出,依赖升级不仅影响运行时行为,更可能改变代码分割、模块加载与构建输出。重点讨论了 Node.js 版本兼容性(要求 ^20.19.0 或 >=22.12.0)、Vite 5 不再支持、esbuild 自动分割配置的显式报错等变化,并强调“构建成功”不等于“优化生效”。通过实操示例,建议开发者通过 engines 字段、CI 检查和环境一致性管理,将路由、构建工具

weixin_47502228的博客 845

从组卷到阅卷:基于 Node.js + Vue3 的在线考试管理系统全栈实践(含深度学习文档总结)

本项目构建了一个覆盖题库管理、组卷考试、在线答题、自动评分与人工阅卷、成绩统计的完整闭环在线考试系统,基于Node.js全栈技术实现。通过前后端分离架构,结合Express、Vue 3、MySQL与RBAC权限体系,解决了题目分散、组卷低效、权限混乱等真实业务痛点,实现了从出题到分析的全流程数字化与可追溯,具备企业级开发实践价值。

Json的知识梦工厂 514

IT日报|2026-11-10:Node.js 安全更新预告、GitHub 密钥扫描、AI 审查指标

2026 年 11 月 10 日 IT日报聚焦运行时安全、代码供应链与 AI 开发治理。Node.js 官方预告 11 月 11 日前后发布安全更新,涉及 22、24、26 三条维护线;GitHub 扩充密钥扫描能力,并为 Agent Package Manager 引入 Dependabot 版本更新支持。此外,Copilot 代码审查新增反馈处理率与遥测质量指标,Pull Request 页面也迎来公开预览改版。本文结合官方公告,分析这些变化对开发、协作与安全运维的实际影响。

代码不止,探索不息 345

Node.js AI 就绪度体检:一个脚本查清页面有没有为 AI 爬虫准备好

本文介绍一个无需依赖的 Node.js 脚本,一键检测网页对 AI 爬虫的友好度。通过检查 robots.txt 是否允许 GPTBot/ClaudeBot、是否存在 llms.txt、结构化数据(JSON-LD/FAQ)、标题层级与正文字数,全面评估页面的 AI 就绪度,助力内容被 AI 正确抓取与理解。

SEO_juper的博客 236

成为全栈·基础补充·Node.js 运行时:事件循环与异步

Node.js 如何在一个主 JavaScript 执行线程上处理大量网络请求?本文解释同步阻塞、异步 I/O、事件循环、Promise 微任务、libuv 线程池和 CPU 并行的区别,并说明 async/await 不会自动开启线程。文章还介绍异步错误、超时、取消、性能诊断和 Worker Threads 的适用边界,最后与 Go goroutine 做概念对照。

FungLeo's Blog 290

Node.js 10min 完成批量新增/延期 500+ 数据:三段式回退链路处理,将“已存在”转延期

没有幂等的写接口,就用"业务错误码"当哨兵。不代表失败,message里的"已存在"才是真正的分岔点。把这类人类文案抽成配置,比硬编码在 if 里稳。降级链路要有终点。新增 → 查询 → 延期是三段,每一段都要有"拿不到结果怎么办"的显式分支,而不是一路?点到黑。模糊查询必须二次精确匹配。plate参数看着是唯一键,实际不是;这一行是防延错车的最后一道闸。Excel 的日期永远是数字。是标准解法,加上"抽 10 条比对原表"的验收动作。幂等设计靠"有效期一致则跳过"。

qnxb0628的博客 408

Node.js + Vue3 全栈实战:社区志愿者服务管理系统(含深度学习文档)

基于Node.js+Express与Vue3+MySQL的志愿者服务管理系统,实现活动发布、在线报名、签到签退、时长自动统计等全生命周期管理。采用前后端分离架构,集成JWT认证、RBAC权限控制、菜单/按钮级权限管理,保障系统安全。支持管理员与志愿者双角色协同,解决信息分散、审核低效、时长出错等问题,具备高可扩展性与教学实践价值,适合作为全栈开发实战项目。

Json的知识梦工厂 139
上一篇: 【RuoYi-Eggjs】:将若依带入 Node.js 世界的企业级后台管理系统
下一篇: 【RuoYi-Eggjs】:基于 Bull Queue 的企业级定时任务调度系统
undsky_
博客等级 码龄20年 6粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

undsky_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值