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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- Feign的作用是将Http请求抽象化为一个Interface客户端,可以调用接口的形式来执行Http请求,以达到简化Http调用的目的。F
- 打包发布jar包部署相对较为简单,尤其是在分布式服务比较多的情况下。单体项目如果是单体项目,只需要找到maven的插件,点击package运
- 本文主要和大家分享介绍了关于Java JDK * 使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:前言代理是一种常用的
- 一、介绍Properties文件在Java中主要为配置文件,文件类型为:.properties,格式为文本文件,内容格式为"键=值
- 利用Android的ApiDemos的Rotate3dAnimation实现了个图片3D旋转的动画,围绕Y轴进行旋转,还可以实现Z轴的缩放。
- 话不多说,请看代码:<!DOCTYPE html><html><head> <meta
- Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架。 Struts2不只是Struts1下一个版本,它是一个完全重写的Str
- 突然心血来潮,想自己做个小程序玩玩,但是怎么把他做成一个exe文件,让大家能够更好的理解和使用呢,百度了一下,说是需要exe4j来生成,但是
- 在平时的开发中,我们会经常遇到这样一个需求,要在页面通过一个『导出』按钮把查询出的数据导出到 Excel 表格中。本文即为实现上述需求的一个
- 调用SAP WebService服务需要转换操作1、通过浏览器访问SAP WebService地址,进行验证并生成wsdl文件地址并不是可以
- 本文实例讲述了Java基于IO流读取文件的方法。分享给大家供大家参考,具体如下:public static void readFile(){
- 类注解@component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注。@Service 标注类,声明该类为业务层组件,用于处
- 概述:Flutter 标签类控件大全ChipFlutter内置了多个标签类控件,但本质上它们都是同一个控件,只不过是属性参数不同而已,在学习
- 背景最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上
- 在使用struts多模块的,找到一些小技巧和经验,与大家分享一下。 关于多module的配置就不说了,只需要用不同的config
- IOS与网页JS交互随着移动APP的快速迭代开发趋势,越来越多的APP中嵌入了html网页,但在一些大中型APP中,尤其是电商类
- 本文实例讲述了Java获得当前时间前指定几个小时具体时间的方法。分享给大家供大家参考,具体如下:package getBeforeHourD
- Java7引入了Fork Join的概念,来更好的支持并行运算。顾名思义,Fork Join类似与流程语言的分支,合并的概念。也就是说Jav
- 前言之前我们提到了 CustomPaint er 的 Paint 可以使用渐变(GradientShader)来填充绘制的图形,本篇我们来介
- 本文实例为大家分享了Java金额大小写转换的具体代码,供大家参考,具体内容如下/** * @ClassName: NumberConver