MyBatis-Plus连表查询

MyBatis-Plus-Join(简称 MPJ)是一个 MyBatis-Plus 的增强工具,它在 MyBatis-Plus 的基础上提供增强功能,以简化开发并提高效率。

核心特性

  • 无侵入:引入 MPJ 不会对现有工程产生影响,只提供增强功能,顺畅无缝
  • 无感引入:支持 MP 风格的查询,无需额外学习成本
  • 兼容 MP 的别名、逻辑删除、枚举列、TypeHandle 等特性
  • 支持注解形式的一对一、一对多和连表查询

连表查询

以 APP 模块的用户文章收藏表 app_article_collect 和文章表 app_article 为例,查询用户收藏列表时,需要关联显示对应的文章标题。

表结构

表结构示意图

连表查询示例

@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
public R getAppArticleCollectPage(@ParameterObject Page page) {
    MPJLambdaWrapper<AppArticleCollectEntity> wrapper = new MPJLambdaWrapper<AppArticleCollectEntity>()
            .selectAll(AppArticleCollectEntity.class)
            .select(AppArticleEntity::getTitle)
            .leftJoin(AppArticleEntity.class, AppArticleEntity::getId, AppArticleCollectEntity::getArticleId)
            .eq(AppArticleCollectEntity::getUserId, SecurityUtils.getUser().getId());
    return R.ok(appArticleCollectService.selectJoinListPage(page, AppArticleCollectEntity.class, wrapper));
}

执行的 SQL

自动生成的 SQL 如下:

SELECT
	t.id,
	t.user_id,
	t.article_id,
	t.create_by,
	t.create_time,
	t.update_by,
	t.update_time,
	t.del_flag,
	t1.title
FROM
	app_article_collect t
	LEFT JOIN app_article t1 ON t1.id = t.article_id
	AND t1.tenant_id = 1
WHERE
	t.del_flag = '0'
	AND t1.del_flag = '0'
	AND ( t.user_id = 1 )
	AND t.tenant_id = 1
	LIMIT 10
SQL生成说明

MPJ 自动处理了租户隔离、逻辑删除等特性,生成的 SQL 包含了必要的过滤条件。

进阶使用

请参考 mybatisplusjoin 官方文档