Skip to content

MyBatis-Flex 周边

视频教程

课程1:《MyBatis-Flex 视频教程》(免费、已完结、全网首发)

课程简介:该课程由 王帅 老师录制主讲, 王帅 老师也是除了作者以外,对 MyBatis-Flex 代码贡献最大的 committer。 其无论对 MyBatis 还是 MyBatis-Flex,都有非常深入的理解。

课程目录(点击展开)

课程地址:

https://www.bilibili.com/video/BV11h411A7cU


课程2:《MyBatis-Flex 轻松掌握,从零基础到高级应用的完整教程!持续更新中~》

课程简介:该课程由周游老师录制,周游老师有多年的开发经验以及丰富的教学经验,能够把 MyBatis-Flex 的许多原理知识讲解的通俗易懂、深入浅出。

课程地址:

https://www.bilibili.com/video/BV1kF411r7ky

开源项目或作品

项目名称描述开源网址
hh-vue这是基于ruoyi-vue改造的项目,对flex完整封装可以参考此项项目https://gitee.com/min290/hh-vue
youcan-solon基于 solon 框架做的一个类似 Ruoyi 的项目,使用flex自带的 mybatis-flex-solon-plugin 插件做集成,集成方式非常简单,属于即拿即用https://gitee.com/gollyhu/youcan-solon
Ruoyi-FlexRuoyi-Flex是基于RuoYi-Vue v3.8.6进行的扩展,集成MyBatis-Flex、JDK17、lombok、Sa-Token、PowerJob、Hutool、OSS、ureport-keep、Flowable、vue3、TypeScript等优秀开源软件。https://gitee.com/dataprince/ruoyi-flex
小鸣助手「小鸣助手」是一个生活服务类小程序,主要为用户的日常生活提供一些便捷工具,例如天气查询、时间规划、生活记录等。目前该小程序已稳定运行近4年,为近10万用户提供了生活帮助。主要技术栈:Spring Boot + Spring Security + JWT + MyBatis-Flex + MySQL + Redis + Dockerhttps://github.com/inlym/life-helper-server
RuoyiVueFlexRuoyiVueFlex是基于RuoyiVuePlus的一个快速开发框架。将RuoyiVuePlus中使用的MybatisPlus替换为MybatisFlex,并根据两个ORM框架使用的不同修改了部分逻辑。 集成 Sa-Token、Mybatis-Flex、PowerJob、Jackson、SpringDoc、Hutool、OSS 定期同步等https://gitee.com/yhan219/ruoyi-vue-flex
RuoyiCloudFlexRuoyiCloudFlex是基于RuoYiCloudPlus的微服务管理系统,将RuoyiCloudPlus中使用的MybatisPlus替换为MybatisFlex,并根据两个ORM框架使用的不同修改了部分逻辑。 整合 SpringCloudAlibaba、Dubbo3.0、Sa-Token、Mybatis-Flex、MQ、Flowable、ES、Docker 全方位升级 定期同步https://gitee.com/yhan219/ruoyi-cloud-flex
Sz-AdminSz-Admin:一个开源RBAC中后台框架,专为现代应用设计。它结合了最新的技术栈,包括后端的Spring Boot 3、JDK 21、Mybatis Flex、Sa-Token、Knife4j和Flyway,以及前端的Vue 3、Vite5、TypeScript和Element Plus,致力于为您提供一个直观、流畅且功能强大的开发体验。https://gitee.com/feiyuchuixue/sz-boot-parent

开发插件

Mybatis-Flex-Helper 这是一款高度自定义的 Mybatis-Flex IDEA 插件(该工具由 Mybatis-Flex 社区的同学 @时间淡忘一切 开发, 目前已经上架到应用商店,可以直接搜索安装):

插件功能展示

功能 1:完善的代码生成配置

支持直接连接数据库,选择表后一键生成 Controller、Service、Mapper、Model 等代码,同时支持自定义代码文件和代码模板。

功能 2:智能的 APT 配置文件自动提示功能

直接编写 APT 配置文件,再也不担心写错,或者不明白其含义。

功能 3:QueryWrapper SQL 预览

我们在 Java 代码中,编写 QueryWrapper,可以直接预览 QueryWrapper 生成的 SQL,除了 QueryWrapper 以外,还支持 QueryChain、UpdateChain 等构建是的 SQL 预览功能。

MyBatis-Flex-Admin

MyBatis-Flex-Admin 是一个基于 MyBatis-Flex 开发的 SQL 执行日志平台和 SQL 审计平台,整个项目只有 5 张表,也是一个绝佳的 MyBatis-Flex 学习项目。

该项目使用前后端分离的方式,后端使用 SpringBoot 2.x + MyBatis-Flex,前台有 React 和 Vue 两个版本,开源地址(当前正在开发中):

https://gitee.com/mybatis-flex/mybatis-flex-admin

MyBatis-Flex-Kotlin

MyBatis-Flex-Kotlin 基于 Mybatis-Flex 的 Kotlin 扩展模块,方便 Kotlin 开发者使用 MyBatis-Flex 进行开发,其主要由社区同学 @kamo-sama 进行维护。

特点

  • 本模块基于 Mybatis-Flex 核心库 ,只做扩展不做改变
  • 结合 Kotlin 特性、DSL让数据库操作更简单

开源地址:

https://gitee.com/mybatis-flex/mybatis-flex-kotlin

Mybatis-Flex-Reactor

MybatisFlex Reactor 为 MybatisFlex 的“响应式”拓展模块,以 Flux 封装了 Cursor 操作。方便了流式查询开发以及大数据体量项目响应数据。

特点

  1. 无需在现有 MybatisFlex 项目增加兼容性改动,仅需将原有的 ServiceImpl 改为 ReactorServiceImpl 即可,或者直接再新建一个 XxxReactorService 继承于 ReactorServiceImpl 即可。
  2. 不强绑定 Spring,也不必须在 Spring WebFlux 框架下开发。完全可以单用 MybatisFlex Reactor 以解决一些传统项目中的性能与内存占用问题。
  3. 与 MybatisFlex 中的 IService 逻辑基本保持一致,几乎 0 学习成本即可上手。
  4. 异步非堵塞,对于写入日志等重要级别较低的数据库操作,我们完全可以让步于主线程逻辑,等所有逻辑处理完以后再执行次要逻辑,加快了系统的响应速度。

一个解决内存占用过高问题的示例

很多人从 POI 换成 EasyExcel 的原因除了简单易用以外,还有个就是内存占用低。在 POI 会内存爆满写入失败的情况,EasyExcel 却可以写入成功,但是内存占用依然不低。如果后续项目中数据量持续增加,简单的换成 EasyExcel 也不再管用,因为你依然会将所有数据直接读到内存当中。当然,你也可以使用多次分页查询等方式解决这个问题,但是我们是否可以更优雅些呢?

kotlin
class UserService : ReactorServiceImpl<UserMapper, User>() {
    // 在 WebFlux 中,可以将此方法直接作为 Controller 的返回值,供 WebFlux 进行调度,返回数据给前端
    fun writeAllToExcel(): Mono<String> {
        // 目标文件
        val tempFile = File.createTempFile("user", ".xlsx")
        // 创建 EasyExcel 的 writer 与目标 sheet
        val writer = EasyExcel.write(tempFile, UserExportVo::class.java)
        	// 自动列宽
            .registerWriteHandler(LongestMatchColumnWidthStyleStrategy())
            .build()
        val sheet = EasyExcel.writerSheet(1).build()
        // 调用响应式的 listAs 方法
        return listAs(QueryWrapper.create(), UserExportVo::class.java)
            // 这里可以预处理数据
            .doOnNext { it.name = "${it.id} ${it.name}" }
            // 选择缓存大小,即多少条数据一起写入 Excel
            .buffer(100)
            // 写入到 Excel
            .doOnNext { writer.write(it, sheet) }
            // 做结尾操作,使用 then 只接收信号而不接收数据
            .then()
            // 结束后关闭 writer
            .doOnTerminate { writer.finish() }
            // 返回文件路径
            .thRerturn(tempFile.absolutePath)
            // 即使出错也会关闭 writer,防止可能的资源泄漏
            .doOnError {
                writer.finish()
                it.printStackTrace()
            }
    }
}

看完上面代码,你会发现你再也不需要关注内部实现细节与逻辑,仅需像“配置代码”一样,填写几个参数就实现了我们的需求。与原来 IService 一样的查询调用方法简单易懂。

在非 Webflux 项目中如何调用返回值为 MonoFlux 的方法呢?MybatisFlex Reactor 提供了两个方法解决这个问题:

kotlin
// 异步调用
ReactorUtils.runAsync(Mono<T>)  // 返回 任务生命周期对象 Disposable
// 同步 / 堵塞 调用
ReactorUtils.runBlock(Mono<T>)  // 返回 T

// 对于返回值为 Flux 的方法,我们可以将其转换为 Mono 即可
// 直接将所有结果集中到一个 List 中
Flux<T>.collectList()  // 返回 Mono<List<T>>
// 以自定义 Collector 汇总数据
Flux<T>.collect(Collectors.joining(", "))  // 返回 String,每个数据直接用“,”链接

开源地址

Gitee(仅同步项目)

Github