Commit 670f67e551b8c3c02582080696c58a249d60157e

Authored by wangzhs
1 parent 1c1894af

新增 mybatis-plus-join

yudao-dependencies/pom.xml
... ... @@ -26,6 +26,7 @@
26 26 <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
27 27 <mybatis-plus-generator.version>3.5.3.1</mybatis-plus-generator.version>
28 28 <dynamic-datasource.version>3.6.1</dynamic-datasource.version>
  29 + <mybatis-plus-join.version>1.3.4</mybatis-plus-join.version>
29 30 <redisson.version>3.18.0</redisson.version>
30 31 <!-- 服务保障相关 -->
31 32 <lock4j.version>2.2.3</lock4j.version>
... ... @@ -210,6 +211,12 @@
210 211 </dependency>
211 212  
212 213 <dependency>
  214 + <groupId>icu.mhb</groupId>
  215 + <artifactId>mybatis-plus-join</artifactId>
  216 + <version>${mybatis-plus-join.version}</version>
  217 + </dependency>
  218 +
  219 + <dependency>
213 220 <groupId>cn.iocoder.boot</groupId>
214 221 <artifactId>yudao-spring-boot-starter-redis</artifactId>
215 222 <version>${revision}</version>
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml
... ... @@ -59,6 +59,11 @@
59 59 <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 -->
60 60 </dependency>
61 61  
  62 + <dependency>
  63 + <groupId>icu.mhb</groupId>
  64 + <artifactId>mybatis-plus-join</artifactId>
  65 + </dependency>
  66 +
62 67 </dependencies>
63 68  
64 69 </project>
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/MybatisPlusJoinConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.mybatis.config;
  2 +
  3 +import com.baomidou.mybatisplus.core.injector.AbstractMethod;
  4 +import com.baomidou.mybatisplus.core.metadata.TableInfo;
  5 +import icu.mhb.mybatisplus.plugln.injector.JoinDefaultSqlInjector;
  6 +import org.springframework.context.annotation.Configuration;
  7 +
  8 +import java.util.List;
  9 +
  10 +@Configuration
  11 +public class MybatisPlusJoinConfiguration extends JoinDefaultSqlInjector {
  12 +
  13 + @Override
  14 + public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
  15 + return super.getMethodList(mapperClass, tableInfo);
  16 + }
  17 +
  18 +}
... ...
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;
6 6 import com.baomidou.mybatisplus.core.conditions.Wrapper;
7 7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
8 8 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
9   -import com.baomidou.mybatisplus.core.mapper.BaseMapper;
10 9 import com.baomidou.mybatisplus.core.metadata.IPage;
11 10 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
12 11 import com.baomidou.mybatisplus.extension.toolkit.Db;
  12 +import icu.mhb.mybatisplus.plugln.base.mapper.JoinBaseMapper;
13 13 import org.apache.ibatis.annotations.Param;
14 14  
15 15 import java.util.Collection;
... ... @@ -18,7 +18,7 @@ import java.util.List;
18 18 /**
19 19 * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
20 20 */
21   -public interface BaseMapperX<T> extends BaseMapper<T> {
  21 +public interface BaseMapperX<T> extends JoinBaseMapper<T> {
22 22  
23 23 default PageResult<T> selectPage(PageParam pageParam, @Param("ew") Wrapper<T> queryWrapper) {
24 24 // MyBatis Plus 查询
... ...
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java
1 1 package cn.iocoder.yudao.framework.test.core.ut;
2 2  
3 3 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
  4 +import cn.iocoder.yudao.framework.mybatis.config.MybatisPlusJoinConfiguration;
4 5 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
5 6 import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
6 7 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
7 8 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
  9 +import icu.mhb.mybatisplus.plugln.interceptor.JoinInterceptor;
  10 +import icu.mhb.mybatisplus.plugln.interceptor.JoinInterceptorConfig;
8 11 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
9 12 import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
10 13 import org.springframework.boot.test.context.SpringBootTest;
... ... @@ -34,6 +37,9 @@ public class BaseDbUnitTest {
34 37 // MyBatis 配置类
35 38 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
36 39 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  40 + MybatisPlusJoinConfiguration.class, // MyBatis 的自动配置类
  41 + JoinInterceptor.class, // MyBatis 的Join配置类
  42 + JoinInterceptorConfig.class, // MyBatis 的Join配置类
37 43 })
38 44 public static class Application {
39 45 }
... ...
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;
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
5 5 import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
  6 +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
6 7 import cn.iocoder.yudao.module.system.enums.common.SexEnum;
7 8 import com.baomidou.mybatisplus.annotation.KeySequence;
8 9 import com.baomidou.mybatisplus.annotation.TableField;
9 10 import com.baomidou.mybatisplus.annotation.TableId;
10 11 import com.baomidou.mybatisplus.annotation.TableName;
  12 +import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
  13 +import icu.mhb.mybatisplus.plugln.annotations.JoinField;
  14 +import icu.mhb.mybatisplus.plugln.constant.RelevancyType;
11 15 import lombok.*;
12 16 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
13 17  
... ... @@ -93,4 +97,13 @@ public class AdminUserDO extends TenantBaseDO {
93 97 */
94 98 private LocalDateTime loginDate;
95 99  
  100 + /**
  101 + * 用户所属部门
  102 + */
  103 + @JoinField(masterModelClass = AdminUserDO.class, masterModelField = "deptId",
  104 + sunModelClass = DeptDO.class, sunModelField = "id",
  105 + relevancyType = RelevancyType.ONT_TO_ONE, sunAlias = "d")
  106 + @TableField(exist = false, typeHandler = FastjsonTypeHandler.class)
  107 + private DeptDO dept;
  108 +
96 109 }
... ...
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;
16 16 import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO;
17 17 import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
18 18 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
  19 +import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
19 20 import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper;
20 21 import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
21 22 import cn.iocoder.yudao.module.system.enums.common.SexEnum;
... ... @@ -23,6 +24,7 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService;
23 24 import cn.iocoder.yudao.module.system.service.dept.PostService;
24 25 import cn.iocoder.yudao.module.system.service.permission.PermissionService;
25 26 import cn.iocoder.yudao.module.system.service.tenant.TenantService;
  27 +import icu.mhb.mybatisplus.plugln.extend.Joins;
26 28 import org.junit.jupiter.api.Test;
27 29 import org.mockito.stubbing.Answer;
28 30 import org.springframework.boot.test.mock.mockito.MockBean;
... ... @@ -63,6 +65,8 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest {
63 65 private AdminUserMapper userMapper;
64 66 @Resource
65 67 private UserPostMapper userPostMapper;
  68 + @Resource
  69 + private DeptMapper deptMapper;
66 70  
67 71 @MockBean
68 72 private DeptService deptService;
... ... @@ -770,6 +774,37 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest {
770 774 userDO.getNickname());
771 775 }
772 776  
  777 + @Test
  778 + public void testSelectUserIncludeDept_success() {
  779 + // 需设置 application-unit-test.yaml 文件中 spring.main.lazy-initialization: true
  780 +
  781 + // 准备部门数据
  782 + DeptDO dept = new DeptDO();
  783 + dept.setName("测试");
  784 + dept.setStatus(CommonStatusEnum.ENABLE.getStatus());
  785 + deptMapper.insert(dept);
  786 +
  787 + // 准备用户参数
  788 + UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> {
  789 + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex());
  790 + o.setMobile(randomString());
  791 + o.setPostIds(asSet(1L, 2L));
  792 + o.setDeptId(dept.getId());
  793 + });
  794 +
  795 + // 调用
  796 + Long userId = userService.createUser(reqVO);
  797 +
  798 + // 断言
  799 + AdminUserDO user = Joins.of(AdminUserDO.class)
  800 + .leftJoin(DeptDO.class, DeptDO::getId, AdminUserDO::getDeptId)
  801 + .end()
  802 + .eq(AdminUserDO::getId, userId)
  803 + .joinGetOne(AdminUserDO.class);
  804 + System.out.println("=========>" + user);
  805 + }
  806 +
  807 +
773 808 // ========== 随机对象 ==========
774 809  
775 810 @SafeVarargs
... ...