diff --git a/docs/zh/base/field-query.md b/docs/zh/base/field-query.md index bb1ac72a..980f28e5 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,100 @@ 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='普通角色'}]} +``` + +## 特别注意!!! + +使用 `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 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; } 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/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 new file mode 100644 index 00000000..88d3a109 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Role.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_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 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..1ff8f244 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/User.java @@ -0,0 +1,69 @@ +/* + * 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_user") +public class User { + + @Id + private Integer userId; + private String userName; + private String password; + + 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; + } + + @Override + public String toString() { + 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 new file mode 100644 index 00000000..4ae2bb28 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserRole.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_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; + } +} \ 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..e3f8cf59 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO.java @@ -0,0 +1,66 @@ +/* + * 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; + +/** + * 用户 VO 对象。 + * + * @author 王帅 + * @since 2023-06-07 + */ + +public class UserVO { + + 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 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/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..26a60d2b --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO1.java @@ -0,0 +1,74 @@ +/* + * 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 UserVO1 { + + 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 String toString() { + 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 new file mode 100644 index 00000000..10da2c24 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO2.java @@ -0,0 +1,62 @@ +/* + * 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; + +/** + * @author 王帅 + * @since 2023-06-07 + */ + +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 String toString() { + return "UserVO2{" + + "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..16d97b3c --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/UserVO3.java @@ -0,0 +1,82 @@ +/* + * 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; + +/** + * @author 王帅 + * @since 2023-06-07 + */ + +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 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..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 @@ -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/mp_test + 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 @@ + + + + + + + + + + + + + + +