在MyBatisPlus中,实现多表查询主要有以下几种方式:
安装:
- Maven
<dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join-boot-starter</artifactId> <version>1.4.12</version> </dependency>
使用:
- 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<User> selectUserWithDetail();
4. 嵌套查询: 利用MyBatisPlus的subquery()方法构造嵌套查询。
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("*, (SELECT detail_info FROM user_detail WHERE user_id = id) as detail_info");
List<User> users = userMapper.selectList(wrapper);
5. 链式查询: MyBatisPlus的动态SQL功能强大,可以利用eq, like, join等方法进行链式条件构建和多表查询。
LambdaQueryWrapper<User> 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<Map<String, Object>> list = userMapper.selectMaps(wrapper);