java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis-Plus实现多表联查方式

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

作者:慷 慨

文章介绍了MyBatis-Plus-Join插件,一个在MyBatis-Plus基础上增强的工具,支持联表查询而不改变原有代码结构,MPJ插件无侵入性,兼容MyBatis-Plus的多种特性,并支持注解形式的一对一和一对多查询

1、前言

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

2、介绍

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

3、特性

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>

继承

public interface CarIllegalMapper extends MPJBaseMapper<CarIllegal>
{
}
public interface ICarIllegalService  extends MPJBaseService<CarIllegal>{}
@Service
public class CarIllegalServiceImpl extends MPJBaseServiceImpl<CarIllegalMapper, CarIllegal> implements ICarIllegalService
{}

开始使用

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

一对一

说明

leftJoin() 参数说明

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

@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;
}

 查询结果

一对多

  @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分页插件)

import com.baomidou.mybatisplus.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),CarIllegalDto.class,wrapper);
        System.out.println(carIllegalDtoList);
    }

结果

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)

注意事项:

selectAs

.selectAs(AttachmentsFile::getId,CarIllegalDto::getCarNo)

//对应sql
t.id AS carNo

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文