当前位置: 代码网 > it编程>编程语言>Java > MyBatis-Plus实现多表联查方式(一对一,一对多使用)

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

2025年10月15日 Java 我要评论
1、前言在使用mybatis-plus开发需求的时候会发现对于大部分的业务场景来说都会使用到join来进行联表查询,但是mybatis-plus封装的 mapper 不支持 join,如果需要支持就需

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<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…

  • selectassociation()一对一查询
  • 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;
}

 查询结果

一对多

  @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)

注意事项:

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

selectas

  • 别名查询 
.selectas(attachmentsfile::getid,carillegaldto::getcarno)

//对应sql
t.id as carno

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com