From 499366c4e07e2bfb8101d3dd90c9a6c72fb354da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Thu, 18 May 2023 08:58:41 +0800 Subject: [PATCH] optimize WrapperUtil.getValues --- .../core/query/QueryCondition.java | 7 ---- .../mybatisflex/core/query/WrapperUtil.java | 39 +++++++++++-------- .../mybatisflex/test/EntityTestStarter.java | 19 +++++---- .../com/mybatisflex/test/TenantTester.java | 25 +++++++----- 4 files changed, 49 insertions(+), 41 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java index e04ce134..a23313e9 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java @@ -18,7 +18,6 @@ package com.mybatisflex.core.query; import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.util.ClassUtil; -import com.mybatisflex.core.util.EnumWrapper; import java.io.Serializable; import java.lang.reflect.Array; @@ -99,12 +98,6 @@ public class QueryCondition implements Serializable { } public void setValue(Object value) { - if (value != null && value.getClass().isEnum()) { - EnumWrapper enumWrapper = new EnumWrapper(value.getClass()); - if (enumWrapper.hasEnumValueAnnotation()) { - value = enumWrapper.getEnumValue((Enum) value); - } - } this.value = value; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java index b0db6a7d..c935be95 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java @@ -18,6 +18,7 @@ package com.mybatisflex.core.query; import com.mybatisflex.core.util.ClassUtil; import com.mybatisflex.core.util.CollectionUtil; +import com.mybatisflex.core.util.EnumWrapper; import com.mybatisflex.core.util.StringUtil; import java.lang.reflect.Array; @@ -82,14 +83,14 @@ class WrapperUtil { return NULL_PARA_ARRAY; } - List paras = new ArrayList<>(); - getValues(condition, paras); + List params = new ArrayList<>(); + getValues(condition, params); - return paras.isEmpty() ? NULL_PARA_ARRAY : paras.toArray(); + return params.isEmpty() ? NULL_PARA_ARRAY : params.toArray(); } - private static void getValues(QueryCondition condition, List paras) { + private static void getValues(QueryCondition condition, List params) { if (condition == null) { return; } @@ -98,29 +99,35 @@ class WrapperUtil { if (value == null || value instanceof QueryColumn || value instanceof RawValue) { - getValues(condition.next, paras); + getValues(condition.next, params); return; } - if (value.getClass().isArray()) { - Object[] values = (Object[]) value; - for (Object object : values) { - if (object != null && ClassUtil.isArray(object.getClass())) { - for (int i = 0; i < Array.getLength(object); i++) { - paras.add(Array.get(object, i)); - } - } else { - paras.add(object); - } + addParam(params, value); + getValues(condition.next, params); + } + + private static void addParam(List paras, Object value) { + if (value == null) { + paras.add(null); + } else if (ClassUtil.isArray(value.getClass())) { + for (int i = 0; i < Array.getLength(value); i++) { + addParam(paras, Array.get(value, i)); } } else if (value instanceof QueryWrapper) { Object[] valueArray = ((QueryWrapper) value).getValueArray(); paras.addAll(Arrays.asList(valueArray)); + } else if (value.getClass().isEnum()) { + EnumWrapper enumWrapper = new EnumWrapper(value.getClass()); + if (enumWrapper.hasEnumValueAnnotation()) { + paras.add(enumWrapper.getEnumValue((Enum) value)); + } else { + paras.add(value); + } } else { paras.add(value); } - getValues(condition.next, paras); } diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java index 38b02c03..0540a481 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java @@ -25,7 +25,9 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import javax.sql.DataSource; +import java.util.List; +import static com.mybatisflex.core.query.QueryMethods.select; import static com.mybatisflex.test.table.Tables.ACCOUNT; import static com.mybatisflex.test.table.Tables.ARTICLE; @@ -145,14 +147,15 @@ public class EntityTestStarter { // .or(SYS_CONFIG.TYPE.like(word).when(StrChecker.isNotBlank(word))) // ); -// List accounts = accountMapper.selectListByQuery( -// select().where(ACCOUNT.AGE.ge(18).when(false)) -// .and(ACCOUNT.USER_NAME.like("aaaa").when(false) -// .or(ACCOUNT.USER_NAME.like("aaaa").when(false)) -// .or(ACCOUNT.USER_NAME.like("aaaa").when(false)) -// .or(ACCOUNT.USER_NAME.like("aaaa").when(false)) -// ) -// ); + List accounts = accountMapper.selectListByQuery( + select().where(ACCOUNT.AGE.ge(18).when(false)) + .and(ACCOUNT.USER_NAME.like("aaaa").when(false) + .or(ACCOUNT.USER_NAME.like("aaaa").when(false)) + .or(ACCOUNT.USER_NAME.like("aaaa").when(false)) + .or(ACCOUNT.USER_NAME.like("aaaa").when(false)) + ) + ); + System.out.println(accounts); // Page paginate = accountMapper.paginate(1, 10, QueryWrapper.create()); diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java index 470432ce..fa9e41a3 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java @@ -18,6 +18,7 @@ package com.mybatisflex.test; import com.mybatisflex.core.MybatisFlexBootstrap; import com.mybatisflex.core.audit.AuditManager; import com.mybatisflex.core.audit.ConsoleMessageCollector; +import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.tenant.TenantFactory; import com.mybatisflex.core.tenant.TenantManager; import com.mybatisflex.mapper.TenantAccountMapper; @@ -26,6 +27,10 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import javax.sql.DataSource; +import static com.mybatisflex.core.query.QueryMethods.select; +import static com.mybatisflex.test.table.Tables.ACCOUNT; +import static com.mybatisflex.test.table.Tables.TENANT_ACCOUNT; + public class TenantTester { public static void main(String[] args) { @@ -50,21 +55,21 @@ public class TenantTester { TenantManager.setTenantFactory(new TenantFactory() { @Override public Object[] getTenantIds() { - return new Object[]{1}; + return new Object[]{1,2}; } }); TenantAccountMapper mapper = MybatisFlexBootstrap.getInstance().getMapper(TenantAccountMapper.class); -// mapper.selectListByQuery(QueryWrapper.create() -// .select(TENANT_ACCOUNT.ALL_COLUMNS) -// .from(TENANT_ACCOUNT.as("c"), ACCOUNT.as("b")) -// .where(TENANT_ACCOUNT.ID.eq(ACCOUNT.ID)) -// .and(TENANT_ACCOUNT.ID.eq(1)) -// .unionAll(select(TENANT_ACCOUNT.ALL_COLUMNS).from(TENANT_ACCOUNT) -// .where(TENANT_ACCOUNT.ID.eq(2)) -// ) -// ); + mapper.selectListByQuery(QueryWrapper.create() + .select(TENANT_ACCOUNT.ALL_COLUMNS) + .from(TENANT_ACCOUNT.as("c"), ACCOUNT.as("b")) + .where(TENANT_ACCOUNT.ID.eq(ACCOUNT.ID)) + .and(TENANT_ACCOUNT.ID.eq(1)) + .unionAll(select(TENANT_ACCOUNT.ALL_COLUMNS).from(TENANT_ACCOUNT) + .where(TENANT_ACCOUNT.ID.eq(2)) + ) + ); // mapper.deleteBatchByIds(Arrays.asList(1, 2));