开发者

MyBatis-Plus实现多表联查方式(一对一,一对多使用)

开发者 https://www.devze.com 2025-10-15 10:31 出处:网络 作者: 慷
目录1、前言2、介绍3、特性4、使用引依赖继承开始使用一对一一对多分页查询5、MPJLambdaWrapper所有方法说明selectselectAllselectAs总结1、前言
目录
  • 1、前言
  • 2、介绍
  • 3、特性
  • 4、使用
    • 引依赖
    • 继承
    • 开始使用
      • 一对一
      • 一对多
      • 分页查询
  • 5、MPJLambdaWrapper所有方法说明
    • select
      • selectAll
        • selectAs
        • 总结

          1、前言

          在使用myBATis-plus开发需求的时候会发现对于大部分的业务场景来说都会使用到join来进行联表查询,但是mybatis-plus封装的 mapper 不支持 join,如果需要支持就需要自己手动去实现,给大家推荐一个好用的插件(MyBatis-Plus-Join)。

          2、介绍

          Mybatis-Plus-Join(简称 MPJ)是一个 Mybatis-Plus的增强工具,在 MyBatis-Plus 的基础上只做增强不做改变,为简化开发、提高效率而生。

          3、特性

          • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
          • 无感引入, 支持MP风格的查询, 您会MP就会MPJ, 无需额外的学习成本
          • 兼容MP的别名、逻辑删除、枚举列、TypeHandle列等特性
          • 支持注解形式一对一、一对多和连表查询形式的一对一和一对多

          4、使用

          引依赖

          需要 Mybatis-plus version >= 3.4.0

          <dependency>
                      <groupId>com.github.yulichang</groupId>
                      <artifactId>mybatis-plus-join-boot-starter</artifactId>
                      <version>1.4.7.2</version>
                  </dependency>

          继承

          • (必须)mapper继承MPJBaseMapper
          public interface CarIllegalMapper extends MPJBaseMapper<CarIllegal>
          {
          }
          
          • (可选)service继承MPJBaseService
          public interface ICarIllegalService  extends MPJBaseService&ljst;CarIllegal>{}
          
          • (可选)serviceImpl继承MPJBaseServiceImpl
          @Service
          public class CarIllegalServiceImpl extends MPJBaseServiceImpl<CarIllegalMapper, CarIllegal> implements ICarIllegalService
          {}

          开始使用

          现有一张car_illegal(车辆违章)表和一张attachments_file(附件)表,其关联关系是每辆违章车数据可能对应着一条或多条的违章图片(附件),以这两张表为例来进行一对一和一对多测试。

          一对一

          说明

          • CarIllegalDto.class 查询结果返回类(resultType)
          • selectAll() 查询指定实体类的全部字段
          • select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
          • selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用

          leftJoin() 参数说明

          • 第一个参数: 参与连表的实体类class
          • 第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性
          • 第三个参数: 参与连表的ON的另一个实体类属性

          默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…

          • selPqjwLectAssociation()一对一查询
          • selectCollection()一对多查询
          @SpringBootTest(classes = DeXinApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
          @RunWith(SpringRunner.class)
          @Slf4j
          class DeXinApplicationTests {
          
              @Autowired
              private CarIllegalMapper carIllegalMapper;
          
              @Test
              public void testSelect() {
                   MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
                          .selectAll(CarIllegalDto.class)
                          .selectAssociation(AttachmentsFile.class,CarIllegalDto::getAttachmentsFile)
                             .leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId,CarIllegal::getId);
                  List<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinList(CarIllegalDto.class,wrapper);
              }
          }

          返回的实体类

          @Data
          public class  CarIllegalDto extends  CarIllegal
          {
              AttachmentsFile attachmentsFile;
          
              List<AttachmentsFile> attachmentsFileList;
          }
          

           查询结果

          MyBatis-Plus实现多表联查方式(一对一,一对多使用)

          一对多

            @Test
              public void testSelect() {
                  MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
                          .selectAll(CarIllegalDto.class)
                          .selectCollection(AttachmentsFile.class,CarIllegalDto::getAttachmentsFileList)
                          .leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId,CarIllegal::getId);
                  List<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinList(CarIllegalDto.class,wrapper);
                  System.out.println(1);
              }

          结果 

          MyBatis-Plus实现多表联查方式(一对一,一对多使用)

          分页查询

          连表分页查询返回所有命中记录(请启用mybatis-plus分页插件)

          import com.baomidou.mybatiswww.devze.complus.core.metadata.IPage; 
          
          
             @Test
              public void testSelect() throws IOException {
                  MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
                          .selectAll(CarIllegalDto.class)
                          .selectAs(AttachmentsFile::getId,CarIllegalDto::getCarNo)
                          .selectCollection(AttachmentsFile.class,CarIllegalDto::getAttachmentsFileList)
                          .leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId, CarIllegal::getId);
                  IPage<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinPage(new Page<>(1, 10),CarIllegalDtowww.devze.com.class,wrapper);
                  System.out.println(carIllegalDtoList);
              }

          结果

          MyBatis-Plus实现多表联查方式(一对一,一对多使用)

          5、MPJLambdaWrapper所有方法说明

          select

          • 查询指定字段 
          select(AttachmentsFile::getName)
          • 支持可变参数
          select(AttachmentsFile::getName,AttachmentsFile::getEnterpriseId)
          • 自定义字符串查询,需要对查询的表命名别名
          select("file.id");
          select("file.id as 'pid'");
          select("file.id", "file.name");
          
          //需要对表进行别名
           .leftJoin(AttachmentsFile.class,"file",AttachmentsFile::getTargetId,CarIllegal::getId);

          selectAll

          • 查询指定类的全部字段 
          .selectAll(CarIllegalDto.class)

          注意事项:

          • 一般一次查询只建议调用一次selectAll(), 因为不同表之间可能会存在相同的字段, 比如id,create_time等通用字段, 多次调用会导致字段名重复, 除非能保证字段不重复
          • 所以一次查询推荐只使用一次, 并且通常是对主表使用, 其他表字段通过其他方式查询, 比如select, selectAs, selectAsClass等

          selectAs

          • 别名查询&nwww.devze.combsp;
          .selectAs(AttachmentsFile::getId,CarIllegalDto::getCarNo)
          
          //对应sql
          t.id AS carNo

          总结

          以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

          0

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          关注公众号