MyBatisPlus实现多表查询

在MyBatisPlus中,实现多表查询主要有以下几种方式:

安装:

  • Maven
    
        com.github.yulichang
        mybatis-plus-join-boot-starter
        1.4.12
    

使用:

  • mapper继承MPJBaseMapper (必选)
  • service继承MPJBaseService (可选)
  • serviceImpl继承MPJBaseServiceImpl (可选)

1. 基础联查: MyBatisPlus提供了@TableField注解的el属性来支持简单的联查。例如,在一个实体类中定义另一个实体类的引用,并通过el指定关联字段。

public class User {
    // ...
    @TableField(el = "user_detail.detail_info")
    private String detailInfo;
    // ...
    private UserDetail userDetail;
    // getters and setters...
}

在Mapper接口中直接查询即可。

2. 关联查询: 使用@OneToOne, @OneToMany, @ManyToOne等注解进行一对一、一对多或多对一关联查询。

@Data
public class User {
    // ...
    @OneToOne
    @JoinColumn(name = "detail_id", referencedColumnName = "id")
    private UserDetail userDetail;
    // getters and setters...
}

然后在Service或Mapper中使用QueryWrapper或者LambdaQueryWrapper进行包含关联实体的查询。

3. 自定义SQL查询: 如果上述方式无法满足复杂的需求,可以通过编写自定义SQL语句进行多表查询。

@Select("SELECT u.*, ud.* FROM user u JOIN user_detail ud ON u.id = ud.user_id")
List selectUserWithDetail();

4. 嵌套查询: 利用MyBatisPlus的subquery()方法构造嵌套查询。

QueryWrapper wrapper = new QueryWrapper<>();
wrapper.select("*, (SELECT detail_info FROM user_detail WHERE user_id = id) as detail_info");
List users = userMapper.selectList(wrapper);

5. 链式查询: MyBatisPlus的动态SQL功能强大,可以利用eq, like, join等方法进行链式条件构建和多表查询。

LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.select(User.class, User::getId, User::getName)
      .leftJoin(UserDetail.class, on -> on.eq(User::getId, UserDetail::getUserId))
      .select(UserDetail::getDetailInfo);
List> list = userMapper.selectMaps(wrapper);

你可能感兴趣的:(mysql,后端,java)