diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 853018ef..3516379b 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -32,7 +32,8 @@ export default defineConfig({ {text: '快速开始', link: '/zh/getting-started'}, {text: 'Maven 依赖', link: '/zh/maven'}, {text: '和 Spring 整合', link: '/zh/mybatis-flex-with-spring'}, - {text: '和同类框架对比', link: '/zh/comparison'}, + {text: '和同类框架「功能」对比', link: '/zh/comparison'}, + {text: '和同类框架「性能」对比', link: '/zh/benchmark'}, {text: 'QQ 交流群', link: '/zh/qq-group'}, ] }, diff --git a/docs/zh/benchmark.md b/docs/zh/benchmark.md new file mode 100644 index 00000000..ad6a28a0 --- /dev/null +++ b/docs/zh/benchmark.md @@ -0,0 +1,322 @@ +# Mybatis-Flex 和同类框架「性能」对比 + +本文主要是展示了 Mybatis-Flex 和 Mybaits-Plus 的「性能」对比。Mybaits-Plus 是一个非常优秀 Mybaits 增强框架, +其开源于 2016 年,有很多的成功案例。 + +本文只阐述了「性能」方面的对比,「功能」对比请参考 [这里](./comparison.md)。 + +## 测试方法 +使用 h2 数据库,在初始化的时候分别为 mybatis-flex 和 mybatis-plus 创建两个不同的数据库, 但是完全一样的数据结构、数据内容和数据量(每个库 2w 条数据)。 + +开始之前先进行预热,之后通过打印时间戳的方式进行对比,谁消耗的时间越少,则性能越高(每次测试 10 轮)。 + +测试源码: +[https://gitee.com/mybatis-flex/mybatis-benchmark](https://gitee.com/mybatis-flex/mybatis-benchmark) + +::: tip 测试说明 +> 在以下的所有测试中,有可能因为每个人的电脑性能不同,测试的结果会有所不同。 +::: + +## 测试单条数据查询 + +Mybatis-Flex 的代码如下: + +```java +QueryWrapper queryWrapper = new QueryWrapper(); +queryWrapper.where(FLEX_ACCOUNT.ID.ge(100) +.or(FLEX_ACCOUNT.USER_NAME.eq("admin" + ThreadLocalRandom.current().nextInt(10000)))); +mapper.selectOneByQuery(queryWrapper); +``` + +Mybatis-Plus 的代码如下: + +```java +QueryWrapper queryWrapper = new QueryWrapper(); +queryWrapper.ge("id", 100); +queryWrapper.or(); +queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000)); +queryWrapper.last("limit 1"); +mapper.selectOne(queryWrapper); +``` + +10 轮的测试结果: + +``` +--------------- +>>>>>>>testFlexSelectOne:26 +>>>>>>>testPlusSelectOneWithLambda:109 +>>>>>>>testPlusSelectOne:119 +--------------- +>>>>>>>testFlexSelectOne:19 +>>>>>>>testPlusSelectOneWithLambda:104 +>>>>>>>testPlusSelectOne:98 +--------------- +>>>>>>>testFlexSelectOne:15 +>>>>>>>testPlusSelectOneWithLambda:94 +>>>>>>>testPlusSelectOne:95 +--------------- +>>>>>>>testFlexSelectOne:16 +>>>>>>>testPlusSelectOneWithLambda:90 +>>>>>>>testPlusSelectOne:87 +--------------- +>>>>>>>testFlexSelectOne:15 +>>>>>>>testPlusSelectOneWithLambda:93 +>>>>>>>testPlusSelectOne:55 +--------------- +>>>>>>>testFlexSelectOne:10 +>>>>>>>testPlusSelectOneWithLambda:60 +>>>>>>>testPlusSelectOne:48 +--------------- +>>>>>>>testFlexSelectOne:8 +>>>>>>>testPlusSelectOneWithLambda:54 +>>>>>>>testPlusSelectOne:51 +--------------- +>>>>>>>testFlexSelectOne:8 +>>>>>>>testPlusSelectOneWithLambda:57 +>>>>>>>testPlusSelectOne:56 +--------------- +>>>>>>>testFlexSelectOne:9 +>>>>>>>testPlusSelectOneWithLambda:69 +>>>>>>>testPlusSelectOne:55 +--------------- +>>>>>>>testFlexSelectOne:7 +>>>>>>>testPlusSelectOneWithLambda:56 +>>>>>>>testPlusSelectOne:55 +``` + +::: tip 测试结论 +> Mybatis-Flex 的查询单条数据的速度,大概是 Mybatis-Plus 的 5 ~ 8 倍。 +::: + +## 测试列表(List)数据查询 + +要求返回的数据为 10 条数据。 + +Mybatis-Flex 的代码如下: + +```java +QueryWrapper queryWrapper = new QueryWrapper(); +queryWrapper.where(FLEX_ACCOUNT.ID.ge(100).or(FLEX_ACCOUNT.USER_NAME +.eq("admin" + ThreadLocalRandom.current().nextInt(10000)))) +.limit(10); +mapper.selectListByQuery(queryWrapper); +``` + +Mybatis-Plus 的代码如下: + +```java +QueryWrapper queryWrapper = new QueryWrapper(); +queryWrapper.ge("id", 100); +queryWrapper.or(); +queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000)); +queryWrapper.last("limit 10"); +mapper.selectList(queryWrapper); +``` + +10 轮的测试结果: + +``` +--------------- +>>>>>>>testFlexSelectTop10:12 +>>>>>>>testPlusSelectTop10WithLambda:56 +>>>>>>>testPlusSelectTop10:53 +--------------- +>>>>>>>testFlexSelectTop10:10 +>>>>>>>testPlusSelectTop10WithLambda:57 +>>>>>>>testPlusSelectTop10:56 +--------------- +>>>>>>>testFlexSelectTop10:9 +>>>>>>>testPlusSelectTop10WithLambda:51 +>>>>>>>testPlusSelectTop10:47 +--------------- +>>>>>>>testFlexSelectTop10:9 +>>>>>>>testPlusSelectTop10WithLambda:50 +>>>>>>>testPlusSelectTop10:48 +--------------- +>>>>>>>testFlexSelectTop10:8 +>>>>>>>testPlusSelectTop10WithLambda:51 +>>>>>>>testPlusSelectTop10:47 +--------------- +>>>>>>>testFlexSelectTop10:9 +>>>>>>>testPlusSelectTop10WithLambda:50 +>>>>>>>testPlusSelectTop10:47 +--------------- +>>>>>>>testFlexSelectTop10:8 +>>>>>>>testPlusSelectTop10WithLambda:50 +>>>>>>>testPlusSelectTop10:49 +--------------- +>>>>>>>testFlexSelectTop10:7 +>>>>>>>testPlusSelectTop10WithLambda:50 +>>>>>>>testPlusSelectTop10:47 +--------------- +>>>>>>>testFlexSelectTop10:6 +>>>>>>>testPlusSelectTop10WithLambda:46 +>>>>>>>testPlusSelectTop10:49 +--------------- +>>>>>>>testFlexSelectTop10:8 +>>>>>>>testPlusSelectTop10WithLambda:48 +>>>>>>>testPlusSelectTop10:77 +``` + +::: tip 测试结论 +> Mybatis-Flex 的查询 10 条数据的速度,大概是 Mybatis-Plus 的 5 倍左右。 +::: + +## 分页查询 + + +Mybatis-Flex 的代码如下: + +```java +QueryWrapper queryWrapper = new QueryWrapper() + .where(FLEX_ACCOUNT.ID.ge(100)) + .or(FLEX_ACCOUNT.USER_NAME.like("admin")) + .or(FLEX_ACCOUNT.NICKNAME.eq("Michael")) + .or(FLEX_ACCOUNT.EMAIL.eq("michael@gmail.com")); +mapper.paginate(page, pageSize, 10000, queryWrapper); +``` + +Mybatis-Plus 的代码如下: + +```java +LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.ge(PlusAccount::getId, 100); + queryWrapper.or(); + queryWrapper.like(PlusAccount::getUserName, "admin"); + queryWrapper.or(); + queryWrapper.eq(PlusAccount::getNickname, "Michael"); + queryWrapper.or(); + queryWrapper.eq(PlusAccount::getEmail, "michael@gmail.com"); +Page p = Page.of(page,pageSize,10000, false); +mapper.selectPage(p, queryWrapper); +``` + +10 轮的测试结果: + +``` +--------------- +>>>>>>>testFlexPaginate:63 +>>>>>>>testPlusPaginate:181 +--------------- +>>>>>>>testFlexPaginate:47 +>>>>>>>testPlusPaginate:197 +--------------- +>>>>>>>testFlexPaginate:37 +>>>>>>>testPlusPaginate:115 +--------------- +>>>>>>>testFlexPaginate:31 +>>>>>>>testPlusPaginate:113 +--------------- +>>>>>>>testFlexPaginate:29 +>>>>>>>testPlusPaginate:103 +--------------- +>>>>>>>testFlexPaginate:27 +>>>>>>>testPlusPaginate:111 +--------------- +>>>>>>>testFlexPaginate:24 +>>>>>>>testPlusPaginate:102 +--------------- +>>>>>>>testFlexPaginate:23 +>>>>>>>testPlusPaginate:102 +--------------- +>>>>>>>testFlexPaginate:23 +>>>>>>>testPlusPaginate:104 +--------------- +>>>>>>>testFlexPaginate:21 +>>>>>>>testPlusPaginate:101 +``` + +::: tip 测试结论 +> Mybatis-Flex 的分页查询速度,大概是 Mybatis-Plus 的 3~5 倍。 +::: + + + +## 数据更新 + + +Mybatis-Flex 的代码如下: + +```java +FlexAccount flexAccount = new FlexAccount(); +flexAccount.setUserName("testInsert" + i); +flexAccount.setNickname("testInsert" + i); +flexAccount.addOption("key1", "value1"); +flexAccount.addOption("key2", "value2"); +flexAccount.addOption("key3", "value3"); +flexAccount.addOption("key4", "value4"); +flexAccount.addOption("key5", "value5"); + +QueryWrapper queryWrapper = QueryWrapper.create() + .where(FLEX_ACCOUNT.ID.ge(9200)) + .and(FLEX_ACCOUNT.ID.le(9300)) + .and(FLEX_ACCOUNT.USER_NAME.like("admin")) + .and(FLEX_ACCOUNT.NICKNAME.like("admin")); + +mapper.updateByQuery(flexAccount, queryWrapper); +``` + +Mybatis-Plus 的代码如下: + +```java +PlusAccount plusAccount = new PlusAccount(); +plusAccount.setUserName("testInsert" + i); +plusAccount.setNickname("testInsert" + i); +plusAccount.addOption("key1", "value1"); +plusAccount.addOption("key2", "value2"); +plusAccount.addOption("key3", "value3"); +plusAccount.addOption("key4", "value4"); +plusAccount.addOption("key5", "value5"); + +LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); +updateWrapper.ge(PlusAccount::getId, 9000); +updateWrapper.le(PlusAccount::getId, 9100); +updateWrapper.like(PlusAccount::getUserName, "admin"); +updateWrapper.like(PlusAccount::getNickname, "admin"); + +mapper.update(plusAccount, lambdaUpdateWrapper); +``` + +10 轮的测试结果: + +``` +--------------- +>>>>>>>testFlexUpdate:11 +>>>>>>>testPlusUpdate:61 +--------------- +>>>>>>>testFlexUpdate:10 +>>>>>>>testPlusUpdate:49 +--------------- +>>>>>>>testFlexUpdate:6 +>>>>>>>testPlusUpdate:39 +--------------- +>>>>>>>testFlexUpdate:5 +>>>>>>>testPlusUpdate:40 +--------------- +>>>>>>>testFlexUpdate:5 +>>>>>>>testPlusUpdate:36 +--------------- +>>>>>>>testFlexUpdate:5 +>>>>>>>testPlusUpdate:34 +--------------- +>>>>>>>testFlexUpdate:6 +>>>>>>>testPlusUpdate:33 +--------------- +>>>>>>>testFlexUpdate:4 +>>>>>>>testPlusUpdate:32 +--------------- +>>>>>>>testFlexUpdate:4 +>>>>>>>testPlusUpdate:34 +--------------- +>>>>>>>testFlexUpdate:5 +>>>>>>>testPlusUpdate:32 +``` + +::: tip 测试结论 +> Mybatis-Flex 的数据更新速度,大概是 Mybatis-Plus 的 5~10 倍。 +::: + +## 更多的测试 + +想进一步进行更多测试的同学,可以到 [https://gitee.com/mybatis-flex/mybatis-benchmark](https://gitee.com/mybatis-flex/mybatis-benchmark) +下载源码后,添加其他方面的测试。 diff --git a/docs/zh/comparison.md b/docs/zh/comparison.md index e61088b4..6c9f27b2 100644 --- a/docs/zh/comparison.md +++ b/docs/zh/comparison.md @@ -1,11 +1,16 @@ -# Mybatis-Flex 和同类框架对比 +# Mybatis-Flex 和同类框架「功能」对比 + +MyBatis-Flex 主要是和 `MyBatis-Plus` 与 `Fluent-Mybatis` 对比,内容来源其官网、git 或者 网络文章,若有错误欢迎纠正。 + +- MyBatis-Plus:老牌的 MyBatis 增强框架,开源于 2016 年。 +- Fluent-Mybatis:阿里云开发的 Mybatis 增强框架(来至于阿里云·云效产品团队) + +本文只阐述了「功能」方面的对比,「性能」对比请参考 [这里](./benchmark.md)。 + +> 纠正联系方式:加入 Mybatis-Flex QQ 交流群:532992631,然后联系群主。 ## 功能对比 -MyBatis-Flex 主要是和 `MyBatis-Plus` 与 `Fluent-Mybatis` 对比,内容来源其官网、git 或者 网络文章,若有错误欢迎指正。 - -- MyBatis-Plus:老牌的 MyBatis 增强框架 -- Fluent-Mybatis:阿里云开发的 Mybatis 增强框架(来至于阿里云·云效产品团队) | 功能或特点 | MyBatis-Flex | MyBatis-Plus | Fluent-Mybatis | | -------- | -------- | -------- | -------- |