From 78214c11f1411547c4980a3a005d8e1635256e6f Mon Sep 17 00:00:00 2001
From: Suomm <1474983351@qq.com>
Date: Wed, 7 Jun 2023 15:03:24 +0800
Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA?=
=?UTF-8?q?=E5=8A=A8=E6=98=A0=E5=B0=84=E5=AE=9E=E4=BD=93=E7=B1=BB=E4=B8=AD?=
=?UTF-8?q?=E7=9A=84=20association=20=E5=92=8C=20collection=20=E7=B1=BB?=
=?UTF-8?q?=E5=9E=8B=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../core/mybatis/FlexConfiguration.java | 81 ++++++---
.../com/mybatisflex/core/table/TableInfo.java | 172 ++++++++++++++++--
.../core/table/TableInfoFactory.java | 16 +-
3 files changed, 225 insertions(+), 44 deletions(-)
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java
index 99ad428b..5c700fa0 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java
@@ -1,17 +1,17 @@
-/**
- * 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.
+/*
+ * 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.core.mybatis;
@@ -27,7 +27,6 @@ import com.mybatisflex.core.row.RowMapper;
import com.mybatisflex.core.table.EntityWrapperFactory;
import com.mybatisflex.core.table.TableInfo;
import com.mybatisflex.core.table.TableInfoFactory;
-import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.StringUtil;
import org.apache.ibatis.executor.CachingExecutor;
import org.apache.ibatis.executor.Executor;
@@ -36,15 +35,15 @@ import org.apache.ibatis.executor.keygen.NoKeyGenerator;
import org.apache.ibatis.executor.keygen.SelectKeyGenerator;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
-import org.apache.ibatis.mapping.BoundSql;
-import org.apache.ibatis.mapping.Environment;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.ResultMap;
+import org.apache.ibatis.mapping.*;
import org.apache.ibatis.session.*;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.util.MapUtil;
import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -178,14 +177,40 @@ public class FlexConfiguration extends Configuration {
String resultMapId = tableInfo.getEntityClass().getName();
- ResultMap resultMap;
+ /*ResultMap resultMap;
if (hasResultMap(resultMapId)) {
resultMap = getResultMap(resultMapId);
} else {
resultMap = tableInfo.buildResultMap(this);
this.addResultMap(resultMap);
+ }*/
+
+ // 变量名与属性名区分开
+ List resultMapList;
+ if (hasResultMap(resultMapId)) {
+ resultMapList = new ArrayList<>();
+ fillResultMapList(resultMapId, resultMapList);
+ } else {
+ resultMapList = tableInfo.buildResultMapList(this);
+ for (ResultMap resultMap : resultMapList) {
+ if (!hasResultMap(resultMap.getId())) {
+ addResultMap(resultMap);
+ }
+ }
}
+ /*
+ * 这里解释一下为什么要反转这个集合:
+ *
+ * MyBatis 在解析 ResultMaps 的时候,是按照顺序一个一个进行解析的,对于有嵌套
+ * 的 ResultMap 对象,也就是 nestResultMap 需要放在靠前的位置,首先解析。
+ *
+ * 而我们进行递归 buildResultMapList 也好,fillResultMapList 也好,都是
+ * 非嵌套 ResultMap 在集合最开始的位置,所以要反转一下集合,将 hasNestedResultMaps
+ * 的 ResultMap 对象放到集合的最前面。
+ */
+ Collections.reverse(resultMapList);
+
return new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), ms.getSqlSource(), ms.getSqlCommandType())
.resource(ms.getResource())
.fetchSize(ms.getFetchSize())
@@ -198,7 +223,8 @@ public class FlexConfiguration extends Configuration {
.lang(ms.getLang())
.resultOrdered(ms.isResultOrdered())
.resultSets(ms.getResultSets() == null ? null : String.join(",", ms.getResultSets()))
- .resultMaps(CollectionUtil.newArrayList(resultMap)) // 替换resultMap
+ //.resultMaps(CollectionUtil.newArrayList(resultMap)) // 替换resultMap
+ .resultMaps(resultMapList)
.resultSetType(ms.getResultSetType())
.flushCacheRequired(ms.isFlushCacheRequired())
.useCache(ms.isUseCache())
@@ -206,6 +232,19 @@ public class FlexConfiguration extends Configuration {
.build();
}
+ private void fillResultMapList(String resultMapId, List resultMapList) {
+ ResultMap resultMap = this.getResultMap(resultMapId);
+ resultMapList.add(resultMap);
+ if (resultMap.hasNestedResultMaps()) {
+ for (ResultMapping resultMapping : resultMap.getResultMappings()) {
+ String nestedResultMapId = resultMapping.getNestedResultMapId();
+ if (nestedResultMapId != null) {
+ fillResultMapList(nestedResultMapId, resultMapList);
+ }
+ }
+ }
+ }
+
/**
* 生成新的、已替换主键生成器的 MappedStatement
*
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 28c1db8f..13730c7a 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
@@ -1,17 +1,17 @@
-/**
- * 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.
+/*
+ * 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.core.table;
@@ -39,6 +39,7 @@ import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.util.MapUtil;
+import java.lang.reflect.Field;
import java.lang.reflect.Proxy;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -96,9 +97,24 @@ public class TableInfo {
private List onUpdateListeners;
private List onSetListeners;
+ /**
+ * @deprecated 该功能有更好的方式实现,此属性可能会被移除。
+ */
+ @Deprecated
private Map> joinTypes;
+ /**
+ * 对应 MapperXML 配置文件中 {@code } 标签下的 {@code } 标签。
+ */
+ private Map> associationType;
+
+ /**
+ * 对应 MapperXML 配置文件中 {@code } 标签下的 {@code } 标签。
+ */
+ private Map> collectionType;
+
+
private final ReflectorFactory reflectorFactory = new BaseReflectorFactory() {
@Override
public Reflector findForClass(Class> type) {
@@ -119,11 +135,11 @@ public class TableInfo {
return tableName;
}
- public String getWrapSchemaAndTableName(IDialect dialect){
- if (StringUtil.isNotBlank(schema)){
- return dialect.wrap(dialect.getRealSchema(schema)) +"." + dialect.wrap(dialect.getRealTable(tableName));
- }else {
- return dialect.wrap(dialect.getRealTable(tableName));
+ public String getWrapSchemaAndTableName(IDialect dialect) {
+ if (StringUtil.isNotBlank(schema)) {
+ return dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(tableName));
+ } else {
+ return dialect.wrap(dialect.getRealTable(tableName));
}
}
@@ -296,6 +312,36 @@ public class TableInfo {
joinTypes.put(fieldName, clazz);
}
+ public Map> getAssociationType() {
+ return associationType;
+ }
+
+ public void setAssociationType(Map> associationType) {
+ this.associationType = associationType;
+ }
+
+ public void addAssociationType(String fieldName, Class> clazz) {
+ if (associationType == null) {
+ associationType = new HashMap<>();
+ }
+ associationType.put(fieldName, clazz);
+ }
+
+ public Map> getCollectionType() {
+ return collectionType;
+ }
+
+ public void setCollectionType(Map> collectionType) {
+ this.collectionType = collectionType;
+ }
+
+ public void addCollectionType(Field field, Class> genericClass) {
+ if (collectionType == null) {
+ collectionType = new HashMap<>();
+ }
+ collectionType.put(field, genericClass);
+ }
+
void setColumnInfoList(List columnInfoList) {
this.columnInfoList = columnInfoList;
this.columns = new String[columnInfoList.size()];
@@ -660,6 +706,10 @@ public class TableInfo {
.collect(Collectors.toList());
}
+ /**
+ * @deprecated 该功能有更好的方式实现,此方法可能会被移除。
+ */
+ @Deprecated
public ResultMap buildResultMap(Configuration configuration) {
String resultMapId = entityClass.getName();
List resultMappings = new ArrayList<>();
@@ -727,6 +777,90 @@ public class TableInfo {
return new ResultMap.Builder(configuration, resultMapId, entityClass, resultMappings).build();
}
+ public List buildResultMapList(Configuration configuration) {
+ String resultMapId = entityClass.getName();
+ List resultMaps = new ArrayList<>();
+ List resultMappings = new ArrayList<>();
+
+ // 标签下的 标签映射
+ for (ColumnInfo columnInfo : columnInfoList) {
+ ResultMapping mapping = new ResultMapping.Builder(configuration, columnInfo.property,
+ columnInfo.column, columnInfo.propertyType)
+ .jdbcType(columnInfo.getJdbcType())
+ .typeHandler(columnInfo.buildTypeHandler())
+ .build();
+ resultMappings.add(mapping);
+
+ //add property mapper for sql: select xxx as property ...
+ if (!Objects.equals(columnInfo.getColumn(), columnInfo.getProperty())) {
+ ResultMapping propertyMapping = new ResultMapping.Builder(configuration, columnInfo.property,
+ columnInfo.property, columnInfo.propertyType)
+ .jdbcType(columnInfo.getJdbcType())
+ .typeHandler(columnInfo.buildTypeHandler())
+ .build();
+ resultMappings.add(propertyMapping);
+ }
+ }
+
+ // 标签下的 标签映射
+ for (IdInfo idInfo : primaryKeyList) {
+ ResultMapping mapping = new ResultMapping.Builder(configuration, idInfo.property,
+ idInfo.column, idInfo.propertyType)
+ .flags(CollectionUtil.newArrayList(ResultFlag.ID))
+ .jdbcType(idInfo.getJdbcType())
+ .typeHandler(idInfo.buildTypeHandler())
+ .build();
+ resultMappings.add(mapping);
+ }
+
+ // 标签下的 标签映射
+ if (associationType != null) {
+ associationType.forEach((fieldName, fieldType) -> {
+ // 获取嵌套类型的信息,也就是 javaType 属性
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(fieldType);
+ // 构建嵌套类型的 ResultMap 对象,也就是 标签下的内容
+ // 这里是递归调用,直到嵌套类型里面没有其他嵌套类型或者集合类型为止
+ List resultMapList = tableInfo.buildResultMapList(configuration);
+ // 寻找是否有嵌套 ResultMap 引用
+ Optional nestedResultMap = resultMapList.stream()
+ .filter(e -> fieldType.getName().equals(e.getId()))
+ .findFirst();
+ // 处理嵌套类型 ResultMapping 引用
+ nestedResultMap.ifPresent(resultMap -> resultMappings.add(new ResultMapping.Builder(configuration, fieldName)
+ .javaType(fieldType)
+ .nestedResultMapId(resultMap.getId())
+ .build()));
+ // 全部添加到 ResultMap 集合当中
+ resultMaps.addAll(resultMapList);
+ });
+ }
+
+ // 标签下的 标签映射
+ if (collectionType != null) {
+ collectionType.forEach((field, genericClass) -> {
+ // 获取集合泛型类型的信息,也就是 ofType 属性
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(genericClass);
+ // 构建嵌套类型的 ResultMap 对象,也就是 标签下的内容
+ // 这里是递归调用,直到集合类型里面没有其他嵌套类型或者集合类型为止
+ List resultMapList = tableInfo.buildResultMapList(configuration);
+ // 寻找是否有嵌套 ResultMap 引用
+ Optional nestedResultMap = resultMapList.stream()
+ .filter(e -> genericClass.getName().equals(e.getId()))
+ .findFirst();
+ // 处理嵌套类型 ResultMapping 引用
+ nestedResultMap.ifPresent(resultMap -> resultMappings.add(new ResultMapping.Builder(configuration, field.getName())
+ .javaType(field.getType())
+ .nestedResultMapId(resultMap.getId())
+ .build()));
+ // 全部添加到 ResultMap 集合当中
+ resultMaps.addAll(resultMapList);
+ });
+ }
+
+ resultMaps.add(new ResultMap.Builder(configuration, resultMapId, entityClass, resultMappings).build());
+
+ return resultMaps;
+ }
private static boolean existColumn(List resultMappings, String name) {
for (ResultMapping resultMapping : resultMappings) {
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
index 61e1ebc5..4c1ab6aa 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
@@ -212,11 +212,19 @@ public class TableInfoFactory {
&& !fieldType.isEnum() // 类型不是枚举
&& !defaultSupportColumnTypes.contains(fieldType) //默认的自动类型不包含该类型
) {
- if (!Map.class.isAssignableFrom(fieldType)
- && !Collection.class.isAssignableFrom(fieldType)
- && !fieldType.isArray()) {
- tableInfo.addJoinType(field.getName(), fieldType);
+ // 集合嵌套
+ if (Collection.class.isAssignableFrom(fieldType)) {
+ ParameterizedType genericType = (ParameterizedType) field.getGenericType();
+ Type actualTypeArgument = genericType.getActualTypeArguments()[0];
+ tableInfo.addCollectionType(field, (Class>) actualTypeArgument);
}
+ // 实体类嵌套
+ else if (!Map.class.isAssignableFrom(fieldType)
+ && !fieldType.isArray()) {
+ // tableInfo.addJoinType(field.getName(), fieldType);
+ tableInfo.addAssociationType(field.getName(), fieldType);
+ }
+ // 不支持的类型直接跳过
continue;
}
From 7b606a0d48292c555db767d1ebcf17c62999e26a Mon Sep 17 00:00:00 2001
From: Suomm <1474983351@qq.com>
Date: Wed, 7 Jun 2023 15:04:06 +0800
Subject: [PATCH 2/6] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E8=BF=9E?=
=?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=AF=A2=E8=87=AA=E5=8A=A8=E6=98=A0=E5=B0=84?=
=?UTF-8?q?=E5=AF=B9=E8=B1=A1=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mybatis-flex-spring-boot-test/pom.xml | 13 ++-
.../java/com/mybatisflex/test/model/Role.java | 88 ++++++++++++++
.../java/com/mybatisflex/test/model/User.java | 77 +++++++++++++
.../com/mybatisflex/test/model/UserRole.java | 67 +++++++++++
.../com/mybatisflex/test/model/UserVO.java | 97 ++++++++++++++++
.../com/mybatisflex/test/model/UserVO1.java | 85 ++++++++++++++
.../com/mybatisflex/test/model/UserVO2.java | 85 ++++++++++++++
.../com/mybatisflex/test/model/UserVO3.java | 108 ++++++++++++++++++
.../src/main/resources/application.yml | 21 ++--
.../main/resources/mapper/accountMapper.xml | 15 +++
.../test/mapper/UserMapperTest.java | 73 ++++++++++++
11 files changed, 715 insertions(+), 14 deletions(-)
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/UserMapperTest.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 fe496067..46e643cd 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml
@@ -45,13 +45,18 @@
spring-boot-starter-data-jdbc
-
- com.h2database
- h2
- 2.1.214
+ mysql
+ mysql-connector-java
+
+
+
+
+
+
+
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java
new file mode 100644
index 00000000..f3dbca0e
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java
@@ -0,0 +1,88 @@
+/*
+ * 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.test.model;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+
+import java.util.Objects;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+@Table("sys_role")
+public class Role {
+
+ @Id
+ private Integer roleId;
+ private String roleKey;
+ private String roleName;
+
+ public Integer getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(Integer roleId) {
+ this.roleId = roleId;
+ }
+
+ public String getRoleKey() {
+ return roleKey;
+ }
+
+ public void setRoleKey(String roleKey) {
+ this.roleKey = roleKey;
+ }
+
+ public String getRoleName() {
+ return roleName;
+ }
+
+ public void setRoleName(String roleName) {
+ this.roleName = roleName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Role role = (Role) o;
+
+ if (!Objects.equals(roleId, role.roleId)) return false;
+ if (!Objects.equals(roleKey, role.roleKey)) return false;
+ return Objects.equals(roleName, role.roleName);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = roleId != null ? roleId.hashCode() : 0;
+ result = 31 * result + (roleKey != null ? roleKey.hashCode() : 0);
+ result = 31 * result + (roleName != null ? roleName.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Role{" +
+ "roleId=" + roleId +
+ ", roleKey='" + roleKey + '\'' +
+ ", roleName='" + roleName + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java
new file mode 100644
index 00000000..df93f45b
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java
@@ -0,0 +1,77 @@
+/*
+ * 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.test.model;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+
+import java.util.Objects;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+
+@Table("sys_user")
+public class User {
+
+ @Id
+ private Integer userId;
+ private String userName;
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ User user = (User) o;
+
+ if (!Objects.equals(userId, user.userId)) return false;
+ return Objects.equals(userName, user.userName);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = userId != null ? userId.hashCode() : 0;
+ result = 31 * result + (userName != null ? userName.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "userId=" + userId +
+ ", userName='" + userName + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java
new file mode 100644
index 00000000..ae2f9b8c
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java
@@ -0,0 +1,67 @@
+/*
+ * 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.test.model;
+
+import com.mybatisflex.annotation.Table;
+
+import java.util.Objects;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+@Table("sys_user_role")
+public class UserRole {
+
+ private Integer userId;
+ private Integer roleId;
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public Integer getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(Integer roleId) {
+ this.roleId = roleId;
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ UserRole userRole = (UserRole) o;
+
+ if (!Objects.equals(userId, userRole.userId)) return false;
+ return Objects.equals(roleId, userRole.roleId);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = userId != null ? userId.hashCode() : 0;
+ result = 31 * result + (roleId != null ? roleId.hashCode() : 0);
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java
new file mode 100644
index 00000000..98c3ce4a
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java
@@ -0,0 +1,97 @@
+/*
+ * 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.test.model;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+
+public class UserVO {
+
+ private String userId;
+ private String userName;
+ private List roleList;
+ private Role role;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public List getRoleList() {
+ return roleList;
+ }
+
+ public void setRoleList(List roleList) {
+ this.roleList = roleList;
+ }
+
+ public Role getRole() {
+ return role;
+ }
+
+ public void setRole(Role role) {
+ this.role = role;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ UserVO userVO = (UserVO) o;
+
+ if (!Objects.equals(userId, userVO.userId)) return false;
+ if (!Objects.equals(userName, userVO.userName)) return false;
+ if (!Objects.equals(roleList, userVO.roleList)) return false;
+ return Objects.equals(role, userVO.role);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = userId != null ? userId.hashCode() : 0;
+ result = 31 * result + (userName != null ? userName.hashCode() : 0);
+ result = 31 * result + (roleList != null ? roleList.hashCode() : 0);
+ result = 31 * result + (role != null ? role.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "UserVO{" +
+ "userId='" + userId + '\'' +
+ ", userName='" + userName + '\'' +
+ ", roleList=" + roleList +
+ ", role=" + role +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java
new file mode 100644
index 00000000..5ebd5271
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java
@@ -0,0 +1,85 @@
+/*
+ * 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.test.model;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+
+public class UserVO1 {
+
+ private String userId;
+ private String userName;
+ private List roleList;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public List getRoleList() {
+ return roleList;
+ }
+
+ public void setRoleList(List roleList) {
+ this.roleList = roleList;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ UserVO1 userVO1 = (UserVO1) o;
+
+ if (!Objects.equals(userId, userVO1.userId)) return false;
+ if (!Objects.equals(userName, userVO1.userName)) return false;
+ return Objects.equals(roleList, userVO1.roleList);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = userId != null ? userId.hashCode() : 0;
+ result = 31 * result + (userName != null ? userName.hashCode() : 0);
+ result = 31 * result + (roleList != null ? roleList.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "UserVO{" +
+ "userId='" + userId + '\'' +
+ ", userName='" + userName + '\'' +
+ ", roleList=" + roleList +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java
new file mode 100644
index 00000000..46682763
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java
@@ -0,0 +1,85 @@
+/*
+ * 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.test.model;
+
+import java.util.Objects;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+
+public class UserVO2 {
+
+ private String userId;
+ private String userName;
+ private Role role;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+
+ public Role getRole() {
+ return role;
+ }
+
+ public void setRole(Role role) {
+ this.role = role;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ UserVO2 userVO = (UserVO2) o;
+
+ if (!Objects.equals(userId, userVO.userId)) return false;
+ if (!Objects.equals(userName, userVO.userName)) return false;
+ return Objects.equals(role, userVO.role);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = userId != null ? userId.hashCode() : 0;
+ result = 31 * result + (userName != null ? userName.hashCode() : 0);
+ result = 31 * result + (role != null ? role.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "UserVO{" +
+ "userId='" + userId + '\'' +
+ ", userName='" + userName + '\'' +
+ ", role=" + role +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java
new file mode 100644
index 00000000..6e36df50
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java
@@ -0,0 +1,108 @@
+/*
+ * 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.test.model;
+
+import java.util.Objects;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+
+public class UserVO3 {
+
+ private String userId;
+ private String userName;
+ private Integer roleId;
+ private String roleKey;
+ private String roleName;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public Integer getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(Integer roleId) {
+ this.roleId = roleId;
+ }
+
+ public String getRoleKey() {
+ return roleKey;
+ }
+
+ public void setRoleKey(String roleKey) {
+ this.roleKey = roleKey;
+ }
+
+ public String getRoleName() {
+ return roleName;
+ }
+
+ public void setRoleName(String roleName) {
+ this.roleName = roleName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ UserVO3 userVO3 = (UserVO3) o;
+
+ if (!Objects.equals(userId, userVO3.userId)) return false;
+ if (!Objects.equals(userName, userVO3.userName)) return false;
+ if (!Objects.equals(roleId, userVO3.roleId)) return false;
+ if (!Objects.equals(roleKey, userVO3.roleKey)) return false;
+ return Objects.equals(roleName, userVO3.roleName);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = userId != null ? userId.hashCode() : 0;
+ result = 31 * result + (userName != null ? userName.hashCode() : 0);
+ result = 31 * result + (roleId != null ? roleId.hashCode() : 0);
+ result = 31 * result + (roleKey != null ? roleKey.hashCode() : 0);
+ result = 31 * result + (roleName != null ? roleName.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "UserVO3{" +
+ "userId='" + userId + '\'' +
+ ", userName='" + userName + '\'' +
+ ", roleId=" + roleId +
+ ", roleKey='" + roleKey + '\'' +
+ ", roleName='" + roleName + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml
index 7e354699..03ce12f1 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml
@@ -1,16 +1,17 @@
# DataSource Config
spring:
- h2:
- console:
- enabled: true
+# h2:
+# console:
+# enabled: true
datasource:
- driver-class-name: org.h2.Driver
- username: sa
- password:
- sql:
- init:
- schema-locations: classpath:schema.sql
- data-locations: classpath:data.sql
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
+ username: root
+ password: 12345678
+# sql:
+# init:
+# schema-locations: classpath:schema.sql
+# data-locations: classpath:data.sql
mybatis-flex:
mapper-locations:
- classpath*:/mapper/*.xml
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/mapper/accountMapper.xml b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/mapper/accountMapper.xml
index 255f9407..9538ea33 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/mapper/accountMapper.xml
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/mapper/accountMapper.xml
@@ -2,6 +2,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
select * from `tb_account` where `user_name` = #{name}
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
new file mode 100644
index 00000000..f082d94e
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/UserMapperTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.test.mapper;
+
+import com.mybatisflex.core.query.QueryWrapper;
+import com.mybatisflex.test.model.UserVO1;
+import com.mybatisflex.test.model.UserVO3;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+
+import static com.mybatisflex.test.model.table.RoleTableDef.ROLE;
+import static com.mybatisflex.test.model.table.UserRoleTableDef.USER_ROLE;
+import static com.mybatisflex.test.model.table.UserTableDef.USER;
+
+/**
+ * @author 王帅
+ * @since 2.0
+ */
+@SpringBootTest
+class UserMapperTest {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Test
+ void testSelectOne() {
+ QueryWrapper queryWrapper = QueryWrapper.create()
+ .select(USER.USER_ID, USER.USER_NAME, ROLE.ALL_COLUMNS)
+ .from(USER.as("u"))
+ .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(3));
+ System.out.println(queryWrapper.toSQL());
+// UserVO userVO = userMapper.selectListByQueryAs(queryWrapper, UserVO.class);
+ UserVO1 userVO = userMapper.selectOneByQueryAs(queryWrapper, UserVO1.class);
+// UserVO2 userVO = userMapper.selectListByQueryAs(queryWrapper, UserVO2.class);
+// UserVO3 userVO = userMapper.selectListByQueryAs(queryWrapper, UserVO3.class);
+ System.err.println(userVO);
+ }
+
+ @Test
+ void testSelectList() {
+ QueryWrapper queryWrapper = QueryWrapper.create()
+ .select(USER.USER_ID, USER.USER_NAME, ROLE.ALL_COLUMNS)
+ .from(USER)
+ .leftJoin(USER_ROLE).on(USER_ROLE.USER_ID.eq(USER.USER_ID))
+ .leftJoin(ROLE).on(USER_ROLE.ROLE_ID.eq(ROLE.ROLE_ID));
+// System.out.println(queryWrapper.toSQL());
+// List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO.class);
+// List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO1.class);
+// List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO2.class);
+ List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO3.class);
+ userVOS.forEach(System.err::println);
+ }
+
+}
\ No newline at end of file
From 7b2c66528979bcc8176c3fbcca62affa277217af Mon Sep 17 00:00:00 2001
From: Suomm <1474983351@qq.com>
Date: Wed, 7 Jun 2023 20:13:09 +0800
Subject: [PATCH 3/6] =?UTF-8?q?doc:=20=E6=96=B0=E5=A2=9E=20=E7=BB=93?=
=?UTF-8?q?=E6=9E=9C=E6=98=A0=E5=B0=84=20=E6=96=87=E6=A1=A3=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/.vitepress/config.ts | 1 +
docs/zh/base/result-map.md | 82 ++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+)
create mode 100644 docs/zh/base/result-map.md
diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts
index 68a4d9ab..cd0c322e 100644
--- a/docs/.vitepress/config.ts
+++ b/docs/.vitepress/config.ts
@@ -63,6 +63,7 @@ export default defineConfig({
{text: '查询(多表和分页)', link: '/zh/base/query'},
{text: '批量操作', link: '/zh/base/batch'},
{text: '一对多、多对一', link: '/zh/base/field-query'},
+ {text: '结果映射', link: '/zh/base/result-map'},
{text: 'QueryWrapper', link: '/zh/base/querywrapper'},
{text: 'Db + Row', link: '/zh/base/db-row'},
{text: 'IService', link: '/zh/base/service'},
diff --git a/docs/zh/base/result-map.md b/docs/zh/base/result-map.md
new file mode 100644
index 00000000..e62c252e
--- /dev/null
+++ b/docs/zh/base/result-map.md
@@ -0,0 +1,82 @@
+# 结果映射
+
+很多情况下,我们都会遇到 `一对一`、`一对多`、`多对一`、`多对多` 的场景,通常会用到连表查询,如果是原生 MyBatis 的话,可以使用 `` 标签来构建结果映射,在 MyBatis-Flex 中提供了自动结果映射功能,这样您就可以只关注于 SQL 语句的构建。
+
+## 代码示例
+
+这里以用户和角色的 `多对多` 关系作为例子,首先有用户表和角色表,分别对应着用户类和角色类:
+
+```java
+@Table("sys_user")
+public class User {
+
+ @Id
+ private Integer userId;
+ private String userName;
+
+}
+
+@Table("sys_role")
+public class Role {
+
+ @Id
+ private Integer roleId;
+ private String roleKey;
+ private String roleName;
+
+}
+```
+
+现在需要查询所有用户,以及每个用户对应的角色信息,并通过 UserVO 对象返回:
+
+```java
+public class UserVO {
+
+ private String userId;
+ private String userName;
+ private List roleList;
+
+}
+```
+
+这个操作只需要连表查询即可完成,对于连表查询的结果映射,MyBatis-Flex 会自动帮您完成:
+
+```java
+@SpringBootTest
+class UserMapperTest {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Test
+ void testSelectList() {
+ QueryWrapper queryWrapper = QueryWrapper.create()
+ .select(USER.USER_ID, USER.USER_NAME, ROLE.ALL_COLUMNS)
+ .from(USER.as("u"))
+ .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));
+ List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO.class);
+ userVOS.forEach(System.err::println);
+ }
+
+}
+```
+
+构建的连表查询 SQL 语句为:
+
+```sql
+SELECT `u`.`user_id`,
+ `u`.`user_name`,
+ `r`.*
+FROM `sys_user` AS `u`
+LEFT JOIN `sys_user_role` AS `ur` ON `ur`.`user_id` = `u`.`user_id`
+LEFT JOIN `sys_role` AS `r` ON `ur`.`role_id` = `r`.`role_id`;
+```
+
+最终自动映射的结果为:
+
+```text
+UserVO{userId='1', userName='admin', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}]}
+UserVO{userId='2', userName='ry', roleList=[Role{roleId=2, roleKey='common', roleName='普通角色'}]}
+UserVO{userId='3', userName='test', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}, Role{roleId=2, roleKey='common', roleName='普通角色'}]}
+```
\ No newline at end of file
From 27d2127ed8276942f3254bff8db592ae7c6de8cd Mon Sep 17 00:00:00 2001
From: Suomm <1474983351@qq.com>
Date: Thu, 8 Jun 2023 08:15:36 +0800
Subject: [PATCH 4/6] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E5=A4=8D?=
=?UTF-8?q?=E6=9D=82=E5=B5=8C=E5=A5=97=E7=B1=BB=E5=9E=8B=E6=98=A0=E5=B0=84?=
=?UTF-8?q?=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/mybatisflex/test/model/Account.java | 30 +++----
.../java/com/mybatisflex/test/model/Good.java | 68 +++++++++++++++
.../com/mybatisflex/test/model/Order.java | 60 +++++++++++++
.../com/mybatisflex/test/model/OrderGood.java | 48 +++++++++++
.../com/mybatisflex/test/model/OrderInfo.java | 67 +++++++++++++++
.../java/com/mybatisflex/test/model/Role.java | 28 +-----
.../java/com/mybatisflex/test/model/User.java | 28 +++---
.../com/mybatisflex/test/model/UserInfo.java | 86 +++++++++++++++++++
.../com/mybatisflex/test/model/UserOrder.java | 48 +++++++++++
.../com/mybatisflex/test/model/UserRole.java | 27 +-----
.../com/mybatisflex/test/model/UserVO.java | 37 +-------
.../com/mybatisflex/test/model/UserVO1.java | 27 ++----
.../com/mybatisflex/test/model/UserVO2.java | 27 +-----
.../com/mybatisflex/test/model/UserVO3.java | 28 +-----
.../src/main/resources/application.yml | 2 +-
.../test/mapper/UserMapperTest.java | 37 ++++++--
16 files changed, 454 insertions(+), 194 deletions(-)
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Order.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderGood.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderInfo.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserInfo.java
create mode 100644 mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserOrder.java
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Account.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Account.java
index d5b8dcde..3d7fa200 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Account.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Account.java
@@ -1,23 +1,23 @@
-/**
- * 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.
+/*
+ * 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.test.model;
import com.mybatisflex.annotation.Id;
-import com.mybatisflex.annotation.Table;
import com.mybatisflex.annotation.KeyType;
+import com.mybatisflex.annotation.Table;
import java.util.Date;
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java
new file mode 100644
index 00000000..57e7f31d
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java
@@ -0,0 +1,68 @@
+/*
+ * 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.test.model;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+
+/**
+ * 商品。
+ *
+ * @author 王帅
+ * @since 2023-06-07
+ */
+@Table("tb_good")
+public class Good {
+
+ @Id
+ private Integer goodId;
+ private String name;
+ private double price;
+
+ public Integer getGoodId() {
+ return goodId;
+ }
+
+ public void setGoodId(Integer goodId) {
+ this.goodId = goodId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+
+ @Override
+ public String toString() {
+ return "Good{" +
+ "goodId=" + goodId +
+ ", name='" + name + '\'' +
+ ", price=" + price +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Order.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Order.java
new file mode 100644
index 00000000..5e59747b
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Order.java
@@ -0,0 +1,60 @@
+/*
+ * 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.test.model;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+
+import java.time.LocalDateTime;
+
+/**
+ * 订单。
+ *
+ * @author 王帅
+ * @since 2023-06-07
+ */
+@Table("tb_order")
+public class Order {
+
+ @Id
+ private int orderId;
+ private LocalDateTime createTime;
+
+ public int getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(int orderId) {
+ this.orderId = orderId;
+ }
+
+ public LocalDateTime getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(LocalDateTime createTime) {
+ this.createTime = createTime;
+ }
+
+ @Override
+ public String toString() {
+ return "Order{" +
+ "orderId=" + orderId +
+ ", createTime=" + createTime +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderGood.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderGood.java
new file mode 100644
index 00000000..8999a10c
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderGood.java
@@ -0,0 +1,48 @@
+/*
+ * 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.test.model;
+
+import com.mybatisflex.annotation.Table;
+
+/**
+ * 订单与商品连接表。
+ *
+ * @author 王帅
+ * @since 2023-06-07
+ */
+@Table("tb_order_good")
+public class OrderGood {
+
+ private Integer orderId;
+ private Integer goodId;
+
+ public Integer getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(Integer orderId) {
+ this.orderId = orderId;
+ }
+
+ public Integer getGoodId() {
+ return goodId;
+ }
+
+ public void setGoodId(Integer goodId) {
+ this.goodId = goodId;
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderInfo.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderInfo.java
new file mode 100644
index 00000000..510f9f33
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/OrderInfo.java
@@ -0,0 +1,67 @@
+/*
+ * 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.test.model;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 订单信息。
+ *
+ * @author 王帅
+ * @since 2023-06-07
+ */
+public class OrderInfo {
+
+ private Integer orderId;
+ private LocalDateTime createTime;
+
+ private List goodList;
+
+ public Integer getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(Integer orderId) {
+ this.orderId = orderId;
+ }
+
+ public LocalDateTime getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(LocalDateTime createTime) {
+ this.createTime = createTime;
+ }
+
+ public List getGoodList() {
+ return goodList;
+ }
+
+ public void setGoodList(List goodList) {
+ this.goodList = goodList;
+ }
+
+ @Override
+ public String toString() {
+ return "OrderInfo{" +
+ "orderId=" + orderId +
+ ", createTime=" + createTime +
+ ", goodList=" + goodList +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java
index f3dbca0e..88d3a109 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.java
@@ -19,13 +19,13 @@ package com.mybatisflex.test.model;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
-import java.util.Objects;
-
/**
+ * 角色。
+ *
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
-@Table("sys_role")
+@Table("tb_role")
public class Role {
@Id
@@ -57,26 +57,6 @@ public class Role {
this.roleName = roleName;
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- Role role = (Role) o;
-
- if (!Objects.equals(roleId, role.roleId)) return false;
- if (!Objects.equals(roleKey, role.roleKey)) return false;
- return Objects.equals(roleName, role.roleName);
- }
-
- @Override
- public int hashCode() {
- int result = roleId != null ? roleId.hashCode() : 0;
- result = 31 * result + (roleKey != null ? roleKey.hashCode() : 0);
- result = 31 * result + (roleName != null ? roleName.hashCode() : 0);
- return result;
- }
-
@Override
public String toString() {
return "Role{" +
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java
index df93f45b..1ff8f244 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java
@@ -19,19 +19,20 @@ package com.mybatisflex.test.model;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
-import java.util.Objects;
-
/**
+ * 用户。
+ *
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
-@Table("sys_user")
+@Table("tb_user")
public class User {
@Id
private Integer userId;
private String userName;
+ private String password;
public Integer getUserId() {
return userId;
@@ -49,22 +50,12 @@ public class User {
this.userName = userName;
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- User user = (User) o;
-
- if (!Objects.equals(userId, user.userId)) return false;
- return Objects.equals(userName, user.userName);
+ public String getPassword() {
+ return password;
}
- @Override
- public int hashCode() {
- int result = userId != null ? userId.hashCode() : 0;
- result = 31 * result + (userName != null ? userName.hashCode() : 0);
- return result;
+ public void setPassword(String password) {
+ this.password = password;
}
@Override
@@ -72,6 +63,7 @@ public class User {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
+ ", password='" + password + '\'' +
'}';
}
}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserInfo.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserInfo.java
new file mode 100644
index 00000000..b1e48d1d
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserInfo.java
@@ -0,0 +1,86 @@
+/*
+ * 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.test.model;
+
+import java.util.List;
+
+/**
+ * 用户信息。
+ *
+ * @author 王帅
+ * @since 2023-06-07
+ */
+public class UserInfo {
+
+ private Integer userId;
+ private String userName;
+ private String password;
+
+ private List roleList;
+ private List orderInfoList;
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public List getRoleList() {
+ return roleList;
+ }
+
+ public void setRoleList(List roleList) {
+ this.roleList = roleList;
+ }
+
+ public List getOrderInfoList() {
+ return orderInfoList;
+ }
+
+ public void setOrderInfoList(List orderInfoList) {
+ this.orderInfoList = orderInfoList;
+ }
+
+ @Override
+ public String toString() {
+ return "UserInfo{" +
+ "userId=" + userId +
+ ", userName='" + userName + '\'' +
+ ", password='" + password + '\'' +
+ ", roleList=" + roleList +
+ ", orderInfoList=" + orderInfoList +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserOrder.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserOrder.java
new file mode 100644
index 00000000..71defc00
--- /dev/null
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserOrder.java
@@ -0,0 +1,48 @@
+/*
+ * 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.test.model;
+
+import com.mybatisflex.annotation.Table;
+
+/**
+ * 用户订单映射。
+ *
+ * @author 王帅
+ * @since 2023-06-07
+ */
+@Table("tb_user_order")
+public class UserOrder {
+
+ private Integer userId;
+ private Integer orderId;
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public Integer getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(Integer orderId) {
+ this.orderId = orderId;
+ }
+}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java
index ae2f9b8c..4ae2bb28 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.java
@@ -18,13 +18,13 @@ package com.mybatisflex.test.model;
import com.mybatisflex.annotation.Table;
-import java.util.Objects;
-
/**
+ * 用户与角色连接表。
+ *
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
-@Table("sys_user_role")
+@Table("tb_user_role")
public class UserRole {
private Integer userId;
@@ -45,23 +45,4 @@ public class UserRole {
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
-
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- UserRole userRole = (UserRole) o;
-
- if (!Objects.equals(userId, userRole.userId)) return false;
- return Objects.equals(roleId, userRole.roleId);
- }
-
- @Override
- public int hashCode() {
- int result = userId != null ? userId.hashCode() : 0;
- result = 31 * result + (roleId != null ? roleId.hashCode() : 0);
- return result;
- }
}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java
index 98c3ce4a..e3f8cf59 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java
@@ -17,11 +17,12 @@
package com.mybatisflex.test.model;
import java.util.List;
-import java.util.Objects;
/**
+ * 用户 VO 对象。
+ *
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
public class UserVO {
@@ -29,7 +30,6 @@ public class UserVO {
private String userId;
private String userName;
private List roleList;
- private Role role;
public String getUserId() {
return userId;
@@ -55,43 +55,12 @@ public class UserVO {
this.roleList = roleList;
}
- public Role getRole() {
- return role;
- }
-
- public void setRole(Role role) {
- this.role = role;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- UserVO userVO = (UserVO) o;
-
- if (!Objects.equals(userId, userVO.userId)) return false;
- if (!Objects.equals(userName, userVO.userName)) return false;
- if (!Objects.equals(roleList, userVO.roleList)) return false;
- return Objects.equals(role, userVO.role);
- }
-
- @Override
- public int hashCode() {
- int result = userId != null ? userId.hashCode() : 0;
- result = 31 * result + (userName != null ? userName.hashCode() : 0);
- result = 31 * result + (roleList != null ? roleList.hashCode() : 0);
- result = 31 * result + (role != null ? role.hashCode() : 0);
- return result;
- }
-
@Override
public String toString() {
return "UserVO{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", roleList=" + roleList +
- ", role=" + role +
'}';
}
}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java
index 5ebd5271..26a60d2b 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java
@@ -17,11 +17,10 @@
package com.mybatisflex.test.model;
import java.util.List;
-import java.util.Objects;
/**
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
public class UserVO1 {
@@ -29,6 +28,7 @@ public class UserVO1 {
private String userId;
private String userName;
private List roleList;
+ private Role role;
public String getUserId() {
return userId;
@@ -54,32 +54,21 @@ public class UserVO1 {
this.roleList = roleList;
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- UserVO1 userVO1 = (UserVO1) o;
-
- if (!Objects.equals(userId, userVO1.userId)) return false;
- if (!Objects.equals(userName, userVO1.userName)) return false;
- return Objects.equals(roleList, userVO1.roleList);
+ public Role getRole() {
+ return role;
}
- @Override
- public int hashCode() {
- int result = userId != null ? userId.hashCode() : 0;
- result = 31 * result + (userName != null ? userName.hashCode() : 0);
- result = 31 * result + (roleList != null ? roleList.hashCode() : 0);
- return result;
+ public void setRole(Role role) {
+ this.role = role;
}
@Override
public String toString() {
- return "UserVO{" +
+ return "UserVO1{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", roleList=" + roleList +
+ ", role=" + role +
'}';
}
}
\ No newline at end of file
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java
index 46682763..10da2c24 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java
@@ -16,11 +16,9 @@
package com.mybatisflex.test.model;
-import java.util.Objects;
-
/**
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
public class UserVO2 {
@@ -45,7 +43,6 @@ public class UserVO2 {
this.userName = userName;
}
-
public Role getRole() {
return role;
}
@@ -54,29 +51,9 @@ public class UserVO2 {
this.role = role;
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- UserVO2 userVO = (UserVO2) o;
-
- if (!Objects.equals(userId, userVO.userId)) return false;
- if (!Objects.equals(userName, userVO.userName)) return false;
- return Objects.equals(role, userVO.role);
- }
-
- @Override
- public int hashCode() {
- int result = userId != null ? userId.hashCode() : 0;
- result = 31 * result + (userName != null ? userName.hashCode() : 0);
- result = 31 * result + (role != null ? role.hashCode() : 0);
- return result;
- }
-
@Override
public String toString() {
- return "UserVO{" +
+ return "UserVO2{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", role=" + role +
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java
index 6e36df50..16d97b3c 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java
@@ -16,11 +16,9 @@
package com.mybatisflex.test.model;
-import java.util.Objects;
-
/**
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
public class UserVO3 {
@@ -71,30 +69,6 @@ public class UserVO3 {
this.roleName = roleName;
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- UserVO3 userVO3 = (UserVO3) o;
-
- if (!Objects.equals(userId, userVO3.userId)) return false;
- if (!Objects.equals(userName, userVO3.userName)) return false;
- if (!Objects.equals(roleId, userVO3.roleId)) return false;
- if (!Objects.equals(roleKey, userVO3.roleKey)) return false;
- return Objects.equals(roleName, userVO3.roleName);
- }
-
- @Override
- public int hashCode() {
- int result = userId != null ? userId.hashCode() : 0;
- result = 31 * result + (userName != null ? userName.hashCode() : 0);
- result = 31 * result + (roleId != null ? roleId.hashCode() : 0);
- result = 31 * result + (roleKey != null ? roleKey.hashCode() : 0);
- result = 31 * result + (roleName != null ? roleName.hashCode() : 0);
- return result;
- }
-
@Override
public String toString() {
return "UserVO3{" +
diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml
index 03ce12f1..abbcedf7 100644
--- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml
+++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml
@@ -5,7 +5,7 @@ spring:
# enabled: true
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
+ url: jdbc:mysql://localhost:3306/mp_test
username: root
password: 12345678
# sql:
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 f082d94e..55fd2e34 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
@@ -17,21 +17,25 @@
package com.mybatisflex.test.mapper;
import com.mybatisflex.core.query.QueryWrapper;
+import com.mybatisflex.test.model.UserInfo;
import com.mybatisflex.test.model.UserVO1;
-import com.mybatisflex.test.model.UserVO3;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
+import static com.mybatisflex.test.model.table.GoodTableDef.GOOD;
+import static com.mybatisflex.test.model.table.OrderGoodTableDef.ORDER_GOOD;
+import static com.mybatisflex.test.model.table.OrderTableDef.ORDER;
import static com.mybatisflex.test.model.table.RoleTableDef.ROLE;
+import static com.mybatisflex.test.model.table.UserOrderTableDef.USER_ORDER;
import static com.mybatisflex.test.model.table.UserRoleTableDef.USER_ROLE;
import static com.mybatisflex.test.model.table.UserTableDef.USER;
/**
* @author 王帅
- * @since 2.0
+ * @since 2023-06-07
*/
@SpringBootTest
class UserMapperTest {
@@ -59,15 +63,32 @@ class UserMapperTest {
void testSelectList() {
QueryWrapper queryWrapper = QueryWrapper.create()
.select(USER.USER_ID, USER.USER_NAME, ROLE.ALL_COLUMNS)
- .from(USER)
- .leftJoin(USER_ROLE).on(USER_ROLE.USER_ID.eq(USER.USER_ID))
- .leftJoin(ROLE).on(USER_ROLE.ROLE_ID.eq(ROLE.ROLE_ID));
-// System.out.println(queryWrapper.toSQL());
+ .from(USER.as("u"))
+ .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.ge(2));
+ System.out.println(queryWrapper.toSQL());
// List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO.class);
-// List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO1.class);
+ List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO1.class);
// List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO2.class);
- List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO3.class);
+// List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO3.class);
userVOS.forEach(System.err::println);
}
+ @Test
+ void testComplexSelectList() {
+ QueryWrapper queryWrapper = QueryWrapper.create()
+ .select(USER.ALL_COLUMNS, ROLE.ALL_COLUMNS, ORDER.ALL_COLUMNS, GOOD.ALL_COLUMNS)
+ .from(USER.as("u"))
+ .leftJoin(USER_ROLE).as("ur").on(USER.USER_ID.eq(USER_ROLE.USER_ID))
+ .leftJoin(ROLE).as("r").on(ROLE.ROLE_ID.eq(USER_ROLE.ROLE_ID))
+ .leftJoin(USER_ORDER).as("uo").on(USER.USER_ID.eq(USER_ORDER.USER_ID))
+ .leftJoin(ORDER).as("o").on(ORDER.ORDER_ID.eq(USER_ORDER.ORDER_ID))
+ .leftJoin(ORDER_GOOD).as("og").on(ORDER.ORDER_ID.eq(ORDER_GOOD.ORDER_ID))
+ .leftJoin(GOOD).as("g").on(GOOD.GOOD_ID.eq(ORDER_GOOD.GOOD_ID));
+ System.err.println(queryWrapper.toSQL());
+ List userInfos = userMapper.selectListByQueryAs(queryWrapper, UserInfo.class);
+ userInfos.forEach(System.err::println);
+ }
+
}
\ No newline at end of file
From 9b98ecc84a5148957e4c9005e96aa8094ed25673 Mon Sep 17 00:00:00 2001
From: Suomm <1474983351@qq.com>
Date: Thu, 8 Jun 2023 09:24:54 +0800
Subject: [PATCH 5/6] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=20=E4=B8=80?=
=?UTF-8?q?=E5=AF=B9=E4=B8=80=E3=80=81=E4=B8=80=E5=AF=B9=E5=A4=9A=20?=
=?UTF-8?q?=E6=96=87=E6=A1=A3=E8=AF=B4=E6=98=8E=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/.vitepress/config.ts | 1 -
docs/zh/base/field-query.md | 87 ++++++++++++++++++++++++++++++++++++-
docs/zh/base/result-map.md | 82 ----------------------------------
3 files changed, 85 insertions(+), 85 deletions(-)
delete mode 100644 docs/zh/base/result-map.md
diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts
index cd0c322e..68a4d9ab 100644
--- a/docs/.vitepress/config.ts
+++ b/docs/.vitepress/config.ts
@@ -63,7 +63,6 @@ export default defineConfig({
{text: '查询(多表和分页)', link: '/zh/base/query'},
{text: '批量操作', link: '/zh/base/batch'},
{text: '一对多、多对一', link: '/zh/base/field-query'},
- {text: '结果映射', link: '/zh/base/result-map'},
{text: 'QueryWrapper', link: '/zh/base/querywrapper'},
{text: 'Db + Row', link: '/zh/base/db-row'},
{text: 'IService', link: '/zh/base/service'},
diff --git a/docs/zh/base/field-query.md b/docs/zh/base/field-query.md
index bb1ac72a..1c75ed67 100644
--- a/docs/zh/base/field-query.md
+++ b/docs/zh/base/field-query.md
@@ -2,7 +2,7 @@
在很多场景下,我们可能会用到 `一对多`、`一对一`、`多对一`、`多对多`等场景的关联查询,MyBatis-Flex 内置了相关的方法,用于支持此类场景。
-## 代码示例(多对多)
+## 代码示例(Field Query)
以下是文章的示例,一篇文章可能归属于多个分类,一个类可以有多篇文章,需要用到中间表 `article_category_mapping`。
@@ -104,4 +104,87 @@ List articles = mapper.selectListByQuery(query
## 更多场景
通过以上内容看出,`Article` 的任何属性,都是可以通过传入 `FieldQueryBuilder` 来构建 `QueryWrapper` 进行再次查询,
-这些不仅仅只适用于 `一对多`、`一对一`、`多对一`、`多对多`等场景。任何 `Article` 对象里的属性,需要二次查询赋值的,都是可以通过这种方式进行。
\ No newline at end of file
+这些不仅仅只适用于 `一对多`、`一对一`、`多对一`、`多对多`等场景。任何 `Article` 对象里的属性,需要二次查询赋值的,都是可以通过这种方式进行。
+
+## 结果映射
+
+您也可以继续使用连表查询,如果是原生 MyBatis 的话,可以使用 `` 标签来构建结果映射,在 MyBatis-Flex 中提供了自动结果映射功能,这样您就可以只关注于 SQL 语句的构建。
+
+## 代码示例(Join Query)
+
+这里以用户和角色的 `多对多` 关系作为例子,首先有用户表和角色表,分别对应着用户类和角色类:
+
+```java
+@Table("sys_user")
+public class User {
+
+ @Id
+ private Integer userId;
+ private String userName;
+
+}
+
+@Table("sys_role")
+public class Role {
+
+ @Id
+ private Integer roleId;
+ private String roleKey;
+ private String roleName;
+
+}
+```
+
+现在需要查询所有用户,以及每个用户对应的角色信息,并通过 UserVO 对象返回:
+
+```java
+public class UserVO {
+
+ private String userId;
+ private String userName;
+ private List roleList;
+
+}
+```
+
+这个操作只需要连表查询即可完成,对于连表查询的结果映射,MyBatis-Flex 会自动帮您完成:
+
+```java
+@SpringBootTest
+class UserMapperTest {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Test
+ void testSelectList() {
+ QueryWrapper queryWrapper = QueryWrapper.create()
+ .select(USER.USER_ID, USER.USER_NAME, ROLE.ALL_COLUMNS)
+ .from(USER.as("u"))
+ .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));
+ List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO.class);
+ userVOS.forEach(System.err::println);
+ }
+
+}
+```
+
+构建的连表查询 SQL 语句为:
+
+```sql
+SELECT `u`.`user_id`,
+ `u`.`user_name`,
+ `r`.*
+FROM `sys_user` AS `u`
+LEFT JOIN `sys_user_role` AS `ur` ON `ur`.`user_id` = `u`.`user_id`
+LEFT JOIN `sys_role` AS `r` ON `ur`.`role_id` = `r`.`role_id`;
+```
+
+最终自动映射的结果为:
+
+```text
+UserVO{userId='1', userName='admin', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}]}
+UserVO{userId='2', userName='ry', roleList=[Role{roleId=2, roleKey='common', roleName='普通角色'}]}
+UserVO{userId='3', userName='test', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}, Role{roleId=2, roleKey='common', roleName='普通角色'}]}
+```
\ No newline at end of file
diff --git a/docs/zh/base/result-map.md b/docs/zh/base/result-map.md
deleted file mode 100644
index e62c252e..00000000
--- a/docs/zh/base/result-map.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# 结果映射
-
-很多情况下,我们都会遇到 `一对一`、`一对多`、`多对一`、`多对多` 的场景,通常会用到连表查询,如果是原生 MyBatis 的话,可以使用 `` 标签来构建结果映射,在 MyBatis-Flex 中提供了自动结果映射功能,这样您就可以只关注于 SQL 语句的构建。
-
-## 代码示例
-
-这里以用户和角色的 `多对多` 关系作为例子,首先有用户表和角色表,分别对应着用户类和角色类:
-
-```java
-@Table("sys_user")
-public class User {
-
- @Id
- private Integer userId;
- private String userName;
-
-}
-
-@Table("sys_role")
-public class Role {
-
- @Id
- private Integer roleId;
- private String roleKey;
- private String roleName;
-
-}
-```
-
-现在需要查询所有用户,以及每个用户对应的角色信息,并通过 UserVO 对象返回:
-
-```java
-public class UserVO {
-
- private String userId;
- private String userName;
- private List roleList;
-
-}
-```
-
-这个操作只需要连表查询即可完成,对于连表查询的结果映射,MyBatis-Flex 会自动帮您完成:
-
-```java
-@SpringBootTest
-class UserMapperTest {
-
- @Autowired
- private UserMapper userMapper;
-
- @Test
- void testSelectList() {
- QueryWrapper queryWrapper = QueryWrapper.create()
- .select(USER.USER_ID, USER.USER_NAME, ROLE.ALL_COLUMNS)
- .from(USER.as("u"))
- .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));
- List userVOS = userMapper.selectListByQueryAs(queryWrapper, UserVO.class);
- userVOS.forEach(System.err::println);
- }
-
-}
-```
-
-构建的连表查询 SQL 语句为:
-
-```sql
-SELECT `u`.`user_id`,
- `u`.`user_name`,
- `r`.*
-FROM `sys_user` AS `u`
-LEFT JOIN `sys_user_role` AS `ur` ON `ur`.`user_id` = `u`.`user_id`
-LEFT JOIN `sys_role` AS `r` ON `ur`.`role_id` = `r`.`role_id`;
-```
-
-最终自动映射的结果为:
-
-```text
-UserVO{userId='1', userName='admin', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}]}
-UserVO{userId='2', userName='ry', roleList=[Role{roleId=2, roleKey='common', roleName='普通角色'}]}
-UserVO{userId='3', userName='test', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}, Role{roleId=2, roleKey='common', roleName='普通角色'}]}
-```
\ No newline at end of file
From 4e5d9913bb934a1d6bd42395aed27637f05a1208 Mon Sep 17 00:00:00 2001
From: Suomm <1474983351@qq.com>
Date: Thu, 8 Jun 2023 09:59:09 +0800
Subject: [PATCH 6/6] =?UTF-8?q?doc:=20=E6=B7=BB=E5=8A=A0=E7=BB=93=E6=9E=9C?=
=?UTF-8?q?=E6=98=A0=E5=B0=84=E6=B3=A8=E6=84=8F=E4=BA=8B=E9=A1=B9=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/base/field-query.md | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/docs/zh/base/field-query.md b/docs/zh/base/field-query.md
index 1c75ed67..980f28e5 100644
--- a/docs/zh/base/field-query.md
+++ b/docs/zh/base/field-query.md
@@ -108,7 +108,7 @@ List articles = mapper.selectListByQuery(query
## 结果映射
-您也可以继续使用连表查询,如果是原生 MyBatis 的话,可以使用 `` 标签来构建结果映射,在 MyBatis-Flex 中提供了自动结果映射功能,这样您就可以只关注于 SQL 语句的构建。
+您也可以继续使用联表查询,如果是原生 MyBatis 的话,可以使用 `` 标签来构建结果映射,在 MyBatis-Flex 中提供了自动结果映射功能,这样您就可以只关注于 SQL 语句的构建。
## 代码示例(Join Query)
@@ -147,7 +147,7 @@ public class UserVO {
}
```
-这个操作只需要连表查询即可完成,对于连表查询的结果映射,MyBatis-Flex 会自动帮您完成:
+这个操作只需要联表查询即可完成,对于联表查询的结果映射,MyBatis-Flex 会自动帮您完成:
```java
@SpringBootTest
@@ -170,7 +170,7 @@ class UserMapperTest {
}
```
-构建的连表查询 SQL 语句为:
+构建的联表查询 SQL 语句为:
```sql
SELECT `u`.`user_id`,
@@ -187,4 +187,17 @@ LEFT JOIN `sys_role` AS `r` ON `ur`.`role_id` = `r`.`role_id`;
UserVO{userId='1', userName='admin', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}]}
UserVO{userId='2', userName='ry', roleList=[Role{roleId=2, roleKey='common', roleName='普通角色'}]}
UserVO{userId='3', userName='test', roleList=[Role{roleId=1, roleKey='admin', roleName='超级管理员'}, Role{roleId=2, roleKey='common', roleName='普通角色'}]}
-```
\ No newline at end of file
+```
+
+## 特别注意!!!
+
+使用 `join` 联表查询的时候,只能使用 `selectListXxx` 方法查询 List 数据,不能使用 `selectOneXxx` 方法查询单个数据。
+
+```java
+default R selectOneByQueryAs(QueryWrapper queryWrapper, Class asType) {
+ List entities = selectListByQueryAs(queryWrapper.limit(1), asType);
+ return (entities == null || entities.isEmpty()) ? null : entities.get(0);
+}
+```
+
+因为这个 `selectOneXxx` 方法都是调用的对应的 `selectListXxx` 方法,其中添加了 `queryWrapper.limit(1)` 约束,将数据限制在了一条,而联表查询数据有可能是多条的,这样自动映射就会出现数据丢失。
\ No newline at end of file