mybatis-plus多表联查join的实现
作者:spring-java 发布时间:2023-11-24 06:49:56
标签:mybatis-plus,多表联查
1、安装依赖
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join</artifactId>
<version>1.2.4</version>
</dependency>
2、定义三个基本实体类
2.1 User类
@Data
public class User {
//对应数据库的主键(uuid,自增id,雪花算法,redis,zookper)
@TableId(type = IdType.AUTO)
private Integer id;
@NotNull(message = "名称xxx不能为空")//空校验
@NotBlank //不能为空字符串
@Size(min = 1,max = 5,message = "ssssss")//字符串长度校验
private String name;
// @Min(value = 10,message = "最小值10")
// @Max(value = 90,message = "最大值为99")
@NotNull
// @Max(value = 50,message = "超过最大值")
// @Min(value = 10,message = "超过最小值")
@Range(min=10,max = 99,message = "错误")//数字范围校验
private Integer age;
@NotNull
private String email;
//逻辑删除字段
@TableLogic //逻辑删除注解
private Integer deleted;
//字段添加填充内容
//策略
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDateTime createTime;
//策略
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Integer createBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Integer updateBy;
@Version//乐观锁注解
private Integer version;
}
2.2 UserScore类
@Data
public class UserScore {
@TableId(type = IdType.AUTO)
private long id;
private String course;
private String score;
private Long userId;
}
2.3 UserCourseTeacher类
@Data
public class UserCourseTeacher {
@TableId(type = IdType.AUTO)
private Integer id;
private Long teacher;
private Long userCourseId;
}
3、定义三个mapper
3.1 userMapper
@Repository
@Mapper
public interface UserMapper extends MPJBaseMapper<User> {
}
3.2 UserScoreMapper
@Repository
@Mapper
public interface UserScoreMapper extends MPJBaseMapper<UserScore> {
}
3.3 UserCourseTeacherMapper
@Mapper
@Repository
public interface UserCourseTeacherMapper extends MPJBaseMapper<UserCourseTeacher> {
}
4、定义返回值dto
@Data
public class UserTeacherDto extends User {
private String course;
private String score;
private String teacher;
}
5、开发业务层
例如对应的sql为
select a.*,b.score,b.course,c.teacher from user a left join user_score b on a.id=b.user_id left join user_course_teacher c on b.id=c.user_course_id
则代码为
public List<UserTeacherDto> GetAllUserTeacher(){
MPJLambdaWrapper<User> mPJLambdaWrapper=new MPJLambdaWrapper<User>()
.selectAll(User.class)
.select(UserScore::getScore,UserScore::getCourse)
.select(UserCourseTeacher::getTeacher)
.leftJoin(UserScore.class,UserScore::getUserId,User::getId)
.leftJoin(UserCourseTeacher.class,UserCourseTeacher::getUserCourseId,UserScore::getId);
List<UserTeacherDto> list=userMapper.selectJoinList(UserTeacherDto.class, mPJLambdaWrapper);
return list;
}
6、假如进行分页查询的话
@Override
public Map<String,Object> GetUserDtoByPage(){
Map<String,Object> result=new HashMap<>();
MPJLambdaWrapper<User> mPJLambdaWrapper=new MPJLambdaWrapper<User>()
.selectAll(User.class)
.select(UserScore::getScore,UserScore::getCourse)
.leftJoin(UserScore.class,UserScore::getUserId,User::getId);
IPage<UserDto> UserDtoPage=userMapper.selectJoinPage(
new Page<UserDto>(3,2),
UserDto.class,
mPJLambdaWrapper
);
result.put("list",UserDtoPage.getRecords());
result.put("count",UserDtoPage.getTotal());
return result;
}
7、注意:
selectAll():查询指定实体类的全部字段
select():查询指定的字段,支持可变长参数同时查询多个字段,但是在同一个select中只能查询相同表的字段,所以如果查询多张表的字段需要分开写
selectAs():字段别名查询,用于数据库字段与接收结果的dto中属性名称不一致时转换
leftJoin():左连接,其中第一个参数是参与联表的表对应的实体类,第二个参数是这张表联表的ON字段,第三个参数是参与联表的ON的另一个实体类属性
8、其他
MPJLambdaWrapper<User> mPJLambdaWrapper=new MPJLambdaWrapper<User>()
.selectAll(User.class)
中的User可以理解为主表
leftJoin函数参数顺序依次为:子表的类型、子表的字段(实体类属性)、主表实体类的属性,就是用于on关联的
9、如果针对条件进行动态查询
@Override
public List<UserTeacherDto> GetAllUserTeacher(Map<String,Long> params){
System.out.println("传递参数");
System.out.println(params.get("id"));
MPJLambdaWrapper<User> mPJLambdaWrapper=new MPJLambdaWrapper<User>()
.selectAll(User.class)
.select(UserScore::getScore,UserScore::getCourse)
.select(UserCourseTeacher::getTeacher)
.leftJoin(UserScore.class,UserScore::getUserId,User::getId)
.leftJoin(UserCourseTeacher.class,UserCourseTeacher::getUserCourseId,UserScore::getId);
if(params.get("id")!=null && params.get("id").toString()!=""){
mPJLambdaWrapper.eq(UserScore::getId,params.get("id"));
}
List<UserTeacherDto> list=userMapper.selectJoinList(UserTeacherDto.class, mPJLambdaWrapper);
return list;
}
来源:https://blog.csdn.net/weixin_41463944/article/details/128637068


猜你喜欢
- StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时(ms级别),
- 前言之前因为项目需求,其中使用到了图片的单击显示取消,图片平移缩放功能,昨天突然想再加上图片的旋转功能,在网上看了很多相关的例子,可是没看到
- 概念异常处理的概念起源于早期的编程语言,如 LISP、PL/I 和 CLU。这些编程语言首次引入了异常处理机制,以便在程序执行过程中检测和处
- Java 开发语言中实现HTTP请求的方法主要有两种:一种是JAVA的标准类HttpUrlConnection,比较原生的实现方法;另一种是
- 本文实例为大家分享了android计算器实现加减乘除的具体代码,供大家参考,具体内容如 * :以下计算器只注重实现功能,不考虑其他BUG,只有
- 本文实例讲述了Java模拟死锁发生之演绎哲学家进餐问题。分享给大家供大家参考,具体如下:一 点睛常见的死锁形式:当线程1已经占据资源R1,并
- 本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下先是效果图:主菜单:游戏:设置:错误处理:代码:#include
- 一、场景Android项目的开发过程中,我们项目中的gradle的dependencies闭包中会引入很多三方依赖库,引入的库越多,越容易产
- 依赖 <dependency> <gro
- 缘起随着 App 的成长,我们难免会遇到以下这些需求:H5 跳原生界面Notification 点击调相关界面根据后台返回数据跳转界面,例如
- 使用注解开发在Spring4之后,要使用注解开发,必须要保证aop的包导入了使用注解需要导入context的约束,增加注解的支持<?x
- 1. web.xml中配置了CharacterEncodingFilter,配置这个是拦截所有的资源并设置好编号格式。encoding设置成
- 本文实例为大家分享了java实现鲜花销售系统的具体代码,供大家参考,具体内容如下一、练习目标1.体会数组的作用2.找到分层开发的感觉3.收获
- Unsafe类介绍第一次看到这个类时被它的名字吓到了,居然还有一个类自名Unsafe?读完本文,大家也能发现Unsafe类确实有点不那么安全
- 本文章向大家讲解java中时间的获取和格式化, 一. 获取当前系统时间和日期并格式化输出:import java.util.Dat
- 前言在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败。调用远程服务失败。争抢锁失败。这些错误可能是因为网络波动造成的,等待过后重
- OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作。下面我们用OkHttp来下载文件
- EditText和TextView一样,也可以进行图文混排。所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示
- 每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联。Handler一般有两种用途:1)执行计划任务,
- 为了演示光照效果,在前面学习过的内容基础上我们首先创建一个立方体,同时为了看起来直观一些,这个立方体每个面采用中心为白色,周围红色的渐变方案