From c52c3654f8ca4d0d541d6b35d5c7201db537ca77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Sat, 8 Jul 2023 09:14:12 +0800 Subject: [PATCH] =?UTF-8?q?optimize=20tenant=20condition=EF=BC=9Bclose=20#?= =?UTF-8?q?I7IVCR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/dialect/impl/CommonsDialectImpl.java | 50 ++++--------------- .../impl/DefaultLogicDeleteProcessor.java | 7 +-- .../com/mybatisflex/core/table/TableInfo.java | 48 +++++++++++++++--- .../com/mybatisflex/core/util/SqlUtil.java | 15 ++++++ .../com/mybatisflex/test/AccountTester.java | 9 ++++ 5 files changed, 79 insertions(+), 50 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java index adee67fa..19e2676c 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java @@ -28,6 +28,7 @@ import com.mybatisflex.core.table.TableInfoFactory; import com.mybatisflex.core.update.RawValue; import com.mybatisflex.core.util.ArrayUtil; import com.mybatisflex.core.util.CollectionUtil; +import com.mybatisflex.core.util.SqlUtil; import com.mybatisflex.core.util.StringUtil; import java.math.BigDecimal; @@ -113,7 +114,7 @@ public class CommonsDialectImpl implements IDialect { } for (int i = 0; i < rows.size(); i++) { - questions.append(buildQuestion(attrs.size())); + questions.append(SqlUtil.buildSqlParamPlaceholder(attrs.size())); if (i != rows.size() - 1) { questions.append(DELIMITER); } @@ -585,14 +586,11 @@ public class CommonsDialectImpl implements IDialect { public String forDeleteEntityById(TableInfo tableInfo) { String logicDeleteColumn = tableInfo.getLogicDeleteColumnOrSkip(); Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); + //正常删除 if (StringUtil.isBlank(logicDeleteColumn)) { String deleteByIdSql = forDeleteById(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryColumns()); - - if (ArrayUtil.isNotEmpty(tenantIdArgs)) { - deleteByIdSql += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length); - } - return deleteByIdSql; + return tableInfo.buildTenantCondition(deleteByIdSql, tenantIdArgs, this); } //逻辑删除 @@ -612,10 +610,7 @@ public class CommonsDialectImpl implements IDialect { sql.append(AND).append(buildLogicNormalCondition(logicDeleteColumn)); //租户ID - if (ArrayUtil.isNotEmpty(tenantIdArgs)) { - sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length)); - } - + tableInfo.buildTenantCondition(sql, tenantIdArgs, this); return sql.toString(); } @@ -632,7 +627,7 @@ public class CommonsDialectImpl implements IDialect { //多租户 if (ArrayUtil.isNotEmpty(tenantIdArgs)) { deleteSQL = deleteSQL.replace(WHERE, WHERE + BRACKET_LEFT) + BRACKET_RIGHT; - deleteSQL += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length); + deleteSQL = tableInfo.buildTenantCondition(deleteSQL, tenantIdArgs, this); } return deleteSQL; } @@ -674,9 +669,7 @@ public class CommonsDialectImpl implements IDialect { sql.append(BRACKET_RIGHT).append(AND).append(buildLogicNormalCondition(logicDeleteColumn)); - if (ArrayUtil.isNotEmpty(tenantIdArgs)) { - sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length)); - } + tableInfo.buildTenantCondition(sql, tenantIdArgs, this); return sql.toString(); } @@ -766,13 +759,7 @@ public class CommonsDialectImpl implements IDialect { //租户ID字段 Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); - if (ArrayUtil.isNotEmpty(tenantIdArgs)) { - if (tenantIdArgs.length == 1) { - sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(EQUALS_PLACEHOLDER); - } else { - sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length)); - } - } + tableInfo.buildTenantCondition(sql, tenantIdArgs, this); //乐观锁条件 if (StringUtil.isNotBlank(versionColumn)) { @@ -923,9 +910,7 @@ public class CommonsDialectImpl implements IDialect { //多租户 Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); - if (ArrayUtil.isNotEmpty(tenantIdArgs)) { - sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length)); - } + tableInfo.buildTenantCondition(sql, tenantIdArgs, this); return sql.toString(); } @@ -980,9 +965,8 @@ public class CommonsDialectImpl implements IDialect { sql.append(AND).append(buildLogicNormalCondition(logicDeleteColumn)); } - if (ArrayUtil.isNotEmpty(tenantIdArgs)) { - sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length)); - } + //多租户 + tableInfo.buildTenantCondition(sql, tenantIdArgs, this); return sql.toString(); } @@ -1071,18 +1055,6 @@ public class CommonsDialectImpl implements IDialect { } - protected String buildQuestion(int count) { - StringBuilder sb = new StringBuilder(BRACKET_LEFT); - for (int i = 0; i < count; i++) { - sb.append(PLACEHOLDER); - if (i != count - 1) { - sb.append(DELIMITER); - } - } - sb.append(BRACKET_RIGHT); - return sb.toString(); - } - protected String buildLogicNormalCondition(String logicColumn) { return LogicDeleteManager.getProcessor().buildLogicNormalCondition(logicColumn, this); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java index a4f54e55..6ac25eba 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java @@ -31,11 +31,11 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor { @Override public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo) { - queryWrapper.and(QueryCondition.create(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn() - , EQUALS - , FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete())); + queryWrapper.where(QueryCondition.create(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn() + , EQUALS, FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete())); } + @Override protected Object getLogicNormalValue() { Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete(); @@ -46,6 +46,7 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor { return SINGLE_QUOTE + normalValueOfLogicDelete + SINGLE_QUOTE; } + @Override protected Object getLogicDeletedValue() { Object deletedValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getDeletedValueOfLogicDelete(); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java index 87c8b6ce..261884f5 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java @@ -48,6 +48,8 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import static com.mybatisflex.core.constant.SqlConsts.*; + public class TableInfo { private String schema; //schema @@ -683,6 +685,42 @@ public class TableInfo { return TenantManager.getTenantIds(); } + + public String buildTenantCondition(String sql, Object[] tenantIdArgs, IDialect dialect) { + if (ArrayUtil.isNotEmpty(tenantIdArgs)) { + if (tenantIdArgs.length == 1) { + return sql + AND + dialect.wrap(tenantIdColumn) + EQUALS_PLACEHOLDER; + } else { + return sql + AND + dialect.wrap(tenantIdColumn) + IN + SqlUtil.buildSqlParamPlaceholder(tenantIdArgs.length); + } + } else { + return sql; + } + } + + public void buildTenantCondition(StringBuilder sql, Object[] tenantIdArgs, IDialect dialect) { + if (ArrayUtil.isNotEmpty(tenantIdArgs)) { + if (tenantIdArgs.length == 1) { + sql.append(AND).append(dialect.wrap(tenantIdColumn)).append(EQUALS_PLACEHOLDER); + } else { + sql.append(AND).append(dialect.wrap(tenantIdColumn)).append(IN).append(SqlUtil.buildSqlParamPlaceholder(tenantIdArgs.length)); + } + } + } + + + public void buildTenantCondition(QueryWrapper queryWrapper) { + Object[] tenantIdArgs = buildTenantIdArgs(); + if (ArrayUtil.isNotEmpty(tenantIdArgs)) { + if (tenantIdArgs.length == 1) { + queryWrapper.where(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.EQUALS, tenantIdArgs[0])); + } else { + queryWrapper.where(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.IN, tenantIdArgs)); + } + } + } + + private static final String APPEND_CONDITIONS_FLAG = "appendConditions"; public void appendConditions(Object entity, QueryWrapper queryWrapper) { @@ -731,14 +769,8 @@ public class TableInfo { } //多租户 - Object[] tenantIdArgs = buildTenantIdArgs(); - if (ArrayUtil.isNotEmpty(tenantIdArgs)) { - if (tenantIdArgs.length == 1) { - queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.EQUALS, tenantIdArgs[0])); - } else { - queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.IN, tenantIdArgs)); - } - } + buildTenantCondition(queryWrapper); + //子查询 List childSelects = CPI.getChildSelect(queryWrapper); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java index 120522f9..508a0522 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java @@ -21,6 +21,9 @@ import java.util.Date; import java.util.StringJoiner; import java.util.regex.Matcher; +import static com.mybatisflex.core.constant.SqlConsts.*; +import static com.mybatisflex.core.constant.SqlConsts.BRACKET_RIGHT; + public class SqlUtil { private SqlUtil() { @@ -127,4 +130,16 @@ public class SqlUtil { } + public static String buildSqlParamPlaceholder(int count) { + StringBuilder sb = new StringBuilder(BRACKET_LEFT); + for (int i = 0; i < count; i++) { + sb.append(PLACEHOLDER); + if (i != count - 1) { + sb.append(DELIMITER); + } + } + sb.append(BRACKET_RIGHT); + return sb.toString(); + } + } diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java index 86a04d54..7637924f 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java @@ -68,6 +68,15 @@ public class AccountTester { System.out.println(queryWrapper.toSQL()); } + @Test + public void testTenant() { + QueryWrapper queryWrapper = QueryWrapper.create(); + queryWrapper.where(Account::getId).ge(1); + List accounts = accountMapper.selectListByQuery(queryWrapper); + System.out.println(accounts); + } + + @Test public void testSelectAsToDTO() {