Ver código fonte

新增 mybatis-plus-join

wangzhs 2 anos atrás
pai
commit
670f67e551

+ 7 - 0
yudao-dependencies/pom.xml

@@ -26,6 +26,7 @@
         <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
         <mybatis-plus-generator.version>3.5.3.1</mybatis-plus-generator.version>
         <dynamic-datasource.version>3.6.1</dynamic-datasource.version>
+        <mybatis-plus-join.version>1.3.4</mybatis-plus-join.version>
         <redisson.version>3.18.0</redisson.version>
         <!-- 服务保障相关 -->
         <lock4j.version>2.2.3</lock4j.version>
@@ -209,6 +210,12 @@
                 <version>${dynamic-datasource.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>icu.mhb</groupId>
+                <artifactId>mybatis-plus-join</artifactId>
+                <version>${mybatis-plus-join.version}</version>
+            </dependency>
+
             <dependency>
                 <groupId>cn.iocoder.boot</groupId>
                 <artifactId>yudao-spring-boot-starter-redis</artifactId>

+ 5 - 0
yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml

@@ -59,6 +59,11 @@
             <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 -->
         </dependency>
 
+        <dependency>
+            <groupId>icu.mhb</groupId>
+            <artifactId>mybatis-plus-join</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 18 - 0
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<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
+        return super.getMethodList(mapperClass, tableInfo);
+    }
+
+}

+ 2 - 2
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<T> extends BaseMapper<T> {
+public interface BaseMapperX<T> extends JoinBaseMapper<T> {
 
     default PageResult<T> selectPage(PageParam pageParam, @Param("ew") Wrapper<T> queryWrapper) {
         // MyBatis Plus 查询

+ 6 - 0
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 {
     }

+ 13 - 0
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;
+
 }

+ 35 - 0
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