From 19afbca5b86616766ec2b5c902172a6df520180d Mon Sep 17 00:00:00 2001 From: meichenhui Date: Tue, 28 Nov 2023 14:12:58 +0800 Subject: [PATCH 01/28] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8jackson?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96QueryWrapper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/test/common/SerialUtil.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java index eed874b5..df280840 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java @@ -19,6 +19,11 @@ package com.mybatisflex.test.common; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; import com.alibaba.fastjson2.JSONWriter; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.mybatisflex.core.query.QueryCondition; import java.io.*; @@ -71,4 +76,26 @@ public class SerialUtil { return parseObject(toJSONString(obj), tClass); } + + /** + * 使用jackson对QueryWrapper进行序列化反序列化操作,需要注意QueryCondition的protected属性以及prev和next的递归问题。 + * + * @return Jackson序列化映射 + */ + public static ObjectMapper jacksonMapper(){ + ObjectMapper mapper = new ObjectMapper(); + // 为了将QueryWrapper里的protected属性可见 + mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC); + // 避免QueryCondition里的prev和next在序列化时出现递归调用错误 + mapper.addMixIn(QueryCondition.class,QueryConditionMixIn.class); + return mapper; + } + + /** + * 因无法修改QueryCondition而添加的映射属性包装 + */ + class QueryConditionMixIn{ + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + protected QueryCondition prev; + } } From 07b0998dd87e7ff4fdcc6e729b45b15f01cb5c34 Mon Sep 17 00:00:00 2001 From: kamosama <837080904@qq.com> Date: Fri, 1 Dec 2023 09:26:09 +0800 Subject: [PATCH 02/28] docs:update use-in-kotlin.md --- docs/zh/intro/use-in-kotlin.md | 87 +++++++++++++++++----------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/docs/zh/intro/use-in-kotlin.md b/docs/zh/intro/use-in-kotlin.md index fb2d7649..b94a79c1 100644 --- a/docs/zh/intro/use-in-kotlin.md +++ b/docs/zh/intro/use-in-kotlin.md @@ -19,14 +19,14 @@ - 快速构建启动:通过DSL➕重载运算符,快速配置 MybatisFlexBootstrap 实例并启动: ```kotlin - buildBootstrap { + runFlex { // 配置数据源 相当于 setDataSource(dataSource) +dataSource // 配置Mapper 相当于 addMapper(AccountMapper::class.java) +AccountMapper::class // 配置日志输出 相当于 setLogImpl(StdOutImpl::class.java) logImpl = StdOutImpl::class - }.start() + } ``` - 快速查询数据:通过DSL➕泛型快速编写查询语句并查询: (快速查询提供三个函数:all, filter 和 query ) >- `all<实体类>()` 查泛型对应的表的所有数据 @@ -34,53 +34,54 @@ >- `query<实体类>(QueryScope.()->Unit)` 较复杂查泛型对应的表的数据 (如: 分组,排序等) - 简明地构建查询:通过中缀表达式➕扩展方法能更加简单明了的构建条件: - * **【对比原生】** - * **原生** - ```kotlin - val queryWrapper = QueryWrapper.create() - .select(Account::id.column(), Account::userName.column()) - .where(Account::age.column().isNotNull()).and(Account::age.column().ge(17)) - .orderBy(Account::id.column().desc()) - mapper().selectListByQuery(queryWrapper) - ``` - * **扩展后** - ```kotlin - query { - select(Account::id, Account::userName) - where(Account::age.isNotNull) and { Account::age ge 17 } orderBy -Account::id - } - ``` - 执行的SQL: - ```sql - SELECT `id`, `user_name` FROM `tb_account` WHERE `age` IS NOT NULL AND `age` >= 17 ORDER BY `id` DESC - ``` + * **【对比原生】** + * **原生** + ```kotlin + val queryWrapper = QueryWrapper.create() + .select(QueryColumn("id"), QueryColumn("user_name")) + .where(QueryColumn("age").isNotNull()).and(QueryColumn("age").ge(17)) + .orderBy(QueryColumn("id").desc()) + mapper().selectListByQuery(queryWrapper) + ``` - * **【条件优化】** - - 例如: 查询属性是否在一个连续的区间时,会自动将 IN 转为 BETWEEN 调用 - ```kotlin - filter { Account::age `in` (17..19) } - ``` + * **扩展后** + ```kotlin + // 无需注册Mapper与APT/KSP即可查询操作 + val accountList: List = query { + select(Account::id, Account::userName) + where(Account::age.isNotNull) and { Account::age ge 17 } orderBy -Account::id + } + ``` 执行的SQL: ```sql - SELECT * FROM `tb_account` WHERE `age` BETWEEN 17 AND 19 - ``` - - 例如: 构建多属性组合 IN (最多支持三个属性) - ```kotlin - filter { - (Account::id to Account::userName to Account::age).inTriple( - 1 to "张三" to 18, - 2 to "李四" to 19, - ) - } - ``` - 执行的SQL: - ```sql - SELECT * FROM `tb_account` - WHERE (`id` = 1 AND `user_name` = '张三' AND `age` = 18) - OR (`id` = 2 AND `user_name` = '李四' AND `age` = 19) + SELECT `id`, `user_name` FROM `tb_account` WHERE `age` IS NOT NULL AND `age` >= 17 ORDER BY `id` DESC ``` + * **【条件优化】** + - 例如: 查询属性是否在一个连续的区间时,会自动将 IN 转为 BETWEEN 调用 + ```kotlin + filter { Account::age `in` (17..19) } + ``` + 执行的SQL: + ```sql + SELECT * FROM `tb_account` WHERE `age` BETWEEN 17 AND 19 + ``` + - 例如: 构建多属性组合 IN (最多支持三个属性) + ```kotlin + filter { + (Account::id to Account::userName to Account::age).inTriple( + 1 to "张三" to 18, + 2 to "李四" to 19, + ) + } + ``` + 执行的SQL: + ```sql + SELECT * FROM `tb_account` + WHERE (`id` = 1 AND `user_name` = '张三' AND `age` = 18) + OR (`id` = 2 AND `user_name` = '李四' AND `age` = 19) + ``` - 摆脱APT: 使用扩展方法摆脱对 APT(注解处理器) 的使用,直接使用属性引用让代码更加灵活优雅: > 使用APT: `ACCOUNT.ID eq 1` ,使用属性引用: `Account::id eq 1` > From 7516634cd064c08768bc9adc4b4104e91901bc91 Mon Sep 17 00:00:00 2001 From: Font_C <1020331126@qq.com> Date: Mon, 18 Dec 2023 18:19:46 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=20Fixed=EF=BC=9AGBase=5F8s=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=B1=BB=E5=9E=8B=E8=AF=AD=E5=8F=A5=20?= =?UTF-8?q?=E6=97=A0=E5=8F=8D=E4=B9=89=E5=A4=84=E7=90=86,?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mybatisflex/core/dialect/DialectFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DialectFactory.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DialectFactory.java index cfb13564..b5751390 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DialectFactory.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DialectFactory.java @@ -111,6 +111,7 @@ public class DialectFactory { case DORIS: return new CommonsDialectImpl(KeywordWrap.BACK_QUOTE, LimitOffsetProcessor.MYSQL); case CLICK_HOUSE: + case GBASE_8S: return new CommonsDialectImpl(KeywordWrap.NONE, LimitOffsetProcessor.MYSQL); case DM: return new DmDialect(); From 03a0e176b69612dc051bbb2e8c398ec9ce0225dd Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 24 Dec 2023 09:54:37 +0800 Subject: [PATCH 04/28] chore: upgrade mybatis version to 3.5.15 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f1f9cf4b..44715bb0 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.7.6 - 3.5.14 + 3.5.15 2.1.2 1.2.4 2.1.2 From 1a02e80a25e238238ec83df9536f5ab89c6a2f7e Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 24 Dec 2023 09:56:28 +0800 Subject: [PATCH 05/28] fix: fix and close #I8PQLC --- .../mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java | 4 ++-- .../com/mybatisflex/core/mybatis/FlexResultSetHandler.java | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java index 2c8dcdb1..578a8dad 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java @@ -479,7 +479,7 @@ public class FlexDefaultResultSetHandler extends DefaultResultSetHandler { private boolean applyPropertyMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException { - final List mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix); + final Collection mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix); boolean foundValues = false; final List propertyMappings = resultMap.getPropertyResultMappings(); for (ResultMapping propertyMapping : propertyMappings) { @@ -1178,7 +1178,7 @@ public class FlexDefaultResultSetHandler extends DefaultResultSetHandler { if (resultMapping.isSimple()) { final String column = prependPrefix(resultMapping.getColumn(), columnPrefix); final TypeHandler th = resultMapping.getTypeHandler(); - List mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix); + Collection mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix); // Issue #114 if (column != null && mappedColumnNames.contains(column.toUpperCase(Locale.ENGLISH))) { final Object value = th.getResult(rsw.getResultSet(), column); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexResultSetHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexResultSetHandler.java index f38c1c9a..7678b1c3 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexResultSetHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexResultSetHandler.java @@ -30,6 +30,7 @@ import org.apache.ibatis.type.TypeHandler; import java.sql.SQLException; import java.sql.Statement; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -84,7 +85,7 @@ public class FlexResultSetHandler extends FlexDefaultResultSetHandler { String columnName = prependPrefix(mapping.getColumn(), columnPrefix); TypeHandler typeHandler = mapping.getTypeHandler(); - List mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix); + Collection mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix); if (columnName != null && mappedColumnNames.contains(columnName.toUpperCase(Locale.ENGLISH))) { return typeHandler.getResult(rsw.getResultSet(), columnName); } From ce8d0cc0e4311a83e2b12899adb7c0059ad6a56d Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 24 Dec 2023 14:27:32 +0800 Subject: [PATCH 06/28] doc: update docs --- docs/.vitepress/theme/style.css | 12 ++++-------- docs/package.json | 16 ++++++++-------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css index 0fc6f6c5..f878ec0d 100644 --- a/docs/.vitepress/theme/style.css +++ b/docs/.vitepress/theme/style.css @@ -1,12 +1,8 @@ :root { - --vp-c-brand: #F06C33; - --vp-c-brand-light: #FFCC00; - --vp-c-brand-lighter: #FFCC99; - --vp-c-brand-dark: #FF9933; - --vp-c-brand-darker: #CC6600; - - --vp-custom-block-tip-border: #FFCC99; - --vp-custom-block-tip-text: #F06C33; + --vp-c-brand-1:#F06C33; + --vp-home-hero-name-color:#F06C33; + --vp-button-brand-bg:#F06C33; + --vp-button-brand-hover-bg:#ff986b; } .vp-doc .custom-block p { diff --git a/docs/package.json b/docs/package.json index c3620a3e..236dc957 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,11 +1,11 @@ { "type": "module", - "scripts": { - "docs:dev": "vitepress dev", - "docs:build": "vitepress build", - "docs:preview": "vitepress preview" - }, - "devDependencies": { - "vitepress": "^1.0.0-beta.3 " - } + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.0.0-rc.32" + } } From 7da5dbbbef7913840e0257558c3ba3c831f6e9a4 Mon Sep 17 00:00:00 2001 From: bf109f <1533964916@qq.com> Date: Sun, 24 Dec 2023 08:30:58 +0000 Subject: [PATCH 07/28] =?UTF-8?q?update=20docs/zh/core/data-permission.md.?= =?UTF-8?q?=20=E5=AE=9E=E4=BE=8B=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/core/data-permission.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/core/data-permission.md b/docs/zh/core/data-permission.md index 4056de2c..52c61d2f 100644 --- a/docs/zh/core/data-permission.md +++ b/docs/zh/core/data-permission.md @@ -119,7 +119,7 @@ public class AuthDialectImpl extends CommonsDialectImpl { 对`QueryWrapper`的表做筛选可参考 **方式1** 在项目启动时通过 `DialectFactory` 注册 `AuthDialectImpl`,以spring boot项目为例: -``` +```java @Configuration public class MybatisFlexConfig implements MyBatisFlexCustomizer { From 2b87ceb5cc3cb7ff1fe3ee7ca5922637570b864d Mon Sep 17 00:00:00 2001 From: kamosama <837080904@qq.com> Date: Mon, 25 Dec 2023 09:01:04 +0800 Subject: [PATCH 08/28] docs:update use-in-kotlin.md file of paginate function --- docs/zh/intro/use-in-kotlin.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/zh/intro/use-in-kotlin.md b/docs/zh/intro/use-in-kotlin.md index b94a79c1..f5b80c54 100644 --- a/docs/zh/intro/use-in-kotlin.md +++ b/docs/zh/intro/use-in-kotlin.md @@ -32,7 +32,8 @@ >- `all<实体类>()` 查泛型对应的表的所有数据 >- `filter<实体类>(vararg KProperty<*>, ()->QueryCondition)` 按条件查泛型对应的表的数据 >- `query<实体类>(QueryScope.()->Unit)` 较复杂查泛型对应的表的数据 (如: 分组,排序等) - + >- `paginateWith(pageNumber: Number, pageSize: Number, totalRow: Number? = null, queryConditionGet: () -> QueryCondition): Page<实体类>` + 与 `paginate(pageNumber: Number, pageSize: Number, totalRow: Number? = null, init: QueryScope.() -> Unit): Page<实体类>` 使用分页的条件查询与较复杂查询 - 简明地构建查询:通过中缀表达式➕扩展方法能更加简单明了的构建条件: * **【对比原生】** From 330715e9280edea1e63c86678da322cd0f5ac2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=9B=E5=A3=B0=E4=BE=9D=E6=97=A7?= <1253619383@qq.com> Date: Mon, 25 Dec 2023 05:23:23 +0000 Subject: [PATCH 09/28] =?UTF-8?q?update=20docs/zh/core/logic-delete.md.=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E2=80=9D=E5=81=87=E8=AE=BE=E5=9C=A8=20tb=5Fa?= =?UTF-8?q?ccount=20=E8=A1=A8=E4=B8=AD=EF=BC=8C=E5=AD=98=E5=9C=A8=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E4=B8=BA=20is=5Fdeleted=20=E7=9A=84=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E2=80=9C=20=E4=B8=AD=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E2=80=9Dis=5Fdeleted=E2=80=9C=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E4=B8=BA=E2=80=9Dis=5Fdelete=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 涛声依旧 <1253619383@qq.com> --- docs/zh/core/logic-delete.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/core/logic-delete.md b/docs/zh/core/logic-delete.md index 108bff4b..cb841973 100644 --- a/docs/zh/core/logic-delete.md +++ b/docs/zh/core/logic-delete.md @@ -10,7 +10,7 @@ ## MyBatis-Flex 逻辑删除示例 -假设在 tb_account 表中,存在一个为 is_deleted 的字段,用来标识该数据的逻辑删除,那么 tb_account 表 +假设在 tb_account 表中,存在一个为 is_delete 的字段,用来标识该数据的逻辑删除,那么 tb_account 表 对应的 "Account.java" 实体类应该配置如下: ```java From b47bcbfbc74bebdeecedd4b332f2c3cb72682b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=8C=AF=E8=B6=85?= Date: Mon, 25 Dec 2023 06:26:44 +0000 Subject: [PATCH 10/28] =?UTF-8?q?=E6=BB=9E=E5=90=8EFieldWrapper=E7=9A=84se?= =?UTF-8?q?tter=E7=9A=84=E7=A9=BA=E5=88=A4=E6=96=AD=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0getter=E7=9A=84=E7=A9=BA=E5=88=A4=E6=96=AD=20=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E9=83=A8=E5=88=86=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C?= =?UTF-8?q?=E6=9E=84=E5=BB=BAFieldWrapper=E5=90=8E=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=B8=8D=E9=9C=80=E8=A6=81=E7=94=A8=E5=88=B0setter=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E6=89=80=E4=BB=A5=E9=80=9A=E5=B8=B8=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E4=B8=8A=E5=B0=B1=E4=B8=8D=E5=A3=B0=E6=98=8E=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E7=9A=84setter=E4=BA=86=EF=BC=8C=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E6=AD=A4=E6=97=B6=E4=BC=9A=E6=8A=A5=E9=94=99=E3=80=82=E6=8A=8A?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=BB=9E=E5=90=8E=E5=88=B0=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=85=BC?= =?UTF-8?q?=E9=A1=BE=E7=9A=84=E8=A7=A3=E5=86=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/core/util/FieldWrapper.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java index 4438df55..15ff3bce 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/FieldWrapper.java @@ -58,13 +58,9 @@ public class FieldWrapper { String setterName = "set" + StringUtil.firstCharToUpperCase(fieldName); Method setter = ClassUtil.getFirstMethod(clazz, method -> - method.getParameterCount() == 1 - && Modifier.isPublic(method.getModifiers()) - && method.getName().equals(setterName)); - - if (setter == null) { - throw new IllegalStateException("Can not find method \"set" + StringUtil.firstCharToUpperCase(fieldName) + "\" in class: " + clazz); - } + method.getParameterCount() == 1 + && Modifier.isPublic(method.getModifiers()) + && method.getName().equals(setterName)); fieldWrapper = new FieldWrapper(); fieldWrapper.field = findField; @@ -80,8 +76,8 @@ public class FieldWrapper { String[] getterNames = new String[]{"get" + StringUtil.firstCharToUpperCase(fieldName), "is" + StringUtil.firstCharToUpperCase(fieldName)}; fieldWrapper.getterMethod = ClassUtil.getFirstMethod(clazz, method -> method.getParameterCount() == 0 - && Modifier.isPublic(method.getModifiers()) - && ArrayUtil.contains(getterNames, method.getName())); + && Modifier.isPublic(method.getModifiers()) + && ArrayUtil.contains(getterNames, method.getName())); wrapperMap.put(fieldName, fieldWrapper); } @@ -120,6 +116,9 @@ public class FieldWrapper { public void set(Object value, Object to) { try { + if (setterMethod == null) { + throw new IllegalStateException("Can not find method \"set" + StringUtil.firstCharToUpperCase(field.getName()) + "\" in class: " + to.getClass()); + } setterMethod.invoke(to, value); } catch (Exception e) { throw new RuntimeException(e); @@ -128,6 +127,9 @@ public class FieldWrapper { public Object get(Object target) { try { + if (getterMethod == null) { + throw new IllegalStateException("Can not find method \"get" + StringUtil.firstCharToUpperCase(field.getName()) + ", is" + StringUtil.firstCharToUpperCase(field.getName()) + "\" in class: " + target.getClass()); + } return getterMethod.invoke(target); } catch (Exception e) { throw new RuntimeException(e); @@ -153,4 +155,4 @@ public class FieldWrapper { public boolean isIgnore() { return isIgnore; } -} +} \ No newline at end of file From 20241af96a8a5805d3b63c7d5c5df65529e6e1b6 Mon Sep 17 00:00:00 2001 From: witt Date: Tue, 26 Dec 2023 14:26:27 +0800 Subject: [PATCH 11/28] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0NOT=20(column)?= =?UTF-8?q?=20=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mybatisflex/core/query/QueryMethods.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java index 574dd58d..5a5b5719 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java @@ -2564,6 +2564,13 @@ public class QueryMethods { return new OperatorQueryCondition("NOT ", childCondition); } + /** + * {@code NOT (column)} 或 {@code NOT column} + */ + public static QueryColumn not(LambdaGetter column) { + return new FunctionQueryColumn("NOT", LambdaUtil.getQueryColumn(column)); + } + /** * 空条件。 */ From 0f1c7badb5e6b1ee5cf1c41a46e519ed9304707e Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 26 Dec 2023 17:10:16 +0800 Subject: [PATCH 12/28] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20spring-boot-?= =?UTF-8?q?3=20=E9=80=82=E9=85=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mybatis-flex-spring-boot-3-starter/pom.xml | 40 ++++++++++++++++++++++ pom.xml | 1 + 2 files changed, 41 insertions(+) create mode 100644 mybatis-flex-spring-boot-3-starter/pom.xml diff --git a/mybatis-flex-spring-boot-3-starter/pom.xml b/mybatis-flex-spring-boot-3-starter/pom.xml new file mode 100644 index 00000000..cc0c55a3 --- /dev/null +++ b/mybatis-flex-spring-boot-3-starter/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.mybatis-flex + parent + 1.7.6 + + + mybatis-flex-spring-boot-3-starter + + + 17 + 17 + UTF-8 + + + + + com.mybatis-flex + mybatis-flex-spring-boot-starter + 1.7.6 + + + org.mybatis + mybatis-spring + + + + + + org.mybatis + mybatis-spring + 3.0.3 + + + + diff --git a/pom.xml b/pom.xml index 44715bb0..1d463502 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,7 @@ mybatis-flex-test mybatis-flex-processor mybatis-flex-dependencies + mybatis-flex-spring-boot-3-starter From 53dd6b378d3acb5dd6faa6ac6d081e32ea4f6c4c Mon Sep 17 00:00:00 2001 From: michael Date: Wed, 27 Dec 2023 09:44:08 +0800 Subject: [PATCH 13/28] refactor: rename "mybatis-flex-spring-boot-3-starter" to "mybatis-flex-spring-boot3-starter" --- .../pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename {mybatis-flex-spring-boot-3-starter => mybatis-flex-spring-boot3-starter}/pom.xml (95%) diff --git a/mybatis-flex-spring-boot-3-starter/pom.xml b/mybatis-flex-spring-boot3-starter/pom.xml similarity index 95% rename from mybatis-flex-spring-boot-3-starter/pom.xml rename to mybatis-flex-spring-boot3-starter/pom.xml index cc0c55a3..0262ebde 100644 --- a/mybatis-flex-spring-boot-3-starter/pom.xml +++ b/mybatis-flex-spring-boot3-starter/pom.xml @@ -9,7 +9,7 @@ 1.7.6 - mybatis-flex-spring-boot-3-starter + mybatis-flex-spring-boot3-starter 17 diff --git a/pom.xml b/pom.xml index 1d463502..5305d946 100644 --- a/pom.xml +++ b/pom.xml @@ -45,11 +45,11 @@ mybatis-flex-core mybatis-flex-spring mybatis-flex-spring-boot-starter + mybatis-flex-spring-boot3-starter mybatis-flex-solon-plugin mybatis-flex-test mybatis-flex-processor mybatis-flex-dependencies - mybatis-flex-spring-boot-3-starter From f81b5e0a3559ce27bddeb2800afcc9483cde755a Mon Sep 17 00:00:00 2001 From: lionel Date: Wed, 27 Dec 2023 15:33:23 +0800 Subject: [PATCH 14/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0solon=E8=87=AAv2.5.2?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B9=8B=E5=90=8E=E5=8D=B3=E5=B0=86=E5=BC=83?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E6=B3=A8=E8=A7=A3,=E5=B0=86@ProxyComponent?= =?UTF-8?q?=E6=94=B9=E4=B8=BA@Component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/templates/enjoy/serviceImpl-Solon.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mybatis-flex-codegen/src/main/resources/templates/enjoy/serviceImpl-Solon.tpl b/mybatis-flex-codegen/src/main/resources/templates/enjoy/serviceImpl-Solon.tpl index 5b8a8f7c..c7e6ca02 100644 --- a/mybatis-flex-codegen/src/main/resources/templates/enjoy/serviceImpl-Solon.tpl +++ b/mybatis-flex-codegen/src/main/resources/templates/enjoy/serviceImpl-Solon.tpl @@ -4,7 +4,7 @@ import com.mybatisflex.solon.service.impl.ServiceImpl; import #(packageConfig.entityPackage).#(table.buildEntityClassName()); import #(packageConfig.mapperPackage).#(table.buildMapperClassName()); import #(packageConfig.servicePackage).#(table.buildServiceClassName()); -import org.noear.solon.annotation.ProxyComponent; +import org.noear.solon.annotation.Component; /** * #(table.getComment()) 服务层实现。 @@ -12,7 +12,7 @@ import org.noear.solon.annotation.ProxyComponent; * @author #(javadocConfig.getAuthor()) * @since #(javadocConfig.getSince()) */ -@ProxyComponent +@Component public class #(table.buildServiceImplClassName()) extends ServiceImpl<#(table.buildMapperClassName()), #(table.buildEntityClassName())> implements #(table.buildServiceClassName()) { } From b71c6587d8a652c1e3f4a05db65cbbd28262e1e1 Mon Sep 17 00:00:00 2001 From: Martin7-1 <1754350460@qq.com> Date: Thu, 28 Dec 2023 21:17:32 +0800 Subject: [PATCH 15/28] Testcontainers with QueryChainTest --- .../mybatis-flex-spring-boot-test/pom.xml | 12 +++++++++ .../test/mapper/QueryChainTest.java | 27 +++++++++++++++++++ pom.xml | 9 +++++++ 3 files changed, 48 insertions(+) diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml index 18cff34c..6b4682cc 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml @@ -83,6 +83,18 @@ test + + org.testcontainers + testcontainers + test + + + com.fasterxml.jackson.core + jackson-annotations + + + + diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java index 2e3f6e46..631d3112 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java @@ -22,10 +22,18 @@ import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.update.UpdateChain; import com.mybatisflex.test.model.Gender; import com.mybatisflex.test.model.User; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +import java.util.Collections; import static com.mybatisflex.test.model.table.RoleTableDef.ROLE; import static com.mybatisflex.test.model.table.UserRoleTableDef.USER_ROLE; @@ -38,9 +46,28 @@ import static com.mybatisflex.test.model.table.UserTableDef.USER; @SpringBootTest class QueryChainTest { + static final String TEST_DDL = QueryChainTest.class.getClassLoader().getResource("flex_test.sql").getPath(); + static GenericContainer mysql = new GenericContainer<>(DockerImageName.parse("mysql:8.2.0")) + .waitingFor(Wait.forLogMessage(".*ready for connections.*\\n", 1)) + // bind DDL to container /docker-entrypoint-initdb.d and it will execute automatically + .withFileSystemBind(TEST_DDL, "/docker-entrypoint-initdb.d/flex_test.sql", BindMode.READ_ONLY) + .withEnv("MYSQL_DATABASE", "flex_test") + .withEnv("MYSQL_ROOT_PASSWORD", "123456"); + @Autowired UserMapper userMapper; + @BeforeAll + public static void start() { + mysql.setPortBindings(Collections.singletonList("3306:3306")); + mysql.start(); + } + + @AfterAll + public static void stop() { + mysql.stop(); + } + @Test void testFields() { QueryBuilder builder = user -> diff --git a/pom.xml b/pom.xml index f1f9cf4b..d86684fd 100644 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,7 @@ 2.5.3 4.13.2 + 1.19.3 1.5.0 @@ -188,6 +189,14 @@ true + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + From d569c8c813cfc2d8fdb4928ad19250437bbbc725 Mon Sep 17 00:00:00 2001 From: whz Date: Fri, 29 Dec 2023 14:43:40 +0800 Subject: [PATCH 16/28] =?UTF-8?q?[fix]=20=E4=BF=AE=E6=AD=A3=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=20com.mybatisflex.annotation.SetListener?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mybatisflex/annotation/SetListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/SetListener.java b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/SetListener.java index c64993bf..59b9603b 100644 --- a/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/SetListener.java +++ b/mybatis-flex-annotation/src/main/java/com/mybatisflex/annotation/SetListener.java @@ -26,7 +26,7 @@ public interface SetListener extends Listener { * @param entity 实体类 * @param property 属性名 * @param value 属性值 - * @return 实体类 + * @return 属性值 */ Object onSet(Object entity, String property, Object value); From ce3a74e16d7581b9689e8cecb77522274ea61965 Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 31 Dec 2023 12:59:42 +0800 Subject: [PATCH 17/28] fix: IService.getOne by condition --- .../src/main/java/com/mybatisflex/core/service/IService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/service/IService.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/service/IService.java index 74a5fb3d..9f26fd1b 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/service/IService.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/service/IService.java @@ -376,7 +376,7 @@ public interface IService { * @return 查询结果数据 */ default T getOne(QueryCondition condition) { - return getOne(query().where(condition)); + return getOne(query().where(condition).limit(1)); } /** From 2d9d05b6e52e8586f111f60dc6da27ce7d94d23c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=8D=9A?= <7966959+zhang-bo-bo@user.noreply.gitee.com> Date: Sun, 31 Dec 2023 14:33:47 +0000 Subject: [PATCH 18/28] =?UTF-8?q?!403=20distinct=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0lambda=E6=94=AF=E6=8C=81=20*=20opt:=20distinc?= =?UTF-8?q?t=E6=96=B9=E6=B3=95=E6=B7=BB=E5=8A=A0lambda=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20*=20opt:=20distinct=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0lambda=E5=8F=82=E6=95=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mybatisflex/core/query/QueryMethods.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java index 574dd58d..6af2d6ba 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java @@ -22,6 +22,7 @@ import com.mybatisflex.core.util.LambdaGetter; import com.mybatisflex.core.util.LambdaUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static com.mybatisflex.core.constant.FuncName.*; @@ -2346,6 +2347,12 @@ public class QueryMethods { return new DistinctQueryColumn(columns); } + @SafeVarargs + public static DistinctQueryColumn distinct(LambdaGetter... columns) { + return new DistinctQueryColumn(Arrays.stream(columns) + .map(LambdaUtil::getQueryColumn).toArray(QueryColumn[]::new)); + } + // === CASE THEN ELSE === /** From 434b948b8aee497f8856622e00809d80fa852f53 Mon Sep 17 00:00:00 2001 From: tangxin <617054137@qq.com> Date: Wed, 3 Jan 2024 16:48:33 +0800 Subject: [PATCH 19/28] =?UTF-8?q?fix=20Db.updateEntitiesBatch=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=83=A8=E5=88=86=E5=AD=97=E6=AE=B5=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/provider/RowSqlProvider.java | 8 +++-- .../java/com/mybatisflex/test/DbTest.java | 29 ++++++++++++------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java index 6ea5246b..cdc23fec 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java @@ -245,9 +245,13 @@ public class RowSqlProvider { Object entity = ProviderUtil.getEntity(params); FlexAssert.notNull(entity, "entity can not be null"); - + Class entityClass = entity.getClass(); + //如果是代理mybatis代理对象 + if(entity instanceof ProxyObject){ + entityClass = entityClass.getSuperclass(); + } // 该 Mapper 是通用 Mapper 无法通过 ProviderContext 获取,直接使用 TableInfoFactory - TableInfo tableInfo = TableInfoFactory.ofEntityClass(ClassUtil.getUsefulClass(entity.getClass())); + TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass); // 执行 onUpdate 监听器 tableInfo.invokeOnUpdateListener(entity); diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/DbTest.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/DbTest.java index d2517e0e..ec8ffb83 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/DbTest.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/DbTest.java @@ -82,19 +82,28 @@ public class DbTest { Map map2 = Db.selectFirstAndSecondColumnsAsMap("select * from tb_account"); System.out.println(map); System.out.println(map2); + assert map.equals(map2); } @Test public void test03() { - Account account = UpdateEntity.of(Account.class,1); - account.setAge(1); - List accounts = new ArrayList<>(); - accounts.add(account); - Account account2 = UpdateEntity.of(Account.class,2); - account2.setAge(2); - UpdateWrapper updateWrapper = UpdateWrapper.of(account2); - updateWrapper.setRaw("age","age+1"); - accounts.add(account2); - Db.updateEntitiesBatch(accounts); + try { + Account account = UpdateEntity.of(Account.class, 1); + account.setAge(1); + List accounts = new ArrayList<>(); + accounts.add(account); + Account account2 = UpdateEntity.of(Account.class, 2); + account2.setAge(2); + UpdateWrapper updateWrapper = UpdateWrapper.of(account2); + updateWrapper.setRaw("age", "age+1"); + accounts.add(account2); + Account account3 = new Account(); + account3.setId(3L); + account3.setAge(4); + accounts.add(account3); + Db.updateEntitiesBatch(accounts); + }catch (Exception e){ + assert false; + } } } From df11f52e3164145e9bb2f30ffa0f81f27d870099 Mon Sep 17 00:00:00 2001 From: tangxin <617054137@qq.com> Date: Thu, 4 Jan 2024 09:58:38 +0800 Subject: [PATCH 20/28] =?UTF-8?q?fix=20Db.updateEntitiesBatch=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=83=A8=E5=88=86=E5=AD=97=E6=AE=B5=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/core/provider/RowSqlProvider.java | 10 +++------- .../main/java/com/mybatisflex/core/util/ClassUtil.java | 9 +++++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java index cdc23fec..57c3dbef 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java @@ -245,14 +245,10 @@ public class RowSqlProvider { Object entity = ProviderUtil.getEntity(params); FlexAssert.notNull(entity, "entity can not be null"); - Class entityClass = entity.getClass(); - //如果是代理mybatis代理对象 - if(entity instanceof ProxyObject){ - entityClass = entityClass.getSuperclass(); - } - // 该 Mapper 是通用 Mapper 无法通过 ProviderContext 获取,直接使用 TableInfoFactory - TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass); + // 该 Mapper 是通用 Mapper 无法通过 ProviderContext 获取,直接使用 TableInfoFactory + + TableInfo tableInfo = TableInfoFactory.ofEntityClass(ClassUtil.getUsefulClass(entity.getClass())); // 执行 onUpdate 监听器 tableInfo.invokeOnUpdateListener(entity); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java index f2037541..e76c1e5e 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java @@ -70,14 +70,15 @@ public class ClassUtil { } public static Class getUsefulClass(Class clazz) { + + if (ProxyObject.class.isAssignableFrom(clazz)) { + return (Class) clazz.getSuperclass(); + } + if (isProxy(clazz)) { return getJdkProxySuperClass(clazz); } -// if (ProxyObject.class.isAssignableFrom(clazz)){ -// return (Class) clazz.getSuperclass(); -// } - //ControllerTest$ServiceTest$$EnhancerByGuice$$40471411#hello -------> Guice //com.demo.blog.Blog$$EnhancerByCGLIB$$69a17158 ----> CGLIB //io.jboot.test.app.TestAppListener_$$_jvstb9f_0 ------> javassist From 7f5a02b3660f34eb9b8f2cde7bf38a6a2bb281ca Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 4 Jan 2024 16:47:23 +0800 Subject: [PATCH 21/28] build: v1.7.7 release (^.^)YYa!! --- .gitee/ISSUE_TEMPLATE/bug.yml | 2 +- .gitee/ISSUE_TEMPLATE/question.yml | 2 +- changes.md | 16 ++++++++++++++++ docs/zh/intro/getting-started.md | 2 +- docs/zh/intro/gradle.md | 16 ++++++++-------- docs/zh/intro/maven.md | 14 +++++++------- docs/zh/others/apt.md | 2 +- docs/zh/others/codegen.md | 2 +- mybatis-flex-annotation/pom.xml | 2 +- mybatis-flex-codegen/pom.xml | 4 ++-- mybatis-flex-core/pom.xml | 4 ++-- .../java/com/mybatisflex/core/FlexConsts.java | 2 +- mybatis-flex-dependencies/pom.xml | 2 +- mybatis-flex-processor/pom.xml | 4 ++-- mybatis-flex-solon-plugin/pom.xml | 2 +- mybatis-flex-spring-boot-starter/pom.xml | 6 +++--- mybatis-flex-spring-boot3-starter/pom.xml | 6 ++---- mybatis-flex-spring/pom.xml | 4 ++-- .../mybatis-flex-native-test/pom.xml | 2 +- .../mybatis-flex-seata-test/pom.xml | 2 +- .../mybatis-flex-spring-boot-test/pom.xml | 2 +- .../mybatis-flex-spring-cloud-test/pom.xml | 2 +- .../mybatis-flex-spring-test/pom.xml | 2 +- mybatis-flex-test/pom.xml | 2 +- pom.xml | 4 ++-- 25 files changed, 61 insertions(+), 47 deletions(-) diff --git a/.gitee/ISSUE_TEMPLATE/bug.yml b/.gitee/ISSUE_TEMPLATE/bug.yml index e6447795..4d9d2c8f 100644 --- a/.gitee/ISSUE_TEMPLATE/bug.yml +++ b/.gitee/ISSUE_TEMPLATE/bug.yml @@ -7,7 +7,7 @@ body: attributes: label: 这个 Bug 是否已经存在: options: - - label: 我确定已经把 MyBatis-Flex 升级到最新版本 v1.7.6,并已搜索过现有的问题 (https://gitee.com/mybatis-flex/mybatis-flex/issues) + - label: 我确定已经把 MyBatis-Flex 升级到最新版本 v1.7.7,并已搜索过现有的问题 (https://gitee.com/mybatis-flex/mybatis-flex/issues) required: true - type: textarea attributes: diff --git a/.gitee/ISSUE_TEMPLATE/question.yml b/.gitee/ISSUE_TEMPLATE/question.yml index 0a8e8361..553d630b 100644 --- a/.gitee/ISSUE_TEMPLATE/question.yml +++ b/.gitee/ISSUE_TEMPLATE/question.yml @@ -13,7 +13,7 @@ body: attributes: label: 这个问题是否已经存在: options: - - label: 我确定已经把 MyBatis-Flex 升级到最新版本 v1.7.6,并已搜索过现有的问题 (https://gitee.com/mybatis-flex/mybatis-flex/issues) + - label: 我确定已经把 MyBatis-Flex 升级到最新版本 v1.7.7,并已搜索过现有的问题 (https://gitee.com/mybatis-flex/mybatis-flex/issues) required: true - type: textarea id: question-description diff --git a/changes.md b/changes.md index 4e249f93..32dedbc1 100644 --- a/changes.md +++ b/changes.md @@ -2,6 +2,22 @@ 查看 [全部代码贡献者](/zh/intro/what-is-mybatisflex.html#贡献者)。 + +## v1.7.7 20240104: +- 新增:添加 spring-boot3 新模块,用于 springboot v3 下使用,感谢 @Suomm +- 新增:QueryMethods 添加 NOT (column) 函数,感谢 @wittplus +- 优化:更新 Solon 下的 @ProxyComponent 为 @Component,感谢 @citysoft +- 优化:修改 com.mybatisflex.annotation.SetListener 的注释错误,感谢 @whzzone +- 优化:修改 GBase_8s 数据库类型 sql 语句无反义处理 +- 优化:升级 MyBatis 到 3.5.15 最新版本 #I8PQLC +- 修复:IService.getOne 没有添加 limit 1 的问题 +- 修复:Db.updateEntitiesBatch 更新部分字段时报错的问题,感谢 @617054137 +- 文档:更新在 Kotlin 下使用的相关文档,感谢 @kamo-sama +- 文档:优化示例代码提交语言标识,感谢 @bf109f +- 文档:更新存在一个为 is_deleted 的字段中拼写错误,感谢 @shuangtao + + + ## v1.7.6 20231223: - 新增:Db.selectFirstAndSecondColumnsAsMap 方法:查询结果的第一列作为 key,第二列作为 value,感谢 @617054137 - 新增:方言添加添加权限处理统一入口 prepareAuth,感谢 @bf109f diff --git a/docs/zh/intro/getting-started.md b/docs/zh/intro/getting-started.md index 5c127c90..50ce0a36 100644 --- a/docs/zh/intro/getting-started.md +++ b/docs/zh/intro/getting-started.md @@ -62,7 +62,7 @@ VALUES (1, '张三', 18, '2020-01-11'), com.mybatis-flex mybatis-flex-spring-boot-starter - 1.7.6 + 1.7.7 com.mysql diff --git a/docs/zh/intro/gradle.md b/docs/zh/intro/gradle.md index 284de463..c46d186f 100644 --- a/docs/zh/intro/gradle.md +++ b/docs/zh/intro/gradle.md @@ -10,7 +10,7 @@ ```kotlin dependencies { - implementation("com.mybatis-flex:mybatis-flex-core:1.7.6") + implementation("com.mybatis-flex:mybatis-flex-core:1.7.7") } ``` @@ -18,7 +18,7 @@ dependencies { ```groovy dependencies { - implementation 'com.mybatis-flex:mybatis-flex-core:1.7.6' + implementation 'com.mybatis-flex:mybatis-flex-core:1.7.7' } ``` @@ -28,7 +28,7 @@ dependencies { ```kotlin dependencies { - implementation("com.mybatis-flex:mybatis-flex-spring:1.7.6") + implementation("com.mybatis-flex:mybatis-flex-spring:1.7.7") } ``` @@ -36,7 +36,7 @@ dependencies { ```groovy dependencies { - implementation 'com.mybatis-flex:mybatis-flex-spring:1.7.6' + implementation 'com.mybatis-flex:mybatis-flex-spring:1.7.7' } ``` @@ -46,7 +46,7 @@ dependencies { ```kotlin dependencies { - implementation("com.mybatis-flex:mybatis-flex-spring-boot-starter:1.7.6") + implementation("com.mybatis-flex:mybatis-flex-spring-boot-starter:1.7.7") } ``` @@ -54,7 +54,7 @@ dependencies { ```groovy dependencies { - implementation 'com.mybatis-flex:mybatis-flex-spring-boot-starter:1.7.6' + implementation 'com.mybatis-flex:mybatis-flex-spring-boot-starter:1.7.7' } ``` @@ -70,7 +70,7 @@ dependencies { ```kotlin dependencies { - annotationProcessor("com.mybatis-flex:mybatis-flex-processor:1.7.6") + annotationProcessor("com.mybatis-flex:mybatis-flex-processor:1.7.7") } ``` @@ -78,6 +78,6 @@ dependencies { ```groovy dependencies { - annotationProcessor 'com.mybatis-flex:mybatis-flex-processor:1.7.6' + annotationProcessor 'com.mybatis-flex:mybatis-flex-processor:1.7.7' } ``` diff --git a/docs/zh/intro/maven.md b/docs/zh/intro/maven.md index 84ac8455..297a0a3a 100644 --- a/docs/zh/intro/maven.md +++ b/docs/zh/intro/maven.md @@ -12,12 +12,12 @@ com.mybatis-flex mybatis-flex-core - 1.7.6 + 1.7.7 com.mybatis-flex mybatis-flex-processor - 1.7.6 + 1.7.7 provided ``` @@ -28,12 +28,12 @@ com.mybatis-flex mybatis-flex-spring - 1.7.6 + 1.7.7 com.mybatis-flex mybatis-flex-processor - 1.7.6 + 1.7.7 provided `````` @@ -44,12 +44,12 @@ com.mybatis-flex mybatis-flex-spring-boot-starter - 1.7.6 + 1.7.7 com.mybatis-flex mybatis-flex-processor - 1.7.6 + 1.7.7 provided ``` @@ -72,7 +72,7 @@ com.mybatis-flex mybatis-flex-processor - 1.7.6 + 1.7.7 diff --git a/docs/zh/others/apt.md b/docs/zh/others/apt.md index 9c056bd9..213f7222 100644 --- a/docs/zh/others/apt.md +++ b/docs/zh/others/apt.md @@ -220,7 +220,7 @@ pom.xml 添加 `annotationProcessorPaths` 配置, ``` dependencies { ... - annotationProcessor 'com.mybatis-flex:mybatis-flex-processor:1.7.6' + annotationProcessor 'com.mybatis-flex:mybatis-flex-processor:1.7.7' } ``` diff --git a/docs/zh/others/codegen.md b/docs/zh/others/codegen.md index 48d9d28d..a0643150 100644 --- a/docs/zh/others/codegen.md +++ b/docs/zh/others/codegen.md @@ -10,7 +10,7 @@ com.mybatis-flex mybatis-flex-codegen - 1.7.6 + 1.7.7 ``` diff --git a/mybatis-flex-annotation/pom.xml b/mybatis-flex-annotation/pom.xml index f1612b12..4bd5cad8 100644 --- a/mybatis-flex-annotation/pom.xml +++ b/mybatis-flex-annotation/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/mybatis-flex-codegen/pom.xml b/mybatis-flex-codegen/pom.xml index 53600f03..96e560be 100644 --- a/mybatis-flex-codegen/pom.xml +++ b/mybatis-flex-codegen/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 @@ -23,7 +23,7 @@ com.mybatis-flex mybatis-flex-core - 1.7.6 + 1.7.7 com.mybatis-flex diff --git a/mybatis-flex-core/pom.xml b/mybatis-flex-core/pom.xml index 0d005352..b46bc50e 100644 --- a/mybatis-flex-core/pom.xml +++ b/mybatis-flex-core/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 @@ -101,7 +101,7 @@ com.mybatis-flex mybatis-flex-annotation - 1.7.6 + 1.7.7 compile diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexConsts.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexConsts.java index fb20d428..feaa5ea4 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexConsts.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexConsts.java @@ -27,7 +27,7 @@ public class FlexConsts { } public static final String NAME = "MyBatis-Flex"; - public static final String VERSION = "1.7.6"; + public static final String VERSION = "1.7.7"; public static final String SQL = "$$sql"; diff --git a/mybatis-flex-dependencies/pom.xml b/mybatis-flex-dependencies/pom.xml index c6b33349..703b23d9 100644 --- a/mybatis-flex-dependencies/pom.xml +++ b/mybatis-flex-dependencies/pom.xml @@ -6,7 +6,7 @@ com.mybatis-flex parent - 1.7.6 + 1.7.7 mybatis-flex-dependencies diff --git a/mybatis-flex-processor/pom.xml b/mybatis-flex-processor/pom.xml index 94005f6f..d21bc5a6 100644 --- a/mybatis-flex-processor/pom.xml +++ b/mybatis-flex-processor/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 @@ -22,7 +22,7 @@ com.mybatis-flex mybatis-flex-annotation - 1.7.6 + 1.7.7 diff --git a/mybatis-flex-solon-plugin/pom.xml b/mybatis-flex-solon-plugin/pom.xml index ad1d44d9..aa86d233 100644 --- a/mybatis-flex-solon-plugin/pom.xml +++ b/mybatis-flex-solon-plugin/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/mybatis-flex-spring-boot-starter/pom.xml b/mybatis-flex-spring-boot-starter/pom.xml index a7006f00..a67ad2f0 100644 --- a/mybatis-flex-spring-boot-starter/pom.xml +++ b/mybatis-flex-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 @@ -23,7 +23,7 @@ com.mybatis-flex mybatis-flex-spring - 1.7.6 + 1.7.7 @@ -104,7 +104,7 @@ com.mybatis-flex mybatis-flex-core - 1.7.6 + 1.7.7 diff --git a/mybatis-flex-spring-boot3-starter/pom.xml b/mybatis-flex-spring-boot3-starter/pom.xml index 0262ebde..fa81e211 100644 --- a/mybatis-flex-spring-boot3-starter/pom.xml +++ b/mybatis-flex-spring-boot3-starter/pom.xml @@ -6,14 +6,12 @@ com.mybatis-flex parent - 1.7.6 + 1.7.7 mybatis-flex-spring-boot3-starter - 17 - 17 UTF-8 @@ -21,7 +19,7 @@ com.mybatis-flex mybatis-flex-spring-boot-starter - 1.7.6 + 1.7.7 org.mybatis diff --git a/mybatis-flex-spring/pom.xml b/mybatis-flex-spring/pom.xml index 9cb19cef..77b2367a 100644 --- a/mybatis-flex-spring/pom.xml +++ b/mybatis-flex-spring/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 @@ -22,7 +22,7 @@ com.mybatis-flex mybatis-flex-core - 1.7.6 + 1.7.7 diff --git a/mybatis-flex-test/mybatis-flex-native-test/pom.xml b/mybatis-flex-test/mybatis-flex-native-test/pom.xml index 80ac5708..ff522064 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-native-test/pom.xml @@ -5,7 +5,7 @@ mybatis-flex-test com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/mybatis-flex-test/mybatis-flex-seata-test/pom.xml b/mybatis-flex-test/mybatis-flex-seata-test/pom.xml index ef485c68..59bc0f72 100644 --- a/mybatis-flex-test/mybatis-flex-seata-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-seata-test/pom.xml @@ -4,7 +4,7 @@ mybatis-flex-test com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml index 18cff34c..cd0d5a91 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml @@ -5,7 +5,7 @@ mybatis-flex-test com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/mybatis-flex-test/mybatis-flex-spring-cloud-test/pom.xml b/mybatis-flex-test/mybatis-flex-spring-cloud-test/pom.xml index fe713334..01b7618a 100644 --- a/mybatis-flex-test/mybatis-flex-spring-cloud-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-cloud-test/pom.xml @@ -4,7 +4,7 @@ mybatis-flex-test com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/mybatis-flex-test/mybatis-flex-spring-test/pom.xml b/mybatis-flex-test/mybatis-flex-spring-test/pom.xml index 6467bf97..bae84b63 100644 --- a/mybatis-flex-test/mybatis-flex-spring-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-test/pom.xml @@ -5,7 +5,7 @@ mybatis-flex-test com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/mybatis-flex-test/pom.xml b/mybatis-flex-test/pom.xml index 9b5af1ee..38eac0b5 100644 --- a/mybatis-flex-test/pom.xml +++ b/mybatis-flex-test/pom.xml @@ -5,7 +5,7 @@ parent com.mybatis-flex - 1.7.6 + 1.7.7 4.0.0 diff --git a/pom.xml b/pom.xml index 5305d946..45f4c3bd 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.mybatis-flex parent pom - 1.7.6 + 1.7.7 mybatis-flex https://mybatis-flex.com @@ -56,7 +56,7 @@ 8 8 - 1.7.6 + 1.7.7 3.5.15 2.1.2 From 124426c4dd41b6afd565fab1442684cbcc55e968 Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 4 Jan 2024 16:49:01 +0800 Subject: [PATCH 22/28] build: v1.7.7 release (^.^)YYa!! --- docs/zh/changes.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/zh/changes.md b/docs/zh/changes.md index 4e249f93..32dedbc1 100644 --- a/docs/zh/changes.md +++ b/docs/zh/changes.md @@ -2,6 +2,22 @@ 查看 [全部代码贡献者](/zh/intro/what-is-mybatisflex.html#贡献者)。 + +## v1.7.7 20240104: +- 新增:添加 spring-boot3 新模块,用于 springboot v3 下使用,感谢 @Suomm +- 新增:QueryMethods 添加 NOT (column) 函数,感谢 @wittplus +- 优化:更新 Solon 下的 @ProxyComponent 为 @Component,感谢 @citysoft +- 优化:修改 com.mybatisflex.annotation.SetListener 的注释错误,感谢 @whzzone +- 优化:修改 GBase_8s 数据库类型 sql 语句无反义处理 +- 优化:升级 MyBatis 到 3.5.15 最新版本 #I8PQLC +- 修复:IService.getOne 没有添加 limit 1 的问题 +- 修复:Db.updateEntitiesBatch 更新部分字段时报错的问题,感谢 @617054137 +- 文档:更新在 Kotlin 下使用的相关文档,感谢 @kamo-sama +- 文档:优化示例代码提交语言标识,感谢 @bf109f +- 文档:更新存在一个为 is_deleted 的字段中拼写错误,感谢 @shuangtao + + + ## v1.7.6 20231223: - 新增:Db.selectFirstAndSecondColumnsAsMap 方法:查询结果的第一列作为 key,第二列作为 value,感谢 @617054137 - 新增:方言添加添加权限处理统一入口 prepareAuth,感谢 @bf109f From 0fe079c0f45be1d23b1f7371f9ed533d7c870d74 Mon Sep 17 00:00:00 2001 From: Martin7-1 <1754350460@qq.com> Date: Sat, 6 Jan 2024 15:19:52 +0800 Subject: [PATCH 23/28] testcontainers reuse --- .../mybatis-flex-spring-boot-test/pom.xml | 6 ++++ .../mybatisflex/test/TestInfrastructure.java | 33 +++++++++++++++++++ .../test/mapper/AccountMapperTest.java | 6 ++-- .../test/mapper/ActiveRecordTest.java | 3 +- .../test/mapper/CombinedMapperTest.java | 3 +- .../test/mapper/MyAccountMapperTest.java | 3 +- .../test/mapper/OuterMapperTest.java | 4 +-- .../test/mapper/PatientMapperTest.java | 3 +- .../test/mapper/QueryChainTest.java | 30 ++--------------- .../test/mapper/UserMapperTest.java | 3 +- .../test/service/ArticleServiceTest.java | 3 +- .../test/service/FieldMappingTest.java | 4 ++- 12 files changed, 60 insertions(+), 41 deletions(-) create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/TestInfrastructure.java diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml index 6b4682cc..6f2aa048 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml @@ -95,6 +95,12 @@ + + org.testcontainers + mysql + test + + diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/TestInfrastructure.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/TestInfrastructure.java new file mode 100644 index 00000000..128a4c0e --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/TestInfrastructure.java @@ -0,0 +1,33 @@ +package com.mybatisflex.test; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +import java.util.Collections; + +public class TestInfrastructure { + + static final String FLEX_TEST_DDL = TestInfrastructure.class.getClassLoader().getResource("flex_test.sql").getPath(); + static final String FIELD_MAPPING_TEST_DDL = TestInfrastructure.class.getClassLoader().getResource("field_mapping_test.sql").getPath(); + static final String PATIENT_DATA_SPLIT_TEST_DDL = TestInfrastructure.class.getClassLoader().getResource("patient_data_split_test.sql").getPath(); + static final String DOCKER_INITDB_PATH = "/docker-entrypoint-initdb.d/"; + static GenericContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.2.0")) + .waitingFor(Wait.forLogMessage(".*ready for connections.*\\n", 1)) + .withFileSystemBind(FLEX_TEST_DDL, DOCKER_INITDB_PATH + "flex_test.sql", BindMode.READ_ONLY) + .withFileSystemBind(FIELD_MAPPING_TEST_DDL, DOCKER_INITDB_PATH + "field_mapping_test.sql", BindMode.READ_ONLY) + .withFileSystemBind(PATIENT_DATA_SPLIT_TEST_DDL, DOCKER_INITDB_PATH + "patient_data_split_test.sql", BindMode.READ_ONLY) + .withDatabaseName("flex_test") + .withReuse(true) + .withPassword("123456"); + + @BeforeAll + public static void start() { + mysql.setPortBindings(Collections.singletonList("3306:3306")); + mysql.start(); + } +} diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java index 36e9c849..f0b2ebe6 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AccountMapperTest.java @@ -19,18 +19,16 @@ package com.mybatisflex.test.mapper; import com.mybatisflex.core.logicdelete.LogicDeleteManager; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.row.Db; -import com.mybatisflex.core.row.Row; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.model.Account; import com.mybatisflex.test.model.AccountVO; import com.mybatisflex.test.model.AccountVO2; -import lombok.val; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Date; -import java.util.List; import static com.mybatisflex.core.query.QueryMethods.*; import static com.mybatisflex.test.model.table.AccountTableDef.ACCOUNT; @@ -44,7 +42,7 @@ import static com.mybatisflex.test.model.table.UserTableDef.USER; */ @SpringBootTest @SuppressWarnings("all") -class AccountMapperTest { +class AccountMapperTest extends TestInfrastructure { @Autowired private AccountMapper accountMapper; diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/ActiveRecordTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/ActiveRecordTest.java index fbb101a6..82c185eb 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/ActiveRecordTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/ActiveRecordTest.java @@ -18,6 +18,7 @@ package com.mybatisflex.test.mapper; import com.mybatisflex.core.mybatis.Mappers; import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.model.Good; import com.mybatisflex.test.model.User; import org.junit.jupiter.api.Assertions; @@ -34,7 +35,7 @@ import static com.mybatisflex.test.model.table.UserTableDef.USER; * @since 2023-07-23 */ @SpringBootTest -class ActiveRecordTest { +class ActiveRecordTest extends TestInfrastructure { @Test void testMapper() { diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/CombinedMapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/CombinedMapperTest.java index 0b1e401a..c62bece2 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/CombinedMapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/CombinedMapperTest.java @@ -17,6 +17,7 @@ package com.mybatisflex.test.mapper; import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.model.Account; import com.mybatisflex.test.model.Article; import org.junit.jupiter.api.Test; @@ -26,7 +27,7 @@ import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest -public class CombinedMapperTest { +public class CombinedMapperTest extends TestInfrastructure { @Autowired private AccountMapper accountMapper; diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/MyAccountMapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/MyAccountMapperTest.java index cecbc390..948510ab 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/MyAccountMapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/MyAccountMapperTest.java @@ -16,6 +16,7 @@ package com.mybatisflex.test.mapper; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.model.Account; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -32,7 +33,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; * @since 2023/4/24 19:37 */ @SpringBootTest -class MyAccountMapperTest { +class MyAccountMapperTest extends TestInfrastructure { @Autowired private MyAccountMapper mapper; diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/OuterMapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/OuterMapperTest.java index 6dfe5c9c..b672e963 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/OuterMapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/OuterMapperTest.java @@ -17,7 +17,7 @@ package com.mybatisflex.test.mapper; import com.mybatisflex.core.query.QueryWrapper; -import com.mybatisflex.test.entity.Inner; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.entity.Outer; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -32,7 +32,7 @@ import static com.mybatisflex.test.entity.table.OuterTableDef.OUTER; * @since 2023-07-01 */ @SpringBootTest -class OuterMapperTest { +class OuterMapperTest extends TestInfrastructure { @Autowired private OuterMapper outerMapper; diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/PatientMapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/PatientMapperTest.java index 6a53111a..c2058846 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/PatientMapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/PatientMapperTest.java @@ -1,5 +1,6 @@ package com.mybatisflex.test.mapper; +import com.mybatisflex.test.TestInfrastructure; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -13,7 +14,7 @@ import javax.annotation.Resource; */ @SpringBootTest @SuppressWarnings("all") -public class PatientMapperTest { +public class PatientMapperTest extends TestInfrastructure { @Resource private PatientMapper patientMapper; diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java index 631d3112..07dcc0b2 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/QueryChainTest.java @@ -20,20 +20,13 @@ import com.mybatisflex.core.field.QueryBuilder; import com.mybatisflex.core.query.QueryChain; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.update.UpdateChain; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.model.Gender; import com.mybatisflex.test.model.User; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.testcontainers.containers.BindMode; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.utility.DockerImageName; - -import java.util.Collections; import static com.mybatisflex.test.model.table.RoleTableDef.ROLE; import static com.mybatisflex.test.model.table.UserRoleTableDef.USER_ROLE; @@ -44,30 +37,11 @@ import static com.mybatisflex.test.model.table.UserTableDef.USER; * @since 2023-08-08 */ @SpringBootTest -class QueryChainTest { - - static final String TEST_DDL = QueryChainTest.class.getClassLoader().getResource("flex_test.sql").getPath(); - static GenericContainer mysql = new GenericContainer<>(DockerImageName.parse("mysql:8.2.0")) - .waitingFor(Wait.forLogMessage(".*ready for connections.*\\n", 1)) - // bind DDL to container /docker-entrypoint-initdb.d and it will execute automatically - .withFileSystemBind(TEST_DDL, "/docker-entrypoint-initdb.d/flex_test.sql", BindMode.READ_ONLY) - .withEnv("MYSQL_DATABASE", "flex_test") - .withEnv("MYSQL_ROOT_PASSWORD", "123456"); +class QueryChainTest extends TestInfrastructure { @Autowired UserMapper userMapper; - @BeforeAll - public static void start() { - mysql.setPortBindings(Collections.singletonList("3306:3306")); - mysql.start(); - } - - @AfterAll - public static void stop() { - mysql.stop(); - } - @Test void testFields() { QueryBuilder builder = user -> diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/UserMapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/UserMapperTest.java index 04a233f2..077f49d5 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/UserMapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/UserMapperTest.java @@ -18,6 +18,7 @@ package com.mybatisflex.test.mapper; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.model.*; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -42,7 +43,7 @@ import static com.mybatisflex.test.model.table.UserTableDef.USER; */ @SpringBootTest @SuppressWarnings("all") -class UserMapperTest { +class UserMapperTest extends TestInfrastructure { @Autowired private UserMapper userMapper; diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/ArticleServiceTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/ArticleServiceTest.java index 7062152e..989f545a 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/ArticleServiceTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/ArticleServiceTest.java @@ -17,6 +17,7 @@ package com.mybatisflex.test.service; import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.test.TestInfrastructure; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -28,7 +29,7 @@ import static com.mybatisflex.test.model.table.ArticleTableDef.ARTICLE; * @since 2023-07-22 */ @SpringBootTest -class ArticleServiceTest { +class ArticleServiceTest extends TestInfrastructure { @Autowired ArticleService articleService; diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/FieldMappingTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/FieldMappingTest.java index 0ce0887e..539082b7 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/FieldMappingTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/service/FieldMappingTest.java @@ -2,6 +2,7 @@ package com.mybatisflex.test.service; import com.mybatisflex.test.mapper.FieldMappingInnerMapper; import com.mybatisflex.test.mapper.FieldMappingMapper; +import com.mybatisflex.test.TestInfrastructure; import com.mybatisflex.test.model.FieldMapping; import com.mybatisflex.test.model.FieldMappingInner; import org.junit.jupiter.api.Test; @@ -11,11 +12,12 @@ import org.springframework.boot.test.context.SpringBootTest; import java.util.Date; @SpringBootTest -public class FieldMappingTest { +class FieldMappingTest extends TestInfrastructure { @Autowired FieldMappingMapper fieldMappingMapper; @Autowired FieldMappingInnerMapper fieldMappingInnerMapper; + @Test void testFieldMapping() { String fieldId = FieldMapping.create().saveOpt().get().getId(); From 3ab5230d58c46a0123c2c191456dbe5a2e91aecd Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 9 Jan 2024 10:40:55 +0800 Subject: [PATCH 24/28] doc: update docs --- docs/.vitepress/theme/MyLayout.vue | 4 ++-- docs/assets/images/ad/admin-banner.jpg | Bin 0 -> 82287 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 docs/assets/images/ad/admin-banner.jpg diff --git a/docs/.vitepress/theme/MyLayout.vue b/docs/.vitepress/theme/MyLayout.vue index 1c8cc228..5979486e 100644 --- a/docs/.vitepress/theme/MyLayout.vue +++ b/docs/.vitepress/theme/MyLayout.vue @@ -78,8 +78,8 @@ const {Layout} = DefaultTheme diff --git a/docs/assets/images/ad/admin-banner.jpg b/docs/assets/images/ad/admin-banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dd2cb064efba61b8aff7d82c5ad8a6fd066257e GIT binary patch literal 82287 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⩔enEKWqS4}iv3$X05El#| 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 pojp-Ni8q};1aPy@rT~cXmhLYD Date: Tue, 9 Jan 2024 17:19:00 +0800 Subject: [PATCH 25/28] fix: fixed NPE and close #I8UTJC --- .../src/main/java/com/mybatisflex/core/table/ColumnInfo.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/ColumnInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/ColumnInfo.java index 20af6847..d184a27d 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/ColumnInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/ColumnInfo.java @@ -149,7 +149,9 @@ public class ColumnInfo { if (configuration == null) { configuration = FlexGlobalConfig.getDefaultConfig().getConfiguration(); } - buildTypeHandler = configuration.getTypeHandlerRegistry().getTypeHandler(propertyType); + if (configuration != null) { + buildTypeHandler = configuration.getTypeHandlerRegistry().getTypeHandler(propertyType); + } } return buildTypeHandler; From 3a87fe04f88c5423dfa32c7ad0a15356d451af11 Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 9 Jan 2024 18:15:27 +0800 Subject: [PATCH 26/28] doc: update docs --- docs/zh/becoming-a-sponsor.md | 8 ++++---- docs/zh/intro/getting-started.md | 30 +++++++++++++++++++++++++++++- docs/zh/intro/maven.md | 24 ++++++++++++++++++++---- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/docs/zh/becoming-a-sponsor.md b/docs/zh/becoming-a-sponsor.md index 4bc19aa1..a143e3f7 100644 --- a/docs/zh/becoming-a-sponsor.md +++ b/docs/zh/becoming-a-sponsor.md @@ -9,10 +9,10 @@ MyBatis-Flex 展示的机会。 在本站对应的位置放置您的 LOGO 及跳转链接。 -| 位置 | 素材 | 宽高 | 赞助费 | 名额 | -| ---------------- | ---------------- | ------------- | ---------- |------------ | -| 全站右侧边栏 1 | 图片+链接 | 105*50px | ¥200/月 | 8 | -| 全站右侧边栏 2 | 图片+链接 | 122*50px | ¥400/月 |1 | +| 位置 | 素材 | 宽高 | 赞助费 | 名额 | +| ---------------- | ---------------- |----------| ---------- |----| +| 全站右侧边栏 1 | 图片+链接 | 105*50px | ¥200/月 | 8 | +| 全站右侧边栏 2 | 图片+链接 | 222*50px | ¥400/月 | 1 | 您可以联系微信 `fuh99888` 就展示位的详细事宜。 diff --git a/docs/zh/intro/getting-started.md b/docs/zh/intro/getting-started.md index 50ce0a36..d6b10942 100644 --- a/docs/zh/intro/getting-started.md +++ b/docs/zh/intro/getting-started.md @@ -57,7 +57,6 @@ VALUES (1, '张三', 18, '2020-01-11'), 需要添加的 Maven 主要依赖示例: ```xml - com.mybatis-flex @@ -82,6 +81,35 @@ VALUES (1, '张三', 18, '2020-01-11'), ``` +**注意**: 如果您当前使用的是 SpringBoot v3.x 版本,需要把依赖 `mybatis-flex-spring-boot-starter` 修改为:`mybatis-flex-spring-boot3-starter`, +如下代码所示: + +```xml 4 + + + com.mybatis-flex + mybatis-flex-spring-boot3-starter + 1.7.7 + + + com.mysql + mysql-connector-j + runtime + + + com.zaxxer + HikariCP + + + + org.springframework.boot + spring-boot-starter-test + test + + +``` + + **第 3 步:对 Spring Boot 项目进行配置** 在 application.yml 中配置数据源: diff --git a/docs/zh/intro/maven.md b/docs/zh/intro/maven.md index 297a0a3a..78614843 100644 --- a/docs/zh/intro/maven.md +++ b/docs/zh/intro/maven.md @@ -38,9 +38,9 @@ `````` -3、用到了 Spring Boot 的场景 +3、用到了 SpringBoot v2.x 的场景 -```xml +```xml 3 com.mybatis-flex mybatis-flex-spring-boot-starter @@ -54,7 +54,23 @@ ``` -4、配置 annotationProcessor +4、用到了 SpringBoot v3.x 的场景 + +```xml 3 + + com.mybatis-flex + mybatis-flex-spring-boot3-starter + 1.7.7 + + + com.mybatis-flex + mybatis-flex-processor + 1.7.7 + provided + +``` + +5、配置 annotationProcessor `mybatis-flex-processor`提供APT服务,可以配置到annotationProcessorPaths,配置后,无需在依赖中声明`mybatis-flex-processor`依赖。 @@ -79,7 +95,7 @@ ``` -5、配置依赖管理 +6、配置依赖管理 MyBatis-Flex 提供了 `mybatis-flex-dependencies` 模块进行依赖管理,只需要在 `` 标签下进行配置就可以了。 From ba0280ef2863132ae145a49a21c65f9d919a1462 Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 9 Jan 2024 18:21:06 +0800 Subject: [PATCH 27/28] doc: update docs --- docs/zh/intro/parts/contributors.md | 40 +++++++++---------- .../mybatisflex/test/ContributorsDocGen.java | 12 ++++-- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/docs/zh/intro/parts/contributors.md b/docs/zh/intro/parts/contributors.md index 71239de2..6445979a 100644 --- a/docs/zh/intro/parts/contributors.md +++ b/docs/zh/intro/parts/contributors.md @@ -1,23 +1,23 @@ | | | | | | |-----|-----|-----|-----|-----| -|![](https://foruda.gitee.com/avatar/1676898191051702081/61279_fuhai_1578915942.png!avatar60)Michael Yang|![](https://foruda.gitee.com/avatar/1698661375322784129/7984572_suomm_1698661375.png!avatar60)王帅|![](https://api.dicebear.com/7.x/initials/svg?seed=丌冰)丌冰|![](https://foruda.gitee.com/avatar/1691636027051962328/11233353_kamo-sama_1691636027.png!avatar60)卡莫sama|![](https://foruda.gitee.com/avatar/1691044597656855579/7563907_lifejwang11_1691044597.png!avatar60)life| -|![](https://api.dicebear.com/7.x/initials/svg?seed=snyk-bot)snyk-bot|![](https://api.dicebear.com/7.x/initials/svg?seed=lhzsdnu)lhzsdnu|![](https://foruda.gitee.com/avatar/1683858335519306352/15535_noear_admin_1683858335.png!avatar60)西东|![](https://api.dicebear.com/7.x/initials/svg?seed=Font_C)Font_C|![](https://api.dicebear.com/7.x/initials/svg?seed=pengpeng)pengpeng| -|![](https://api.dicebear.com/7.x/initials/svg?seed=庄佳彬)庄佳彬|![](https://api.dicebear.com/7.x/initials/svg?seed=Ice-samll)Ice-samll|![](https://api.dicebear.com/7.x/initials/svg?seed=guanmengyuan)guanmengyuan|![](https://foruda.gitee.com/avatar/1697612161781835336/7870258_wchopper_1697612161.png!avatar60)王超|![](https://api.dicebear.com/7.x/initials/svg?seed=笨小孩)笨小孩| -|![](https://api.dicebear.com/7.x/initials/svg?seed=chenjh3)chenjh3|![](https://api.dicebear.com/7.x/initials/svg?seed=CloudPlayer)CloudPlayer|![](https://api.dicebear.com/7.x/initials/svg?seed=Jerry)Jerry|![](https://api.dicebear.com/7.x/initials/svg?seed=snow)snow|![](https://api.dicebear.com/7.x/initials/svg?seed=草语)草语| -|![](https://foruda.gitee.com/avatar/1694759381586775676/568596_qq925966998_1694759381.png!avatar60)李楠|![](https://api.dicebear.com/7.x/initials/svg?seed=菜鸟3853)菜鸟3853|![](https://api.dicebear.com/7.x/initials/svg?seed=Jerry_Zheng)Jerry_Zheng|![](https://api.dicebear.com/7.x/initials/svg?seed=tangxin)tangxin|![](https://api.dicebear.com/7.x/initials/svg?seed=wujl)wujl| -|![](https://foruda.gitee.com/avatar/1676895504036051867/8807_piggsoft_1578914592.jpg!avatar60)piggsoft|![](https://foruda.gitee.com/avatar/1674286432514482953/4807650_fandai_fandaidzsw_1674286432.png!avatar60)赤兮丷|![](https://api.dicebear.com/7.x/initials/svg?seed=黄沐鸿)黄沐鸿|![](https://api.dicebear.com/7.x/initials/svg?seed=loong0306)loong0306|![](https://api.dicebear.com/7.x/initials/svg?seed=沈君锋)沈君锋| -|![](https://foruda.gitee.com/avatar/1691034002435340221/1920167_qimincow_1691034002.png!avatar60)英雄路|![](https://api.dicebear.com/7.x/initials/svg?seed=natsufumij)natsufumij|![](https://api.dicebear.com/7.x/initials/svg?seed=aqnghu)aqnghu|![](https://api.dicebear.com/7.x/initials/svg?seed=BQ60ziOxlFI0R0)BQ60ziOxlFI0R0|![](https://api.dicebear.com/7.x/initials/svg?seed=tan90)tan90| -|![](https://api.dicebear.com/7.x/initials/svg?seed=张继续)张继续|![](https://api.dicebear.com/7.x/initials/svg?seed=font-C)font-C|![](https://foruda.gitee.com/avatar/1677053740056224121/5462387_i_tell_you_1618064317.png!avatar60)liibang|![](https://api.dicebear.com/7.x/initials/svg?seed=cainiao3853)cainiao3853|![](https://api.dicebear.com/7.x/initials/svg?seed=barql)barql| -|![](https://api.dicebear.com/7.x/initials/svg?seed=yangs)yangs|![](https://foruda.gitee.com/avatar/1677086127012961929/7598208_robot-l_1590219712.png!avatar60)Robot.L|![](https://foruda.gitee.com/avatar/1695378372753910643/2130728_lemonbx_1695378372.png!avatar60)落羽er|![](https://api.dicebear.com/7.x/initials/svg?seed=qixy)qixy|![](https://api.dicebear.com/7.x/initials/svg?seed=yuanbaolong)yuanbaolong| -|![](https://foruda.gitee.com/avatar/1678377314939642686/1604115_handy-git_1678377314.png!avatar60)handy|![](https://api.dicebear.com/7.x/initials/svg?seed=zhijieqing)zhijieqing|![](https://foruda.gitee.com/avatar/1674121508509280199/9288653_saoforestt_1674121508.png!avatar60)Saoforest|![](https://foruda.gitee.com/avatar/1677237805724097193/11485875_bygkn_1660893367.png!avatar60)bygkn|![](https://api.dicebear.com/7.x/initials/svg?seed=XiaoLin)XiaoLin| -|![](https://api.dicebear.com/7.x/initials/svg?seed=zhongyong)zhongyong|![](https://foruda.gitee.com/avatar/1676978624694631546/1600987_youthdream_1592959590.png!avatar60)锟斤拷|![](https://api.dicebear.com/7.x/initials/svg?seed=Watcher.Wang)Watcher.Wang|![](https://foruda.gitee.com/avatar/1677111694079591934/8088436_yang-zzu_1604969134.png!avatar60)yang_zzu|![](https://foruda.gitee.com/avatar/1676895416224286260/8331_chaosforever_1578914555.png!avatar60)锁力| -|![](https://api.dicebear.com/7.x/initials/svg?seed=shaoerkuai)shaoerkuai|![](https://foruda.gitee.com/avatar/1679885039814030308/5151444_yangbuyi_1679885039.png!avatar60)阿志同学|![](https://api.dicebear.com/7.x/initials/svg?seed=chenjian835)chenjian835|![](https://foruda.gitee.com/avatar/1676896586274105369/20327_cnscoo_1578915320.jpg!avatar60)Haru|![](https://foruda.gitee.com/avatar/1676896562075035262/20021_duxlei_1578915302.png!avatar60)duxlei| -|![](https://foruda.gitee.com/avatar/1676905453682965545/327218_gm173119755_1648555045.png!avatar60)豌豆粉|![](https://api.dicebear.com/7.x/initials/svg?seed=matthew)matthew|![](https://api.dicebear.com/7.x/initials/svg?seed=凌尘)凌尘|![](https://api.dicebear.com/7.x/initials/svg?seed=luy)luy|![](https://api.dicebear.com/7.x/initials/svg?seed=gongzhongqiang)gongzhongqiang| -|![](https://api.dicebear.com/7.x/initials/svg?seed=Alex)Alex|![](https://api.dicebear.com/7.x/initials/svg?seed=EafonYoung)EafonYoung|![](https://foruda.gitee.com/avatar/1677170868635098448/9319924_pioneer-sun_1624354686.png!avatar60)Pioneer-Sun|![](https://foruda.gitee.com/avatar/1677166292370951564/9173563_q-alex_1627784508.png!avatar60)Q_Alex|![](https://foruda.gitee.com/avatar/1677052070334379576/5421002_wlf213_1612139033.png!avatar60)wlf| -|![](https://foruda.gitee.com/avatar/1676898238064465096/61541_whitedolphin_1578915956.png!avatar60)CrazyAirhead|![](https://api.dicebear.com/7.x/initials/svg?seed=winnerself)winnerself|![](https://foruda.gitee.com/avatar/1677182504887358627/9655223_animal553_1631088642.png!avatar60)她出去赚钱了|![](https://foruda.gitee.com/avatar/1694921912224475489/8702036_dataprince_1694921912.png!avatar60)数据小王子|![](https://api.dicebear.com/7.x/initials/svg?seed=XiaoLin)XiaoLin| -|![](https://api.dicebear.com/7.x/initials/svg?seed=Freeman Liu)Freeman Liu|![](https://api.dicebear.com/7.x/initials/svg?seed=大周)大周|![](https://api.dicebear.com/7.x/initials/svg?seed=欢乐码农)欢乐码农|![](https://api.dicebear.com/7.x/initials/svg?seed=2han9wen71an)2han9wen71an|![](https://api.dicebear.com/7.x/initials/svg?seed=Shark)Shark| -|![](https://api.dicebear.com/7.x/initials/svg?seed=庄佳彬)庄佳彬|![](https://api.dicebear.com/7.x/initials/svg?seed=hans)hans|![](https://foruda.gitee.com/avatar/1677173250729036908/9369933_hunnyovo_1650792499.png!avatar60)HunnyOvO|![](https://foruda.gitee.com/avatar/1696779720632916032/13315404_guan-meng-yuan_1696779720.png!avatar60)关梦园|![](https://api.dicebear.com/7.x/initials/svg?seed=lcxw)lcxw| -|![](https://api.dicebear.com/7.x/initials/svg?seed=dgmico)dgmico|![](https://foruda.gitee.com/avatar/1677162544015233775/9094323_lymph_java_1624796992.png!avatar60)Ikko Eltociear Ashimine|![](https://api.dicebear.com/7.x/initials/svg?seed=wanggaoquan)wanggaoquan|![](https://foruda.gitee.com/avatar/1689673717825068611/9856206_aohanaohan_1689673717.png!avatar60)Aohan-Zhang|![](https://foruda.gitee.com/avatar/1691737477130376308/1673084_wang_yong_ji_1691737477.png!avatar60)老吉丶| -|![](https://foruda.gitee.com/avatar/1684129987239221781/1731138_toycat93_1684129987.png!avatar60)玩具猫|![](https://api.dicebear.com/7.x/initials/svg?seed=meng.liu3)meng.liu3|![](https://api.dicebear.com/7.x/initials/svg?seed=yaochen4)yaochen4|![](https://foruda.gitee.com/avatar/1676959401839738321/1269497_zhy_balck_1578947791.png!avatar60)zhy_black|![](https://foruda.gitee.com/avatar/1676974596171836113/1532463_1395961821_1578953848.png!avatar60)ζั͡ ั͡ ั͡ ั͡Wm| -|![](https://foruda.gitee.com/avatar/1676894749123859490/2132_hopper_1578914095.jpg!avatar60)陈国正|![](https://foruda.gitee.com/avatar/1691805683099463215/8904907_zhuhjay_1691805683.png!avatar60)ZhuHJay|![](https://foruda.gitee.com/avatar/1677071665480088881/6561865_zoufang162_1585144118.png!avatar60)zoufang162|![](https://api.dicebear.com/7.x/initials/svg?seed=乌鸦笑猪黑)乌鸦笑猪黑|![](https://api.dicebear.com/7.x/initials/svg?seed=wnp)wnp| +|![](https://foruda.gitee.com/avatar/1676898191051702081/61279_fuhai_1578915942.png!avatar30)Michael Yang|![](https://foruda.gitee.com/avatar/1698661375322784129/7984572_suomm_1698661375.png!avatar30)王帅|![](https://foruda.gitee.com/avatar/1691636027051962328/11233353_kamo-sama_1691636027.png!avatar30)卡莫sama|丌冰|![](https://foruda.gitee.com/avatar/1691044597656855579/7563907_lifejwang11_1691044597.png!avatar30)life| +|snyk-bot|lhzsdnu|![](https://foruda.gitee.com/avatar/1683858335519306352/15535_noear_admin_1683858335.png!avatar30)西东|tangxin|Font_C| +|pengpeng|庄佳彬|Ice-samll|guanmengyuan|![](https://foruda.gitee.com/avatar/1697612161781835336/7870258_wchopper_1697612161.png!avatar30)王超| +|笨小孩|bf109f|chenjh3|CloudPlayer|Jerry| +|snow|草语|farukonfly|![](https://foruda.gitee.com/avatar/1694759381586775676/568596_qq925966998_1694759381.png!avatar30)李楠|菜鸟3853| +|mofan|Jerry_Zheng|Martin7-1|wujl|![](https://foruda.gitee.com/avatar/1676895504036051867/8807_piggsoft_1578914592.jpg!avatar30)piggsoft| +|![](https://foruda.gitee.com/avatar/1674286432514482953/4807650_fandai_fandaidzsw_1674286432.png!avatar30)赤兮丷|黄沐鸿|loong0306|沈君锋|![](https://foruda.gitee.com/avatar/1691034002435340221/1920167_qimincow_1691034002.png!avatar30)英雄路| +|natsufumij|BQ60ziOxlFI0R0|tan90|张继续|aqnghu| +|font-C|![](https://foruda.gitee.com/avatar/1677053740056224121/5462387_i_tell_you_1618064317.png!avatar30)liibang|cainiao3853|yangs|lcxw| +|![](https://foruda.gitee.com/avatar/1702438316292746960/8789215_barql_1702438316.png!avatar30)barql|![](https://foruda.gitee.com/avatar/1677086127012961929/7598208_robot-l_1590219712.png!avatar30)Robot.L|![](https://foruda.gitee.com/avatar/1695378372753910643/2130728_lemonbx_1695378372.png!avatar30)落羽er|Faputa|qixy| +|yuanbaolong|![](https://foruda.gitee.com/avatar/1678377314939642686/1604115_handy-git_1678377314.png!avatar30)handy|zhijieqing|![](https://foruda.gitee.com/avatar/1674121508509280199/9288653_saoforestt_1674121508.png!avatar30)Saoforest|![](https://foruda.gitee.com/avatar/1677237805724097193/11485875_bygkn_1660893367.png!avatar30)bygkn| +|![](https://foruda.gitee.com/avatar/1676906219947351575/342237_tangzc_1629796763.png!avatar30)唐振超|Watcher.Wang|![](https://foruda.gitee.com/avatar/1676978624694631546/1600987_youthdream_1592959590.png!avatar30)锟斤拷|XiaoLin|zhongyong| +|![](https://foruda.gitee.com/avatar/1677111694079591934/8088436_yang-zzu_1604969134.png!avatar30)yang_zzu|![](https://foruda.gitee.com/avatar/1676895416224286260/8331_chaosforever_1578914555.png!avatar30)锁力|![](https://foruda.gitee.com/avatar/1679885039814030308/5151444_yangbuyi_1679885039.png!avatar30)阿志同学|shaoerkuai|meichenhui| +|chenjian835|![](https://foruda.gitee.com/avatar/1676896562075035262/20021_duxlei_1578915302.png!avatar30)duxlei|![](https://foruda.gitee.com/avatar/1676896586274105369/20327_cnscoo_1578915320.jpg!avatar30)Haru|![](https://foruda.gitee.com/avatar/1676905453682965545/327218_gm173119755_1648555045.png!avatar30)豌豆粉|涛声依旧| +|matthew|gongzhongqiang|luy|凌尘|Alex| +|EafonYoung|![](https://foruda.gitee.com/avatar/1677170868635098448/9319924_pioneer-sun_1624354686.png!avatar30)Pioneer-Sun|![](https://foruda.gitee.com/avatar/1677166292370951564/9173563_q-alex_1627784508.png!avatar30)Q_Alex|![](https://foruda.gitee.com/avatar/1677052070334379576/5421002_wlf213_1612139033.png!avatar30)wlf|Lionel| +|![](https://foruda.gitee.com/avatar/1676898238064465096/61541_whitedolphin_1578915956.png!avatar30)CrazyAirhead|winnerself|![](https://foruda.gitee.com/avatar/1677182504887358627/9655223_animal553_1631088642.png!avatar30)她出去赚钱了|![](https://foruda.gitee.com/avatar/1694921912224475489/8702036_dataprince_1694921912.png!avatar30)数据小王子|XiaoLin| +|1332987|丿风轻灬云淡|![](https://foruda.gitee.com/avatar/1703832348210958955/7966959_zhang-bo-bo_1703832348.png!avatar30)张博|Freeman Liu|大周| +|欢乐码农|2han9wen71an|shark771|庄佳彬|_FLOW__| +|hans|![](https://foruda.gitee.com/avatar/1677062003782215413/5643954_wei_hua_zhou_1653878946.png!avatar30)weihuazhou|![](https://foruda.gitee.com/avatar/1677162544015233775/9094323_lymph_java_1624796992.png!avatar30)Ikko Eltociear Ashimine|![](https://foruda.gitee.com/avatar/1677173250729036908/9369933_hunnyovo_1650792499.png!avatar30)HunnyOvO|dgmico| diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java index e76dc7cb..beb71be9 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java @@ -73,12 +73,16 @@ public class ContributorsDocGen { if (userName.contains("@")) { userName = userName.substring(0, userName.indexOf("@")); } - if (StringUtil.isBlank(src)) { - src = "https://api.dicebear.com/7.x/initials/svg?seed=" + userName; - } +// if (StringUtil.isBlank(src)) { +// src = "https://api.dicebear.com/7.x/initials/svg?seed=" + userName; +// } markdown.append("|"); - markdown.append("![](" + src + ")"); + + if (StringUtil.isNotBlank(src)) { + markdown.append("![](" + src + ")"); + } + markdown.append(userName); startIndex++; From 6e797fb33c35d2827289fa9ffe3876b7cdc2b21b Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 9 Jan 2024 18:25:29 +0800 Subject: [PATCH 28/28] doc: update docs --- docs/zh/intro/parts/contributors.md | 29 +++++++++++-------- .../mybatisflex/test/ContributorsDocGen.java | 1 + 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/docs/zh/intro/parts/contributors.md b/docs/zh/intro/parts/contributors.md index 6445979a..14264890 100644 --- a/docs/zh/intro/parts/contributors.md +++ b/docs/zh/intro/parts/contributors.md @@ -5,19 +5,24 @@ |pengpeng|庄佳彬|Ice-samll|guanmengyuan|![](https://foruda.gitee.com/avatar/1697612161781835336/7870258_wchopper_1697612161.png!avatar30)王超| |笨小孩|bf109f|chenjh3|CloudPlayer|Jerry| |snow|草语|farukonfly|![](https://foruda.gitee.com/avatar/1694759381586775676/568596_qq925966998_1694759381.png!avatar30)李楠|菜鸟3853| -|mofan|Jerry_Zheng|Martin7-1|wujl|![](https://foruda.gitee.com/avatar/1676895504036051867/8807_piggsoft_1578914592.jpg!avatar30)piggsoft| +|mofan|Jerry_Zheng|wujl|Martin7-1|![](https://foruda.gitee.com/avatar/1676895504036051867/8807_piggsoft_1578914592.jpg!avatar30)piggsoft| |![](https://foruda.gitee.com/avatar/1674286432514482953/4807650_fandai_fandaidzsw_1674286432.png!avatar30)赤兮丷|黄沐鸿|loong0306|沈君锋|![](https://foruda.gitee.com/avatar/1691034002435340221/1920167_qimincow_1691034002.png!avatar30)英雄路| -|natsufumij|BQ60ziOxlFI0R0|tan90|张继续|aqnghu| -|font-C|![](https://foruda.gitee.com/avatar/1677053740056224121/5462387_i_tell_you_1618064317.png!avatar30)liibang|cainiao3853|yangs|lcxw| -|![](https://foruda.gitee.com/avatar/1702438316292746960/8789215_barql_1702438316.png!avatar30)barql|![](https://foruda.gitee.com/avatar/1677086127012961929/7598208_robot-l_1590219712.png!avatar30)Robot.L|![](https://foruda.gitee.com/avatar/1695378372753910643/2130728_lemonbx_1695378372.png!avatar30)落羽er|Faputa|qixy| -|yuanbaolong|![](https://foruda.gitee.com/avatar/1678377314939642686/1604115_handy-git_1678377314.png!avatar30)handy|zhijieqing|![](https://foruda.gitee.com/avatar/1674121508509280199/9288653_saoforestt_1674121508.png!avatar30)Saoforest|![](https://foruda.gitee.com/avatar/1677237805724097193/11485875_bygkn_1660893367.png!avatar30)bygkn| -|![](https://foruda.gitee.com/avatar/1676906219947351575/342237_tangzc_1629796763.png!avatar30)唐振超|Watcher.Wang|![](https://foruda.gitee.com/avatar/1676978624694631546/1600987_youthdream_1592959590.png!avatar30)锟斤拷|XiaoLin|zhongyong| -|![](https://foruda.gitee.com/avatar/1677111694079591934/8088436_yang-zzu_1604969134.png!avatar30)yang_zzu|![](https://foruda.gitee.com/avatar/1676895416224286260/8331_chaosforever_1578914555.png!avatar30)锁力|![](https://foruda.gitee.com/avatar/1679885039814030308/5151444_yangbuyi_1679885039.png!avatar30)阿志同学|shaoerkuai|meichenhui| -|chenjian835|![](https://foruda.gitee.com/avatar/1676896562075035262/20021_duxlei_1578915302.png!avatar30)duxlei|![](https://foruda.gitee.com/avatar/1676896586274105369/20327_cnscoo_1578915320.jpg!avatar30)Haru|![](https://foruda.gitee.com/avatar/1676905453682965545/327218_gm173119755_1648555045.png!avatar30)豌豆粉|涛声依旧| +|natsufumij|BQ60ziOxlFI0R0|tan90|aqnghu|张继续| +|font-C|![](https://foruda.gitee.com/avatar/1677053740056224121/5462387_i_tell_you_1618064317.png!avatar30)liibang|cainiao3853|![](https://foruda.gitee.com/avatar/1702438316292746960/8789215_barql_1702438316.png!avatar30)barql|yangs| +|lcxw|![](https://foruda.gitee.com/avatar/1677086127012961929/7598208_robot-l_1590219712.png!avatar30)Robot.L|![](https://foruda.gitee.com/avatar/1695378372753910643/2130728_lemonbx_1695378372.png!avatar30)落羽er|Faputa|qixy| +|yuanbaolong|zhijieqing|![](https://foruda.gitee.com/avatar/1678377314939642686/1604115_handy-git_1678377314.png!avatar30)handy|![](https://foruda.gitee.com/avatar/1677237805724097193/11485875_bygkn_1660893367.png!avatar30)bygkn|![](https://foruda.gitee.com/avatar/1674121508509280199/9288653_saoforestt_1674121508.png!avatar30)Saoforest| +|![](https://foruda.gitee.com/avatar/1676906219947351575/342237_tangzc_1629796763.png!avatar30)唐振超|Watcher.Wang|![](https://foruda.gitee.com/avatar/1676978624694631546/1600987_youthdream_1592959590.png!avatar30)锟斤拷|zhongyong|XiaoLin| +|![](https://foruda.gitee.com/avatar/1677111694079591934/8088436_yang-zzu_1604969134.png!avatar30)yang_zzu|![](https://foruda.gitee.com/avatar/1676895416224286260/8331_chaosforever_1578914555.png!avatar30)锁力|shaoerkuai|meichenhui|![](https://foruda.gitee.com/avatar/1679885039814030308/5151444_yangbuyi_1679885039.png!avatar30)阿志同学| +|chenjian835|![](https://foruda.gitee.com/avatar/1676896586274105369/20327_cnscoo_1578915320.jpg!avatar30)Haru|![](https://foruda.gitee.com/avatar/1676896562075035262/20021_duxlei_1578915302.png!avatar30)duxlei|![](https://foruda.gitee.com/avatar/1676905453682965545/327218_gm173119755_1648555045.png!avatar30)豌豆粉|涛声依旧| |matthew|gongzhongqiang|luy|凌尘|Alex| -|EafonYoung|![](https://foruda.gitee.com/avatar/1677170868635098448/9319924_pioneer-sun_1624354686.png!avatar30)Pioneer-Sun|![](https://foruda.gitee.com/avatar/1677166292370951564/9173563_q-alex_1627784508.png!avatar30)Q_Alex|![](https://foruda.gitee.com/avatar/1677052070334379576/5421002_wlf213_1612139033.png!avatar30)wlf|Lionel| -|![](https://foruda.gitee.com/avatar/1676898238064465096/61541_whitedolphin_1578915956.png!avatar30)CrazyAirhead|winnerself|![](https://foruda.gitee.com/avatar/1677182504887358627/9655223_animal553_1631088642.png!avatar30)她出去赚钱了|![](https://foruda.gitee.com/avatar/1694921912224475489/8702036_dataprince_1694921912.png!avatar30)数据小王子|XiaoLin| -|1332987|丿风轻灬云淡|![](https://foruda.gitee.com/avatar/1703832348210958955/7966959_zhang-bo-bo_1703832348.png!avatar30)张博|Freeman Liu|大周| +|EafonYoung|![](https://foruda.gitee.com/avatar/1677170868635098448/9319924_pioneer-sun_1624354686.png!avatar30)Pioneer-Sun|![](https://foruda.gitee.com/avatar/1677166292370951564/9173563_q-alex_1627784508.png!avatar30)Q_Alex|![](https://foruda.gitee.com/avatar/1677052070334379576/5421002_wlf213_1612139033.png!avatar30)wlf|1332987| +|Lionel|winnerself|![](https://foruda.gitee.com/avatar/1676898238064465096/61541_whitedolphin_1578915956.png!avatar30)CrazyAirhead|![](https://foruda.gitee.com/avatar/1677182504887358627/9655223_animal553_1631088642.png!avatar30)她出去赚钱了|![](https://foruda.gitee.com/avatar/1694921912224475489/8702036_dataprince_1694921912.png!avatar30)数据小王子| +|XiaoLin|丿风轻灬云淡|![](https://foruda.gitee.com/avatar/1703832348210958955/7966959_zhang-bo-bo_1703832348.png!avatar30)张博|Freeman Liu|大周| |欢乐码农|2han9wen71an|shark771|庄佳彬|_FLOW__| -|hans|![](https://foruda.gitee.com/avatar/1677062003782215413/5643954_wei_hua_zhou_1653878946.png!avatar30)weihuazhou|![](https://foruda.gitee.com/avatar/1677162544015233775/9094323_lymph_java_1624796992.png!avatar30)Ikko Eltociear Ashimine|![](https://foruda.gitee.com/avatar/1677173250729036908/9369933_hunnyovo_1650792499.png!avatar30)HunnyOvO|dgmico| +|![](https://foruda.gitee.com/avatar/1677062003782215413/5643954_wei_hua_zhou_1653878946.png!avatar30)weihuazhou|hans|![](https://foruda.gitee.com/avatar/1677162544015233775/9094323_lymph_java_1624796992.png!avatar30)Ikko Eltociear Ashimine|guanmengyuan|dgmico| +|![](https://foruda.gitee.com/avatar/1677173250729036908/9369933_hunnyovo_1650792499.png!avatar30)HunnyOvO|wanggaoquan|![](https://foruda.gitee.com/avatar/1689673717825068611/9856206_aohanaohan_1689673717.png!avatar30)Aohan-Zhang|![](https://foruda.gitee.com/avatar/1691737477130376308/1673084_wang_yong_ji_1691737477.png!avatar30)老吉丶|![](https://foruda.gitee.com/avatar/1684129987239221781/1731138_toycat93_1684129987.png!avatar30)玩具猫| +|meng.liu3|yaochen4|![](https://foruda.gitee.com/avatar/1676959401839738321/1269497_zhy_balck_1578947791.png!avatar30)zhy_black|![](https://foruda.gitee.com/avatar/1676974596171836113/1532463_1395961821_1578953848.png!avatar30)ζั͡ ั͡ ั͡ ั͡Wm|![](https://foruda.gitee.com/avatar/1676894749123859490/2132_hopper_1578914095.jpg!avatar30)陈国正| +|![](https://foruda.gitee.com/avatar/1691805683099463215/8904907_zhuhjay_1691805683.png!avatar30)ZhuHJay|![](https://foruda.gitee.com/avatar/1677071665480088881/6561865_zoufang162_1585144118.png!avatar30)zoufang162|乌鸦笑猪黑|wnp|![](https://foruda.gitee.com/avatar/1676901646505077446/106613_myron_1578917779.png!avatar30)MyronLi| +|norkts|拓宇在思考|张春根|![](https://foruda.gitee.com/avatar/1699925437720003320/5656388_wittplus_1699925437.png!avatar30)witt|![](https://foruda.gitee.com/avatar/1676983827162237415/1697554_xinjump_1654653784.png!avatar30)xinjump| +|![](https://foruda.gitee.com/avatar/1693449200752633970/11209107_jl_0417_1693449200.png!avatar30)疾浪|sppan|![](https://foruda.gitee.com/avatar/1662084101462823713/2079235_djxchi_1662084101.png!avatar30)时间淡忘一切| diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java index beb71be9..010227cb 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/ContributorsDocGen.java @@ -30,6 +30,7 @@ public class ContributorsDocGen { List urls = Arrays.asList( "https://gitee.com/mybatis-flex/mybatis-flex/contributors?ref=main" , "https://gitee.com/mybatis-flex/mybatis-flex/contributors?page=2&ref=main" + , "https://gitee.com/mybatis-flex/mybatis-flex/contributors?page=3&ref=main" ); StringBuilder markdown = new StringBuilder(); markdown.append("| | | | | |\n" +