mybatis-flex/docs/zh/awesome-things.md

16 KiB
Raw Blame History

MyBatis-Flex 周边

视频教程

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

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

::: details 课程目录(点击展开)

课程地址:

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-Flex Ruoyi-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 + Docker https://github.com/inlym/life-helper-server
RuoyiVueFlex RuoyiVueFlex是基于RuoyiVuePlus的一个快速开发框架。将RuoyiVuePlus中使用的MybatisPlus替换为MybatisFlex,并根据两个ORM框架使用的不同修改了部分逻辑。 集成 Sa-Token、Mybatis-Flex、PowerJob、Jackson、SpringDoc、Hutool、OSS 定期同步等 https://gitee.com/yhan219/ruoyi-vue-flex
RuoyiCloudFlex RuoyiCloudFlex是基于RuoYiCloudPlus的微服务管理系统将RuoyiCloudPlus中使用的MybatisPlus替换为MybatisFlex,并根据两个ORM框架使用的不同修改了部分逻辑。 整合 SpringCloudAlibaba、Dubbo3.0、Sa-Token、Mybatis-Flex、MQ、Flowable、ES、Docker 全方位升级 定期同步 https://gitee.com/yhan219/ruoyi-cloud-flex
Sz-Admin Sz-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 配置文件,再也不担心写错,或者不明白其含义。

功能 3QueryWrapper 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 也不再管用,因为你依然会将所有数据直接读到内存当中。当然,你也可以使用多次分页查询等方式解决这个问题,但是我们是否可以更优雅些呢?

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 提供了两个方法解决这个问题:

// 异步调用
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