MyBatis-Plus-Join (MPJ) 框架介绍
MyBatis-Plus-Join (MPJ) 是一个基于 MyBatis-Plus 的多表关联查询框架,它提供了一种优雅的方式来处理复杂的表关联查询。
主要特性
-
Lambda 式查询
wrapper.selectAs(Teacher::getId, TeacherLeaveVO::getTeacherId).leftJoin(Course.class, Course::getTeacherId, Teacher::getId)
-
自动字段映射
// 自动映射所有字段 wrapper.selectAll(Teacher.class).selectAll(Course.class)
-
灵活的关联方式
// 支持左连接、右连接、内连接 .leftJoin() // 左连接 .rightJoin() // 右连接 .innerJoin() // 内连接
-
分页查询支持
mapper.selectJoinPage(new Page<>(current, size), VO.class, wrapper)
使用步骤
-
添加依赖
<dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join</artifactId><version>1.4.6</version> </dependency>
-
Mapper 继承
@Mapper public interface TeacherMapper extends MPJBaseMapper<Teacher> { }
-
构建查询
MPJLambdaWrapper<Teacher> wrapper = new MPJLambdaWrapper<>(Teacher.class).selectAll(Teacher.class).leftJoin(Course.class, Course::getTeacherId, Teacher::getId);
查询方式对比
传统 MyBatis
<select id="getTeacherLeaves">SELECT t.id, t.name,c.id, c.name,sl.student_id, sl.leave_dateFROM teacher tLEFT JOIN course c ON c.teacher_id = t.idLEFT JOIN student_leave sl ON sl.course_id = c.idWHERE t.id = #{teacherId}
</select>
MPJ 方式
wrapper.selectAll(Teacher.class).selectAll(Course.class).selectAll(StudentLeave.class).leftJoin(Course.class, Course::getTeacherId, Teacher::getId).leftJoin(StudentLeave.class, StudentLeave::getCourseId, Course::getId)
优势
-
类型安全
- 使用 Lambda 表达式,避免字段名拼写错误
- 重构时自动更新关联字段
-
代码简洁
- 无需编写 XML
- 链式调用更直观
-
维护方便
- 统一的查询方式
- 复用查询条件
-
功能完整
- 支持分页
- 支持多表关联
- 支持字段别名
- 支持条件构建
最佳实践
-
抽取公共查询条件
private MPJLambdaWrapper<Teacher> baseWrapper() {return new MPJLambdaWrapper<>(Teacher.class).selectAll(Teacher.class).selectAll(Course.class); }
-
使用 VO 对象映射
@Data public class TeacherLeaveVO {private Long teacherId;private String teacherName;// ... }
-
合理使用字段选择
// 选择特定字段而不是全部 .select(Teacher::getId, Teacher::getName) // 需要所有字段时使用 selectAll .selectAll(Teacher.class)
注意事项
- 字段命名要符合规范,建议使用驼峰命名
- 合理使用表别名避免字段冲突
- 关注查询性能,避免不必要的关联
- 适当使用索引优化查询性能
MPJ 极大地简化了多表关联查询的编写,提高了开发效率,是一个值得使用的 MyBatis-Plus 扩展工具。