Commit 670f67e551b8c3c02582080696c58a249d60157e
1 parent
1c1894af
新增 mybatis-plus-join
Showing
7 changed files
with
86 additions
and
2 deletions
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 | ... | ... |