当前位置:   article > 正文

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

mybatisplus一对多查询

目录

1、前言

2、介绍

3、特性

4、使用

一、引依赖

二、继承 

 三、开始使用

1、一对一

2、一对多 

3、分页查询

5、MPJLambdaWrapper所有方法说明

一、select 

1、select

 2、selectAll

3、 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

  1. <dependency>
  2. <groupId>com.github.yulichang</groupId>
  3. <artifactId>mybatis-plus-join-boot-starter</artifactId>
  4. <version>1.4.7.2</version>
  5. </dependency>

二、继承 

(必须)mapper继承MPJBaseMapper

  1. public interface CarIllegalMapper extends MPJBaseMapper<CarIllegal>
  2. {
  3. }

(可选)service继承MPJBaseService

public interface ICarIllegalService  extends MPJBaseService<CarIllegal>{}

(可选)serviceImpl继承MPJBaseServiceImpl

  1. @Service
  2. public class CarIllegalServiceImpl extends MPJBaseServiceImpl<CarIllegalMapper, CarIllegal> implements ICarIllegalService
  3. {}

 三、开始使用

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

1、一对一

说明

CarIllegalDto.class 查询结果返回类(resultType)
selectAll() 查询指定实体类的全部字段
select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
leftJoin() 参数说明
第一个参数: 参与连表的实体类class
第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性
第三个参数: 参与连表的ON的另一个实体类属性
默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…

selectAssociation()一对一查询

selectCollection()一对多查询

  1. @SpringBootTest(classes = DeXinApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  2. @RunWith(SpringRunner.class)
  3. @Slf4j
  4. class DeXinApplicationTests {
  5. @Autowired
  6. private CarIllegalMapper carIllegalMapper;
  7. @Test
  8. public void testSelect() {
  9. MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
  10. .selectAll(CarIllegalDto.class)
  11. .selectAssociation(AttachmentsFile.class,CarIllegalDto::getAttachmentsFile)
  12. .leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId,CarIllegal::getId);
  13. List<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinList(CarIllegalDto.class,wrapper);
  14. }
  15. }

返回的实体类

  1. @Data
  2. public class CarIllegalDto extends CarIllegal
  3. {
  4. AttachmentsFile attachmentsFile;
  5. List<AttachmentsFile> attachmentsFileList;
  6. }

 查询结果

2、一对多 

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

结果 

3、分页查询

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

  1. import com.baomidou.mybatisplus.core.metadata.IPage;
  2. @Test
  3. public void testSelect() throws IOException {
  4. MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
  5. .selectAll(CarIllegalDto.class)
  6. .selectAs(AttachmentsFile::getId,CarIllegalDto::getCarNo)
  7. .selectCollection(AttachmentsFile.class,CarIllegalDto::getAttachmentsFileList)
  8. .leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId, CarIllegal::getId);
  9. IPage<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinPage(new Page<>(1, 10),CarIllegalDto.class,wrapper);
  10. System.out.println(carIllegalDtoList);
  11. }

结果

 

5、MPJLambdaWrapper所有方法说明

一、select 

1、select

查询指定字段 

select(AttachmentsFile::getName)

支持可变参数

select(AttachmentsFile::getName,AttachmentsFile::getEnterpriseId)

 自定义字符串查询,需要对查询的表命名别名

  1. select("file.id");
  2. select("file.id as 'pid'");
  3. select("file.id", "file.name");
  4. //需要对表进行别名
  5. .leftJoin(AttachmentsFile.class,"file",AttachmentsFile::getTargetId,CarIllegal::getId);

 2、selectAll

查询指定类的全部字段 

.selectAll(CarIllegalDto.class)

注意事项:

一般一次查询只建议调用一次selectAll(), 因为不同表之间可能会存在相同的字段, 比如id,create_time等通用字段, 多次调用会导致字段名重复, 除非能保证字段不重复

所以一次查询推荐只使用一次, 并且通常是对主表使用, 其他表字段通过其他方式查询, 比如select, selectAs, selectAsClass等

3、 selectAs

别名查询 

  1. .selectAs(AttachmentsFile::getId,CarIllegalDto::getCarNo)
  2. //对应sql
  3. t.id AS carNo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/624990
推荐阅读
相关标签
  

闽ICP备14008679号