From 670f67e551b8c3c02582080696c58a249d60157e Mon Sep 17 00:00:00 2001 From: wangzhs Date: Sat, 11 Mar 2023 17:47:15 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20mybatis-plus-join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-dependencies/pom.xml | 7 ++++ .../yudao-spring-boot-starter-mybatis/pom.xml | 5 +++ .../config/MybatisPlusJoinConfiguration.java | 18 ++++++++++ .../mybatis/core/mapper/BaseMapperX.java | 4 +-- .../test/core/ut/BaseDbUnitTest.java | 6 ++++ .../dal/dataobject/user/AdminUserDO.java | 13 +++++++ .../user/AdminUserServiceImplTest.java | 35 +++++++++++++++++++ 7 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index 1d94323a2..caef2d31c 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -26,6 +26,7 @@ 3.5.3.1 3.5.3.1 3.6.1 + 1.3.4 3.18.0 2.2.3 @@ -209,6 +210,12 @@ ${dynamic-datasource.version} + + icu.mhb + mybatis-plus-join + ${mybatis-plus-join.version} + + cn.iocoder.boot yudao-spring-boot-starter-redis diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml index 99c4c6a06..3bfa86871 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml @@ -59,6 +59,11 @@ dynamic-datasource-spring-boot-starter + + icu.mhb + mybatis-plus-join + + diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java new file mode 100644 index 000000000..3321a0212 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.framework.mybatis.config; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import icu.mhb.mybatisplus.plugln.injector.JoinDefaultSqlInjector; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class MybatisPlusJoinConfiguration extends JoinDefaultSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + return super.getMethodList(mapperClass, tableInfo); + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java index a831337e8..56e1deb05 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java @@ -6,10 +6,10 @@ import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.toolkit.Db; +import icu.mhb.mybatisplus.plugln.base.mapper.JoinBaseMapper; import org.apache.ibatis.annotations.Param; import java.util.Collection; @@ -18,7 +18,7 @@ import java.util.List; /** * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 */ -public interface BaseMapperX extends BaseMapper { +public interface BaseMapperX extends JoinBaseMapper { default PageResult selectPage(PageParam pageParam, @Param("ew") Wrapper queryWrapper) { // MyBatis Plus 查询 diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java index 6a9a3ffcb..1b16ba0d1 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java @@ -1,10 +1,13 @@ package cn.iocoder.yudao.framework.test.core.ut; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.MybatisPlusJoinConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import icu.mhb.mybatisplus.plugln.interceptor.JoinInterceptor; +import icu.mhb.mybatisplus.plugln.interceptor.JoinInterceptorConfig; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -34,6 +37,9 @@ public class BaseDbUnitTest { // MyBatis 配置类 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + MybatisPlusJoinConfiguration.class, // MyBatis 的自动配置类 + JoinInterceptor.class, // MyBatis 的Join配置类 + JoinInterceptorConfig.class, // MyBatis 的Join配置类 }) public static class Application { } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java index 287a388d9..2ca77ff37 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java @@ -3,11 +3,15 @@ package cn.iocoder.yudao.module.system.dal.dataobject.user; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.enums.common.SexEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; +import icu.mhb.mybatisplus.plugln.annotations.JoinField; +import icu.mhb.mybatisplus.plugln.constant.RelevancyType; import lombok.*; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -93,4 +97,13 @@ public class AdminUserDO extends TenantBaseDO { */ private LocalDateTime loginDate; + /** + * 用户所属部门 + */ + @JoinField(masterModelClass = AdminUserDO.class, masterModelField = "deptId", + sunModelClass = DeptDO.class, sunModelField = "id", + relevancyType = RelevancyType.ONT_TO_ONE, sunAlias = "d") + @TableField(exist = false, typeHandler = FastjsonTypeHandler.class) + private DeptDO dept; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index a5e0183a4..46d096496 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper; import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper; import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; import cn.iocoder.yudao.module.system.enums.common.SexEnum; @@ -23,6 +24,7 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.tenant.TenantService; +import icu.mhb.mybatisplus.plugln.extend.Joins; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; import org.springframework.boot.test.mock.mockito.MockBean; @@ -63,6 +65,8 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { private AdminUserMapper userMapper; @Resource private UserPostMapper userPostMapper; + @Resource + private DeptMapper deptMapper; @MockBean private DeptService deptService; @@ -770,6 +774,37 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { userDO.getNickname()); } + @Test + public void testSelectUserIncludeDept_success() { + // 需设置 application-unit-test.yaml 文件中 spring.main.lazy-initialization: true + + // 准备部门数据 + DeptDO dept = new DeptDO(); + dept.setName("测试"); + dept.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(dept); + + // 准备用户参数 + UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> { + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); + o.setMobile(randomString()); + o.setPostIds(asSet(1L, 2L)); + o.setDeptId(dept.getId()); + }); + + // 调用 + Long userId = userService.createUser(reqVO); + + // 断言 + AdminUserDO user = Joins.of(AdminUserDO.class) + .leftJoin(DeptDO.class, DeptDO::getId, AdminUserDO::getDeptId) + .end() + .eq(AdminUserDO::getId, userId) + .joinGetOne(AdminUserDO.class); + System.out.println("=========>" + user); + } + + // ========== 随机对象 ========== @SafeVarargs From ef510f94787f8f29eb833ad293bb447fde2b03aa Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 11 Mar 2023 18:23:07 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20mybatis=20plus=20join?= =?UTF-8?q?=20=E9=9B=86=E6=88=90=E7=9A=84=E4=BF=AE=E6=94=B9=E5=BB=BA?= =?UTF-8?q?=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/mybatis/config/MybatisPlusJoinConfiguration.java | 1 + .../yudao/framework/mybatis/core/mapper/BaseMapperX.java | 2 ++ .../cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java | 1 + 3 files changed, 4 insertions(+) diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java index 3321a0212..63529ca20 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration; import java.util.List; +// TODO @升平:是不是作为 YudaoMybatisAutoConfiguration 的 bean 即可呀?然后 getMethodList 不用重写 @Configuration public class MybatisPlusJoinConfiguration extends JoinDefaultSqlInjector { diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java index 56e1deb05..2a7a828df 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java @@ -17,6 +17,8 @@ import java.util.List; /** * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 + * + * 为什么继承 JoinBaseMapper 接口?支持 MyBatis Plus 多表 Join 的能力。 */ public interface BaseMapperX extends JoinBaseMapper { diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java index 1b16ba0d1..fc29a1b78 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java @@ -38,6 +38,7 @@ public class BaseDbUnitTest { YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 MybatisPlusJoinConfiguration.class, // MyBatis 的自动配置类 + // TODO @升平:看看有没可能去掉下面两个类 JoinInterceptor.class, // MyBatis 的Join配置类 JoinInterceptorConfig.class, // MyBatis 的Join配置类 }) From 7e0fb6cb56901e6c0820c428784231e26acb4595 Mon Sep 17 00:00:00 2001 From: wangzhs Date: Sun, 12 Mar 2023 17:43:42 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E8=B0=83=E6=95=B4Mybaits=20Plus=20Join?= =?UTF-8?q?=E7=9A=84SQL=E6=B3=A8=E5=85=A5=E5=99=A8=E5=88=B0YudaoMybatisAut?= =?UTF-8?q?oConfiguration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MybatisPlusJoinConfiguration.java | 19 ------------------- .../config/YudaoMybatisAutoConfiguration.java | 7 +++++++ 2 files changed, 7 insertions(+), 19 deletions(-) delete mode 100644 yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java deleted file mode 100644 index 63529ca20..000000000 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.framework.mybatis.config; - -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import icu.mhb.mybatisplus.plugln.injector.JoinDefaultSqlInjector; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -// TODO @升平:是不是作为 YudaoMybatisAutoConfiguration 的 bean 即可呀?然后 getMethodList 不用重写 -@Configuration -public class MybatisPlusJoinConfiguration extends JoinDefaultSqlInjector { - - @Override - public List getMethodList(Class mapperClass, TableInfo tableInfo) { - return super.getMethodList(mapperClass, tableInfo); - } - -} diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java index 78ee259c8..0c040013f 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java @@ -5,12 +5,14 @@ import cn.iocoder.yudao.framework.mybatis.core.handler.DefaultDBFieldHandler; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator; import com.baomidou.mybatisplus.extension.incrementer.KingbaseKeyGenerator; import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator; import com.baomidou.mybatisplus.extension.incrementer.PostgreKeyGenerator; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import icu.mhb.mybatisplus.plugln.injector.JoinDefaultSqlInjector; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -40,6 +42,11 @@ public class YudaoMybatisAutoConfiguration { return new DefaultDBFieldHandler(); // 自动填充参数类 } + @Bean + public DefaultSqlInjector defaultSqlInjector() { + return new JoinDefaultSqlInjector(); // 使用Mybaits Plus Join定义的SQL注入器 + } + @Bean @ConditionalOnProperty(prefix = "mybatis-plus.global-config.db-config", name = "id-type", havingValue = "INPUT") public IKeyGenerator keyGenerator(ConfigurableEnvironment environment) { From 95159b02579a4964ff40d17783cdc8340bb6d054 Mon Sep 17 00:00:00 2001 From: wangzhs Date: Mon, 13 Mar 2023 09:52:27 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E8=B0=83=E6=95=B4Mybaits=20Plus=20Join?= =?UTF-8?q?=E7=9A=84SQL=E6=B3=A8=E5=85=A5=E5=99=A8=E5=88=B0YudaoMybatisAut?= =?UTF-8?q?oConfiguration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java | 2 -- .../module/system/service/user/AdminUserServiceImplTest.java | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java index fc29a1b78..7ff1c4a11 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.framework.test.core.ut; import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; -import cn.iocoder.yudao.framework.mybatis.config.MybatisPlusJoinConfiguration; import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; @@ -37,7 +36,6 @@ public class BaseDbUnitTest { // MyBatis 配置类 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - MybatisPlusJoinConfiguration.class, // MyBatis 的自动配置类 // TODO @升平:看看有没可能去掉下面两个类 JoinInterceptor.class, // MyBatis 的Join配置类 JoinInterceptorConfig.class, // MyBatis 的Join配置类 diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index 46d096496..43edc3b59 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -776,7 +776,7 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { @Test public void testSelectUserIncludeDept_success() { - // 需设置 application-unit-test.yaml 文件中 spring.main.lazy-initialization: true + // 需设置 application-unit-test.yaml 文件中 spring.main.lazy-initialization: false // 准备部门数据 DeptDO dept = new DeptDO(); @@ -798,6 +798,7 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { // 断言 AdminUserDO user = Joins.of(AdminUserDO.class) .leftJoin(DeptDO.class, DeptDO::getId, AdminUserDO::getDeptId) + .oneToOneSelect(AdminUserDO::getDept, DeptDO.class) .end() .eq(AdminUserDO::getId, userId) .joinGetOne(AdminUserDO.class); From f9569f910f834ea960e7deb7c5368cf48e1f5ffd Mon Sep 17 00:00:00 2001 From: wangzhs Date: Mon, 13 Mar 2023 18:32:43 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=88=87=E6=8D=A2=20Mybatis-plus-join=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-dependencies/pom.xml | 8 ++++---- .../yudao-spring-boot-starter-mybatis/pom.xml | 4 ++-- .../config/YudaoMybatisAutoConfiguration.java | 7 ------- .../mybatis/core/mapper/BaseMapperX.java | 8 ++++---- .../framework/test/core/ut/BaseDbUnitTest.java | 7 ++----- .../system/dal/dataobject/user/AdminUserDO.java | 5 ----- .../service/user/AdminUserServiceImplTest.java | 15 +++++++-------- 7 files changed, 19 insertions(+), 35 deletions(-) diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index caef2d31c..74083bcbe 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -26,7 +26,7 @@ 3.5.3.1 3.5.3.1 3.6.1 - 1.3.4 + 1.4.3.1 3.18.0 2.2.3 @@ -211,9 +211,9 @@ - icu.mhb - mybatis-plus-join - ${mybatis-plus-join.version} + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join-boot-starter.version} diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml index 3bfa86871..4424c72b6 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml @@ -60,8 +60,8 @@ - icu.mhb - mybatis-plus-join + com.github.yulichang + mybatis-plus-join-boot-starter diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java index 0c040013f..78ee259c8 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java @@ -5,14 +5,12 @@ import cn.iocoder.yudao.framework.mybatis.core.handler.DefaultDBFieldHandler; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; -import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator; import com.baomidou.mybatisplus.extension.incrementer.KingbaseKeyGenerator; import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator; import com.baomidou.mybatisplus.extension.incrementer.PostgreKeyGenerator; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import icu.mhb.mybatisplus.plugln.injector.JoinDefaultSqlInjector; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -42,11 +40,6 @@ public class YudaoMybatisAutoConfiguration { return new DefaultDBFieldHandler(); // 自动填充参数类 } - @Bean - public DefaultSqlInjector defaultSqlInjector() { - return new JoinDefaultSqlInjector(); // 使用Mybaits Plus Join定义的SQL注入器 - } - @Bean @ConditionalOnProperty(prefix = "mybatis-plus.global-config.db-config", name = "id-type", havingValue = "INPUT") public IKeyGenerator keyGenerator(ConfigurableEnvironment environment) { diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java index 2a7a828df..9819bf551 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.toolkit.Db; -import icu.mhb.mybatisplus.plugln.base.mapper.JoinBaseMapper; +import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Param; import java.util.Collection; @@ -17,10 +17,10 @@ import java.util.List; /** * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 - * - * 为什么继承 JoinBaseMapper 接口?支持 MyBatis Plus 多表 Join 的能力。 + *

+ * 为什么继承 MPJBaseMapper 接口?支持 MyBatis Plus 多表 Join 的能力。 */ -public interface BaseMapperX extends JoinBaseMapper { +public interface BaseMapperX extends MPJBaseMapper { default PageResult selectPage(PageParam pageParam, @Param("ew") Wrapper queryWrapper) { // MyBatis Plus 查询 diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java index 7ff1c4a11..316c4d52f 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java @@ -5,8 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import icu.mhb.mybatisplus.plugln.interceptor.JoinInterceptor; -import icu.mhb.mybatisplus.plugln.interceptor.JoinInterceptorConfig; +import com.github.yulichang.autoconfigure.MybatisPlusJoinAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -36,9 +35,7 @@ public class BaseDbUnitTest { // MyBatis 配置类 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - // TODO @升平:看看有没可能去掉下面两个类 - JoinInterceptor.class, // MyBatis 的Join配置类 - JoinInterceptorConfig.class, // MyBatis 的Join配置类 + MybatisPlusJoinAutoConfiguration.class, // MyBatis 的Join配置类 }) public static class Application { } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java index 2ca77ff37..ff8012938 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java @@ -10,8 +10,6 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; -import icu.mhb.mybatisplus.plugln.annotations.JoinField; -import icu.mhb.mybatisplus.plugln.constant.RelevancyType; import lombok.*; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -100,9 +98,6 @@ public class AdminUserDO extends TenantBaseDO { /** * 用户所属部门 */ - @JoinField(masterModelClass = AdminUserDO.class, masterModelField = "deptId", - sunModelClass = DeptDO.class, sunModelField = "id", - relevancyType = RelevancyType.ONT_TO_ONE, sunAlias = "d") @TableField(exist = false, typeHandler = FastjsonTypeHandler.class) private DeptDO dept; diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index 43edc3b59..4ba5645f9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -24,7 +24,7 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.tenant.TenantService; -import icu.mhb.mybatisplus.plugln.extend.Joins; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; import org.springframework.boot.test.mock.mockito.MockBean; @@ -776,7 +776,6 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { @Test public void testSelectUserIncludeDept_success() { - // 需设置 application-unit-test.yaml 文件中 spring.main.lazy-initialization: false // 准备部门数据 DeptDO dept = new DeptDO(); @@ -795,13 +794,13 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { // 调用 Long userId = userService.createUser(reqVO); - // 断言 - AdminUserDO user = Joins.of(AdminUserDO.class) + MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(AdminUserDO.class) + .selectAll(AdminUserDO.class) + .selectAssociation(DeptDO.class, AdminUserDO::getDept) .leftJoin(DeptDO.class, DeptDO::getId, AdminUserDO::getDeptId) - .oneToOneSelect(AdminUserDO::getDept, DeptDO.class) - .end() - .eq(AdminUserDO::getId, userId) - .joinGetOne(AdminUserDO.class); + .eq(AdminUserDO::getId, userId); + AdminUserDO user = userMapper.selectJoinOne(AdminUserDO.class, wrapper); + System.out.println("=========>" + user); } From 80b7352d9acbf5704e6d1f00534b4be5e5a13866 Mon Sep 17 00:00:00 2001 From: wangzhs Date: Tue, 14 Mar 2023 20:58:28 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B5=8B=E8=AF=95AdminUs?= =?UTF-8?q?erDO=E4=B8=ADDept=E5=AE=9E=E4=BD=93=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/dal/dataobject/user/AdminUserDO.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java index ff8012938..287a388d9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java @@ -3,13 +3,11 @@ package cn.iocoder.yudao.module.system.dal.dataobject.user; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.enums.common.SexEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import lombok.*; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -95,10 +93,4 @@ public class AdminUserDO extends TenantBaseDO { */ private LocalDateTime loginDate; - /** - * 用户所属部门 - */ - @TableField(exist = false, typeHandler = FastjsonTypeHandler.class) - private DeptDO dept; - } From 69fa19a856260a1bd01d9063be6f7d7e13798ad5 Mon Sep 17 00:00:00 2001 From: wangzhs Date: Tue, 14 Mar 2023 21:45:09 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=8D=95=E6=B5=8B?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/AdminUserServiceImplTest.java | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index 4ba5645f9..f35481535 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -774,37 +774,6 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { userDO.getNickname()); } - @Test - public void testSelectUserIncludeDept_success() { - - // 准备部门数据 - DeptDO dept = new DeptDO(); - dept.setName("测试"); - dept.setStatus(CommonStatusEnum.ENABLE.getStatus()); - deptMapper.insert(dept); - - // 准备用户参数 - UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> { - o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); - o.setMobile(randomString()); - o.setPostIds(asSet(1L, 2L)); - o.setDeptId(dept.getId()); - }); - - // 调用 - Long userId = userService.createUser(reqVO); - - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(AdminUserDO.class) - .selectAll(AdminUserDO.class) - .selectAssociation(DeptDO.class, AdminUserDO::getDept) - .leftJoin(DeptDO.class, DeptDO::getId, AdminUserDO::getDeptId) - .eq(AdminUserDO::getId, userId); - AdminUserDO user = userMapper.selectJoinOne(AdminUserDO.class, wrapper); - - System.out.println("=========>" + user); - } - - // ========== 随机对象 ========== @SafeVarargs From 35851b7c1d24dc8cf42769568661413fbe4ea35f Mon Sep 17 00:00:00 2001 From: wangzhs Date: Tue, 14 Mar 2023 21:47:17 +0800 Subject: [PATCH 8/9] =?UTF-8?q?fix=EF=BC=9A=E6=B8=85=E9=99=A4=E5=85=B3?= =?UTF-8?q?=E8=81=94=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/service/user/AdminUserServiceImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index f35481535..a9a154833 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -24,7 +24,6 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.tenant.TenantService; -import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; import org.springframework.boot.test.mock.mockito.MockBean; From 900d12bab8e480c628ff613e02bd0be3d14980d4 Mon Sep 17 00:00:00 2001 From: wangzhs Date: Tue, 14 Mar 2023 21:48:21 +0800 Subject: [PATCH 9/9] =?UTF-8?q?fix=EF=BC=9A=E6=B8=85=E9=99=A4=E5=85=B3?= =?UTF-8?q?=E8=81=94=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/service/user/AdminUserServiceImplTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index a9a154833..a5e0183a4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -16,7 +16,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; -import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper; import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper; import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; import cn.iocoder.yudao.module.system.enums.common.SexEnum; @@ -64,8 +63,6 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { private AdminUserMapper userMapper; @Resource private UserPostMapper userPostMapper; - @Resource - private DeptMapper deptMapper; @MockBean private DeptService deptService;