From 41fd7ed4c3f0b2829f6d5663f1eafa95ad20b63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Wed, 9 Aug 2023 10:43:09 +0800 Subject: [PATCH 01/22] fix: db2 sql escape error --- .../java/com/mybatisflex/core/dialect/DialectFactory.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 d87aa474..29405865 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 @@ -103,12 +103,13 @@ public class DialectFactory { case GBASE: case OSCAR: case XUGU: - case CLICK_HOUSE: case OCEAN_BASE: case CUBRID: case GOLDILOCKS: case CSIIDB: return new CommonsDialectImpl(KeywordWrap.BACK_QUOTE, LimitOffsetProcessor.MYSQL); + case CLICK_HOUSE: + return new CommonsDialectImpl(KeywordWrap.NONE, LimitOffsetProcessor.MYSQL); case DM: return new DmDialect(); case ORACLE: @@ -134,13 +135,13 @@ public class DialectFactory { return new OracleDialect(LimitOffsetProcessor.DERBY); case FIREBIRD: case DB2: - return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.DERBY); + return new CommonsDialectImpl(KeywordWrap.NONE, LimitOffsetProcessor.DERBY); case SQLSERVER: return new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS, LimitOffsetProcessor.SQLSERVER); case SQLSERVER_2005: return new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS, LimitOffsetProcessor.SQLSERVER_2005); case INFORMIX: - return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.INFORMIX); + return new CommonsDialectImpl(KeywordWrap.NONE, LimitOffsetProcessor.INFORMIX); case SINODB: return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.SINODB); case SYBASE: From 79d7b2c934316e685d2382cab5740878c891589f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Wed, 9 Aug 2023 10:52:15 +0800 Subject: [PATCH 02/22] test: update AccountSqlTester.java --- .../mybatisflex/coretest/AccountSqlTester.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java index 889395ea..564d30bf 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java @@ -359,6 +359,21 @@ public class AccountSqlTester { System.out.println(sql); } + + @Test + public void testJoin4Sql() { + QueryWrapper query = QueryWrapper.create() + .select(ACCOUNT.ALL_COLUMNS, + column("bui.user_code"), + column("bui.user_name"), + column("burmc.user_name as created_by_name")) + .from(ACCOUNT).as("burm") + .leftJoin("base_admin_user_info").as("bui").on("bui.user_id = burm.user_id") + .leftJoin("base_admin_user_info").as("burmc").on("burmc.user_id = burm.created_by") + .where("bui.is_valid = ?", 3); + System.out.println(query.toSQL()); + } + @Test public void testJoinSelf() { QueryWrapper queryWrapper = QueryWrapper.create() From bf23e81e20fc79864cb4ee564dc98edd92c7f5b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Wed, 9 Aug 2023 12:01:36 +0800 Subject: [PATCH 03/22] =?UTF-8?q?feat:=20QueryWrapper=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20"delete"=20=E4=B8=8E=20"update"=20=E7=9A=84=20left=20join=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/dialect/impl/CommonsDialectImpl.java | 85 +++++++++++++------ .../core/provider/EntitySqlProvider.java | 10 ++- .../java/com/mybatisflex/core/query/CPI.java | 10 ++- .../core/query/OperatorSelectCondition.java | 2 +- .../mybatisflex/core/query/QueryWrapper.java | 67 ++++++++++++++- .../core/query/SelectQueryColumn.java | 2 +- .../core/query/SelectQueryTable.java | 2 +- .../core/query/WithSelectDetail.java | 2 +- .../core/query/WithValuesDetail.java | 2 +- .../mybatisflex/core/query/WrapperUtil.java | 2 +- 10 files changed, 148 insertions(+), 36 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 5067e4ea..60c4b89e 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 @@ -242,7 +242,7 @@ public class CommonsDialectImpl implements IDialect { @Override public String forUpdateByQuery(QueryWrapper queryWrapper, Row row) { - StringBuilder sql = new StringBuilder(); + StringBuilder sqlBuilder = new StringBuilder(); Set modifyAttrs = RowCPI.getModifyAttrs(row); Map rawValueMap = RowCPI.getRawValueMap(row); @@ -254,30 +254,39 @@ public class CommonsDialectImpl implements IDialect { //fix: support schema QueryTable queryTable = queryTables.get(0); - sql.append(UPDATE).append(queryTable.toSql(this)).append(SET); + sqlBuilder.append(UPDATE).append(queryTable.toSql(this)).append(SET); int index = 0; for (String modifyAttr : modifyAttrs) { if (index > 0) { - sql.append(DELIMITER); + sqlBuilder.append(DELIMITER); } - sql.append(wrap(modifyAttr)); + sqlBuilder.append(wrap(modifyAttr)); if (rawValueMap.containsKey(modifyAttr)) { - sql.append(EQUALS).append(rawValueMap.get(modifyAttr).toSql(this)); + sqlBuilder.append(EQUALS).append(rawValueMap.get(modifyAttr).toSql(this)); } else { - sql.append(EQUALS_PLACEHOLDER); + sqlBuilder.append(EQUALS_PLACEHOLDER); } index++; } - String whereConditionSql = buildWhereConditionSql(queryWrapper); - if (StringUtil.isNotBlank(whereConditionSql)) { - sql.append(WHERE).append(whereConditionSql); + buildJoinSql(sqlBuilder, queryWrapper, queryTables); + buildWhereSql(sqlBuilder, queryWrapper, queryTables, false); + buildGroupBySql(sqlBuilder, queryWrapper, queryTables); + buildHavingSql(sqlBuilder, queryWrapper, queryTables); + + //ignore orderBy and limit + buildOrderBySql(sqlBuilder, queryWrapper, queryTables); + + Long limitRows = CPI.getLimitRows(queryWrapper); + Long limitOffset = CPI.getLimitOffset(queryWrapper); + if (limitRows != null || limitOffset != null) { + sqlBuilder = buildLimitOffsetSql(sqlBuilder, queryWrapper, limitRows, limitOffset); } - return sql.toString(); + return sqlBuilder.toString(); } @Override @@ -473,8 +482,13 @@ public class CommonsDialectImpl implements IDialect { buildHavingSql(sqlBuilder, queryWrapper, allTables); //ignore orderBy and limit - //buildOrderBySql(sqlBuilder, queryWrapper) - //buildLimitSql(sqlBuilder, queryWrapper) + buildOrderBySql(sqlBuilder, queryWrapper, allTables); + + Long limitRows = CPI.getLimitRows(queryWrapper); + Long limitOffset = CPI.getLimitOffset(queryWrapper); + if (limitRows != null || limitOffset != null) { + sqlBuilder = buildLimitOffsetSql(sqlBuilder, queryWrapper, limitRows, limitOffset); + } List endFragments = CPI.getEndFragments(queryWrapper); if (CollectionUtil.isNotEmpty(endFragments)) { @@ -777,13 +791,19 @@ public class CommonsDialectImpl implements IDialect { @Override public String forUpdateEntityByQuery(TableInfo tableInfo, Object entity, boolean ignoreNulls, QueryWrapper queryWrapper) { - StringBuilder sql = new StringBuilder(); + StringBuilder sqlBuilder = new StringBuilder(); Set updateColumns = tableInfo.obtainUpdateColumns(entity, ignoreNulls, true); Map rawValueMap = tableInfo.obtainUpdateRawValueMap(entity); - sql.append(UPDATE).append(forHint(CPI.getHint(queryWrapper))); - sql.append(tableInfo.getWrapSchemaAndTableName(this)).append(SET); + sqlBuilder.append(UPDATE).append(forHint(CPI.getHint(queryWrapper))); + sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this)); + + List queryTables = CPI.getQueryTables(queryWrapper); + buildJoinSql(sqlBuilder, queryWrapper, queryTables); + + + sqlBuilder.append(SET); StringJoiner stringJoiner = new StringJoiner(DELIMITER); @@ -807,26 +827,40 @@ public class CommonsDialectImpl implements IDialect { stringJoiner.add(wrap(versionColumn) + EQUALS + wrap(versionColumn) + " + 1 "); } - sql.append(stringJoiner); + sqlBuilder.append(stringJoiner); - String whereConditionSql = buildWhereConditionSql(queryWrapper); + buildWhereSql(sqlBuilder, queryWrapper, queryTables, false); + buildGroupBySql(sqlBuilder, queryWrapper, queryTables); + buildHavingSql(sqlBuilder, queryWrapper, queryTables); - //不允许全量更新 - if (StringUtil.isBlank(whereConditionSql)) { - throw FlexExceptions.wrap(LocalizedFormats.UPDATE_OR_DELETE_NOT_ALLOW); + //ignore orderBy and limit + buildOrderBySql(sqlBuilder, queryWrapper, queryTables); + + Long limitRows = CPI.getLimitRows(queryWrapper); + Long limitOffset = CPI.getLimitOffset(queryWrapper); + if (limitRows != null || limitOffset != null) { + sqlBuilder = buildLimitOffsetSql(sqlBuilder, queryWrapper, limitRows, limitOffset); } - sql.append(WHERE).append(whereConditionSql); + +// String whereConditionSql = buildWhereConditionSql(queryWrapper); +// +// //不允许全量更新 +// if (StringUtil.isBlank(whereConditionSql)) { +// throw FlexExceptions.wrap(LocalizedFormats.UPDATE_OR_DELETE_NOT_ALLOW); +// } +// +// sql.append(WHERE).append(whereConditionSql); List endFragments = CPI.getEndFragments(queryWrapper); if (CollectionUtil.isNotEmpty(endFragments)) { for (String endFragment : endFragments) { - sql.append(BLANK).append(endFragment); + sqlBuilder.append(BLANK).append(endFragment); } } - return sql.toString(); + return sqlBuilder.toString(); } @@ -973,16 +1007,19 @@ public class CommonsDialectImpl implements IDialect { } - protected void buildJoinSql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, List queryTables) { + protected boolean buildJoinSql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, List queryTables) { List joins = CPI.getJoins(queryWrapper); + boolean joinSuccess = false; if (joins != null && !joins.isEmpty()) { for (Join join : joins) { if (!join.checkEffective()) { continue; } sqlBuilder.append(join.toSql(queryTables, this)); + joinSuccess = true; } } + return joinSuccess; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java index c77cf81b..9aa0d4d5 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java @@ -261,7 +261,9 @@ public class EntitySqlProvider { FlexAssert.notNull(entity, "entity can not be null"); boolean ignoreNulls = ProviderUtil.isIgnoreNulls(params); + QueryWrapper queryWrapper = ProviderUtil.getQueryWrapper(params); + appendTableConditions(context,queryWrapper,false); TableInfo tableInfo = ProviderUtil.getTableInfo(context); @@ -274,9 +276,13 @@ public class EntitySqlProvider { //优先构建 sql,再构建参数 String sql = DialectFactory.getDialect().forUpdateEntityByQuery(tableInfo, entity, ignoreNulls, queryWrapper); + Object[] joinValueArray = CPI.getJoinValueArray(queryWrapper); Object[] values = tableInfo.buildUpdateSqlArgs(entity, ignoreNulls, true); - Object[] queryParams = CPI.getValueArray(queryWrapper); - ProviderUtil.setSqlArgs(params, ArrayUtil.concat(values, queryParams)); + Object[] queryParams = CPI.getConditionValueArray(queryWrapper); + + Object[] paramValues = ArrayUtil.concat(joinValueArray,ArrayUtil.concat(values,queryParams)); + + ProviderUtil.setSqlArgs(params, paramValues); return sql; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java index 7ffdc962..1894336f 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java @@ -34,7 +34,15 @@ public class CPI { } public static Object[] getValueArray(QueryWrapper queryWrapper) { - return queryWrapper.getValueArray(); + return queryWrapper.getAllValueArray(); + } + + public static Object[] getJoinValueArray(QueryWrapper queryWrapper) { + return queryWrapper.getJoinValueArray(); + } + + public static Object[] getConditionValueArray(QueryWrapper queryWrapper) { + return queryWrapper.getConditionValueArray(); } public static List getChildSelect(QueryWrapper queryWrapper) { diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java index 4389cea5..6d9594d5 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java @@ -71,7 +71,7 @@ public class OperatorSelectCondition extends QueryCondition { @Override public Object getValue() { - return queryWrapper.getValueArray(); + return queryWrapper.getAllValueArray(); } @Override diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java index 6017a491..661a16ed 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java @@ -692,7 +692,7 @@ public class QueryWrapper extends BaseQueryWrapper { * 获取 queryWrapper 的参数 * 在构建 sql 的时候,需要保证 where 在 having 的前面 */ - Object[] getValueArray() { + Object[] getAllValueArray() { List withValues = null; if (with != null) { @@ -770,7 +770,7 @@ public class QueryWrapper extends BaseQueryWrapper { if (CollectionUtil.isNotEmpty(unions)) { for (UnionWrapper union : unions) { QueryWrapper queryWrapper = union.getQueryWrapper(); - paramValues = ArrayUtil.concat(paramValues, queryWrapper.getValueArray()); + paramValues = ArrayUtil.concat(paramValues, queryWrapper.getAllValueArray()); } } @@ -783,6 +783,67 @@ public class QueryWrapper extends BaseQueryWrapper { return returnValues; } + + + /** + * 获取 queryWrapper 的参数 + * 在构建 sql 的时候,需要保证 where 在 having 的前面 + */ + Object[] getJoinValueArray() { + //join 子查询的参数:left join (select ...) + List joinValues = null; + List joins = getJoins(); + if (CollectionUtil.isNotEmpty(joins)) { + for (Join join : joins) { + QueryTable joinTable = join.getQueryTable(); + Object[] valueArray = joinTable.getValueArray(); + if (valueArray.length > 0) { + if (joinValues == null) { + joinValues = new ArrayList<>(valueArray.length); + } + joinValues.addAll(Arrays.asList(valueArray)); + } + QueryCondition onCondition = join.getOnCondition(); + Object[] values = WrapperUtil.getValues(onCondition); + if (values.length > 0) { + if (joinValues == null) { + joinValues = new ArrayList<>(values.length); + } + joinValues.addAll(Arrays.asList(values)); + } + } + } + + return joinValues == null ? FlexConsts.EMPTY_ARRAY : joinValues.toArray(); + } + + + + /** + * 获取 queryWrapper 的参数 + * 在构建 sql 的时候,需要保证 where 在 having 的前面 + */ + Object[] getConditionValueArray() { + //where 参数 + Object[] whereValues = WrapperUtil.getValues(whereQueryCondition); + + //having 参数 + Object[] havingValues = WrapperUtil.getValues(havingQueryCondition); + + Object[] paramValues = ArrayUtil.concat(whereValues, havingValues); + + //unions 参数 + if (CollectionUtil.isNotEmpty(unions)) { + for (UnionWrapper union : unions) { + QueryWrapper queryWrapper = union.getQueryWrapper(); + paramValues = ArrayUtil.concat(paramValues, queryWrapper.getAllValueArray()); + } + } + + return paramValues; + } + + List getChildSelect() { List tableChildQuery = null; @@ -815,7 +876,7 @@ public class QueryWrapper extends BaseQueryWrapper { public String toSQL() { String sql = DialectFactory.getDialect().forSelectByQuery(this); - return SqlUtil.replaceSqlParams(sql, getValueArray()); + return SqlUtil.replaceSqlParams(sql, getAllValueArray()); } @Override diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java index b251f145..8bde2f8d 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java @@ -58,7 +58,7 @@ public class SelectQueryColumn extends QueryColumn implements HasParamsColumn { @Override public Object[] getParamValues() { - return queryWrapper.getValueArray(); + return queryWrapper.getAllValueArray(); } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java index 1bd83e2a..4d91ace7 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryTable.java @@ -42,7 +42,7 @@ public class SelectQueryTable extends QueryTable { @Override Object[] getValueArray() { - return queryWrapper.getValueArray(); + return queryWrapper.getAllValueArray(); } @Override diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithSelectDetail.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithSelectDetail.java index bf0c52c6..36de431c 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithSelectDetail.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithSelectDetail.java @@ -44,7 +44,7 @@ public class WithSelectDetail implements WithDetail { @Override public Object[] getParamValues() { - return queryWrapper.getValueArray(); + return queryWrapper.getAllValueArray(); } @Override diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithValuesDetail.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithValuesDetail.java index 22ef21c4..91f7feab 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithValuesDetail.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WithValuesDetail.java @@ -57,7 +57,7 @@ public class WithValuesDetail implements WithDetail { @Override public Object[] getParamValues() { - return queryWrapper.getValueArray(); + return queryWrapper.getAllValueArray(); } @Override 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 7c0286fb..4e1eb0ad 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 @@ -115,7 +115,7 @@ class WrapperUtil { addParam(paras, Array.get(value, i)); } } else if (value instanceof QueryWrapper) { - Object[] valueArray = ((QueryWrapper) value).getValueArray(); + Object[] valueArray = ((QueryWrapper) value).getAllValueArray(); paras.addAll(Arrays.asList(valueArray)); } else if (value.getClass().isEnum()) { EnumWrapper enumWrapper = EnumWrapper.of(value.getClass()); From 9064e22031bcc0ea935108653e91f615e3bc3d56 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 12:48:24 +0800 Subject: [PATCH 04/22] =?UTF-8?q?build:=20=E7=A7=BB=E9=99=A4=20seata-sprin?= =?UTF-8?q?g-boot-starter=20=E4=BE=9D=E8=B5=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mybatis-flex-spring/pom.xml | 8 -------- .../com/mybatisflex/spring/FlexSqlSessionFactoryBean.java | 3 --- 2 files changed, 11 deletions(-) diff --git a/mybatis-flex-spring/pom.xml b/mybatis-flex-spring/pom.xml index b786dc4d..fb132737 100644 --- a/mybatis-flex-spring/pom.xml +++ b/mybatis-flex-spring/pom.xml @@ -39,14 +39,6 @@ org.springframework spring-jdbc - - - io.seata - seata-spring-boot-starter - 1.7.0 - - - diff --git a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java index b78352c3..5bf6d2f2 100644 --- a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java +++ b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java @@ -19,8 +19,6 @@ import com.mybatisflex.core.FlexConsts; import com.mybatisflex.core.datasource.FlexDataSource; import com.mybatisflex.core.mybatis.FlexConfiguration; import com.mybatisflex.core.mybatis.FlexSqlSessionFactoryBuilder; -import io.seata.rm.datasource.DataSourceProxy; -import io.seata.rm.datasource.xa.DataSourceProxyXA; import org.apache.ibatis.builder.xml.XMLConfigBuilder; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.cache.Cache; @@ -37,7 +35,6 @@ import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.TransactionFactory; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.apache.ibatis.type.TypeHandler; import org.mybatis.logging.Logger; import org.mybatis.logging.LoggerFactory; From fe064988863583a775b91481fd71ec85d9caf89c Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 12:48:57 +0800 Subject: [PATCH 05/22] =?UTF-8?q?build:=20=E6=B5=8B=E8=AF=95=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E6=B7=BB=E5=8A=A0=20seata-spring-boot-starter=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mybatis-flex-test/mybatis-flex-spring-boot-seata/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-seata/pom.xml b/mybatis-flex-test/mybatis-flex-spring-boot-seata/pom.xml index 85f2e4ad..e7fd6f34 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-seata/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-boot-seata/pom.xml @@ -66,6 +66,12 @@ mysql-connector-j + + io.seata + seata-spring-boot-starter + 1.7.0 + + From 3142ec66ecd8ea3787633a4f6afa57648b5b43c1 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 12:50:06 +0800 Subject: [PATCH 06/22] =?UTF-8?q?build:=20=E4=BB=85=E5=9C=A8=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=9C=9F=E4=BE=9D=E8=B5=96=20seata-rm-datasource=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mybatis-flex-spring-boot-starter/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mybatis-flex-spring-boot-starter/pom.xml b/mybatis-flex-spring-boot-starter/pom.xml index e9546f5f..c3c4f1dc 100644 --- a/mybatis-flex-spring-boot-starter/pom.xml +++ b/mybatis-flex-spring-boot-starter/pom.xml @@ -95,6 +95,7 @@ io.seata seata-rm-datasource 1.7.0 + compile true From 8d498c930b4e9e1e2371cf520f53b38242a154c1 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 13:03:28 +0800 Subject: [PATCH 07/22] =?UTF-8?q?refactor:=20=E7=A7=BB=E5=8A=A8=20SeataMod?= =?UTF-8?q?e=20=E7=B1=BB=E5=88=B0=20starter=20=E6=A8=A1=E5=9D=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MultiDataSourceAutoConfiguration.java | 3 +-- .../spring/boot/MybatisFlexProperties.java | 16 ++++++++++-- .../com/mybatisflex/spring/SeataMode.java | 26 ------------------- 3 files changed, 15 insertions(+), 30 deletions(-) delete mode 100644 mybatis-flex-spring/src/main/java/com/mybatisflex/spring/SeataMode.java diff --git a/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MultiDataSourceAutoConfiguration.java b/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MultiDataSourceAutoConfiguration.java index 8576ddd3..315a0e95 100644 --- a/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MultiDataSourceAutoConfiguration.java +++ b/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MultiDataSourceAutoConfiguration.java @@ -19,7 +19,6 @@ import com.mybatisflex.core.datasource.DataSourceBuilder; import com.mybatisflex.core.datasource.DataSourceDecipher; import com.mybatisflex.core.datasource.DataSourceManager; import com.mybatisflex.core.datasource.FlexDataSource; -import com.mybatisflex.spring.SeataMode; import com.mybatisflex.spring.boot.MybatisFlexProperties.SeataConfig; import com.mybatisflex.spring.datasource.DataSourceAdvice; import io.seata.rm.datasource.DataSourceProxy; @@ -87,7 +86,7 @@ public class MultiDataSourceAutoConfiguration { DataSourceManager.decryptDataSource(dataSource); if (seataConfig != null && seataConfig.isEnable()) { - if (seataConfig.getSeataMode() == SeataMode.XA) { + if (seataConfig.getSeataMode() == MybatisFlexProperties.SeataMode.XA) { dataSource = new DataSourceProxyXA(dataSource); } else { dataSource = new DataSourceProxy(dataSource); diff --git a/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java b/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java index b7cbd98c..50e60d91 100644 --- a/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java +++ b/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java @@ -17,7 +17,6 @@ package com.mybatisflex.spring.boot; import com.mybatisflex.core.FlexConsts; import com.mybatisflex.core.FlexGlobalConfig; -import com.mybatisflex.spring.SeataMode; import org.apache.ibatis.io.VFS; import org.apache.ibatis.logging.Log; import org.apache.ibatis.mapping.ResultSetType; @@ -42,6 +41,7 @@ import java.util.stream.Stream; /** * Mybatis-Flex 的配置属性。 * 参考:https://github.com/mybatis/spring-boot-starter/blob/master/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MybatisProperties.java + * * @author Eddú Meléndez * @author Kazuki Shimizu * @author micahel @@ -909,7 +909,7 @@ public class MybatisFlexProperties { * * @author life */ - public static class SeataConfig{ + public static class SeataConfig { /** * 是否开启 @@ -936,6 +936,18 @@ public class MybatisFlexProperties { public void setSeataMode(SeataMode seataMode) { this.seataMode = seataMode; } + + } + + /** + * @author life + */ + public enum SeataMode { + + XA, + + AT + } } diff --git a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/SeataMode.java b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/SeataMode.java deleted file mode 100644 index cbabe97b..00000000 --- a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/SeataMode.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.mybatisflex.spring; - -/** - * @author life - */ -public enum SeataMode { - - XA, - - AT -} From 53f6bcda6a4562c750796a1b6dbde1c9cbf08523 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 13:07:11 +0800 Subject: [PATCH 08/22] =?UTF-8?q?feat:=20=E8=87=AA=E5=8A=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20SQL=20FROM=20=E8=AF=AD=E5=8F=A5=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=20as()=20=E6=96=B9=E6=B3=95=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E8=A1=A8=E5=88=AB=E5=90=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/activerecord/query/QueryModel.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java index ceb382f6..ac4372b2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java @@ -44,11 +44,20 @@ public abstract class QueryModel> { protected QueryWrapper queryWrapper() { if (queryWrapper == null) { - queryWrapper = QueryWrapper.create(); + TableInfo tableInfo = TableInfoFactory.ofEntityClass(getClass()); + QueryTable queryTable = new QueryTable(); + queryTable.setSchema(tableInfo.getSchema()); + queryTable.setName(tableInfo.getTableName()); + queryWrapper = QueryWrapper.create().from(queryTable); } return queryWrapper; } + public T as(String alias) { + queryWrapper().as(alias); + return (T) this; + } + public T select() { return (T) this; } From 0f9dbc17422003f8b013ebaf277e2b70e0256ac6 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 13:07:39 +0800 Subject: [PATCH 09/22] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=20Model=20toSq?= =?UTF-8?q?l()=20=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/test/mapper/ActiveRecordTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 3d06030c..99eede8d 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 @@ -156,4 +156,18 @@ class ActiveRecordTest { .forEach(System.out::println); } + @Test + void testToSql() { + String sql = User.create() + .as("u") + .select(USER.ALL_COLUMNS, ROLE.ALL_COLUMNS) + .leftJoin(USER_ROLE).as("ur").on(USER_ROLE.USER_ID.eq(USER.USER_ID)) + .leftJoin(ROLE).as("r").on(USER_ROLE.ROLE_ID.eq(ROLE.ROLE_ID)) + .where(USER.USER_ID.eq(2)) + .toQueryWrapper() + .toSQL(); + + System.out.println(sql); + } + } From 9889889087a47a31ed7cb8a1fb8336a2784819c0 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 13:07:39 +0800 Subject: [PATCH 10/22] =?UTF-8?q?fixed=200f9dbc1=20from=20https://gitee.co?= =?UTF-8?q?m/Suomm/mybatis-flex/pulls/261=20test:=20=E6=B5=8B=E8=AF=95=20M?= =?UTF-8?q?odel=20toSql()=20=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/test/mapper/ActiveRecordTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 3d06030c..99eede8d 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 @@ -156,4 +156,18 @@ class ActiveRecordTest { .forEach(System.out::println); } + @Test + void testToSql() { + String sql = User.create() + .as("u") + .select(USER.ALL_COLUMNS, ROLE.ALL_COLUMNS) + .leftJoin(USER_ROLE).as("ur").on(USER_ROLE.USER_ID.eq(USER.USER_ID)) + .leftJoin(ROLE).as("r").on(USER_ROLE.ROLE_ID.eq(ROLE.ROLE_ID)) + .where(USER.USER_ID.eq(2)) + .toQueryWrapper() + .toSQL(); + + System.out.println(sql); + } + } From 35bc85aa58000dcba50f2ff4a1c29507e4f82d17 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Wed, 9 Aug 2023 13:07:11 +0800 Subject: [PATCH 11/22] =?UTF-8?q?fixed=2053f6bcd=20from=20https://gitee.co?= =?UTF-8?q?m/Suomm/mybatis-flex/pulls/261=20feat:=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20SQL=20FROM=20=E8=AF=AD=E5=8F=A5=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=20as()=20=E6=96=B9=E6=B3=95=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=A1=A8=E5=88=AB=E5=90=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/activerecord/query/QueryModel.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java index ceb382f6..ac4372b2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/QueryModel.java @@ -44,11 +44,20 @@ public abstract class QueryModel> { protected QueryWrapper queryWrapper() { if (queryWrapper == null) { - queryWrapper = QueryWrapper.create(); + TableInfo tableInfo = TableInfoFactory.ofEntityClass(getClass()); + QueryTable queryTable = new QueryTable(); + queryTable.setSchema(tableInfo.getSchema()); + queryTable.setName(tableInfo.getTableName()); + queryWrapper = QueryWrapper.create().from(queryTable); } return queryWrapper; } + public T as(String alias) { + queryWrapper().as(alias); + return (T) this; + } + public T select() { return (T) this; } From 05151f4d4f9b934b8573dc22b642c34c018828f2 Mon Sep 17 00:00:00 2001 From: 2han9wen71an <2han9wen71an@gmail.com> Date: Wed, 9 Aug 2023 13:42:24 +0800 Subject: [PATCH 12/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8DOSGI=E7=8E=AF=E5=A2=83C?= =?UTF-8?q?lassLoader=E8=8E=B7=E5=8F=96=E4=B8=8D=E5=88=B0=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当osgi环境下mybatis-flex与应用代码不在同一个bundle包中,会导致类找不到。需要获取到具体应用bundle包的classloader进行类加载 --- .../main/java/com/mybatisflex/core/util/LambdaUtil.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java index 4fcf5272..c935ccb8 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/LambdaUtil.java @@ -44,7 +44,7 @@ public class LambdaUtil { public static Class getImplClass(LambdaGetter getter) { SerializedLambda lambda = getSerializedLambda(getter); - return getImplClass(lambda); + return getImplClass(lambda, getter.getClass().getClassLoader()); } @@ -56,9 +56,10 @@ public class LambdaUtil { public static QueryColumn getQueryColumn(LambdaGetter getter) { + ClassLoader classLoader = getter.getClass().getClassLoader(); SerializedLambda lambda = getSerializedLambda(getter); String methodName = lambda.getImplMethodName(); - Class entityClass = getImplClass(lambda); + Class entityClass = getImplClass(lambda, classLoader); TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass); return tableInfo.getQueryColumnByProperty(PropertyNamer.methodToProperty(methodName)); } @@ -77,11 +78,11 @@ public class LambdaUtil { } - private static Class getImplClass(SerializedLambda lambda) { + private static Class getImplClass(SerializedLambda lambda, ClassLoader classLoader) { String implClass = getImplClassName(lambda); return MapUtil.computeIfAbsent(classMap, implClass, s -> { try { - return Class.forName(s.replace("/", ".")); + return Class.forName(s.replace("/", "."), true, classLoader); } catch (ClassNotFoundException e) { throw FlexExceptions.wrap(e); } From f44425ebef646827afc3e9e1ca92689aaa38bcf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Wed, 9 Aug 2023 15:24:10 +0800 Subject: [PATCH 13/22] doc: update docs --- docs/.vitepress/theme/MyLayout.vue | 2 +- docs/assets/images/ad/topiam_20230909.png | Bin 0 -> 38929 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/assets/images/ad/topiam_20230909.png diff --git a/docs/.vitepress/theme/MyLayout.vue b/docs/.vitepress/theme/MyLayout.vue index 14767443..7fb3b5cf 100644 --- a/docs/.vitepress/theme/MyLayout.vue +++ b/docs/.vitepress/theme/MyLayout.vue @@ -115,7 +115,7 @@ const {Layout} = DefaultTheme