MybatisPlus联合查询
目录
- 1、什么是Mybatis-plus-join?
- 2、下载Mybatis-plus-join
- 3、离线版请使用Maven将其打包成jar包
- 3.1、使用idea打包
- 4.项目中引用Mybatis-plus-join的pom.xml配置
- 5、在业务中使用mybatis-plus-join的准备
- 使用
- 核心类 MPJLambdaWrapper和MPJQueryWrapper
- MPJLambdaWrapper用法
- MPJLambdaWrapper示例
- 简单的3表查询
- 分页查询
- MPJQueryWrapper
- 简单的3表查询
- 分页查询
- 还可以这么操作,但不建议
- 6、mybatis-plus-join更多使用方法请参看Gitee
1、什么是Mybatis-plus-join?
- 对Mybatis-plus进行功能升级 ,提高开发效率;
- 使用方法与Mybatis-plus一样 ,学习成本低;
- 增加了 多表连接查询 功能,摆脱xml模式多表连接;
2、下载Mybatis-plus-join
Mybatis-plus-join目前(2021-05-08)发布在Gitee上,直接将其克隆/下载到本地即可:
下载地址: Mybatis-plus-join源码地址.
注意:需要 Mybatis-plus version >= 3.4.0
下载结果如图:
3、离线版请使用Maven将其打包成jar包
3.1、使用idea打包
1.按照下图进行打包操作
2.打包成功后,jar包存在的目录,找到jar包并复制到自己的项目中:
3.将打出来的jar包引入工程模块中,步骤如图(如果跳出版本问题,则点击更新即可):
4.项目中引用Mybatis-plus-join的pom.xml配置
在pom.xml中引入该依赖:
<!--mybatis-plus-join--><dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join</artifactId><version>1.1.6</version></dependency>
123456
引入效果(检查时提示更新就更新部分环境即可)
5、在业务中使用mybatis-plus-join的准备
使用
- mapper继承MPJBaseMapper (必选)
- service继承MPJBaseService (可选)
- serviceImpl继承MPJBaseServiceImpl (可选)
- MPJBaseMapper继承BaseMapper,在原有的方法基础上又添加了以下方法:
- selectJoinOne 连表查询一条记录对象
- selectJoinList 连表查询返回命中记录对象集合
- selectJoinPage 连表分页查询对象集合
- selectJoinMap 连表查询一条记录返回Map
- selectJoinMaps 连表查询返回命中记录Map集合
- selectJoinMapsPage 连表分页查询返回Map集合
- MPJBaseService 继承了IService,同样添加以上方法
- MPJBaseServiceImpl 继承了ServiceImpl,同样添加了以上方法
核心类 MPJLambdaWrapper和MPJQueryWrapper
MPJLambdaWrapper用法
MPJLambdaWrapper示例
简单的3表查询
class test {@Resourceprivate UserMapper userMapper;void testJoin() {List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,new MPJLambdaWrapper<UserDO>().selectAll(UserDO.class).select(UserAddressDO::getTel).selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress).select(AreaDO::getProvince, AreaDO::getCity).leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId).leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId).eq(UserDO::getId, 1).like(UserAddressDO::getTel, "1").gt(UserDO::getId, 5));}
}
对应sql
SELECT t.id,t.name,t.sex,t.head_img,t1.tel,t1.address AS userAddress,t2.province,t2.city
FROM user t LEFT JOIN user_address t1 ON t1.user_id = t.id LEFT JOIN area t2 ON t2.id = t1.area_id
WHERE (t.id = ? AND t1.tel LIKE ? AND t.id > ?)
说明:
- UserDTO.class 查询结果返回类(resultType)
- selectAll() 查询指定实体类的全部字段
- select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
故将UserAddressDO和AreaDO分开为两个select() - selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
- leftJoin() 参数说明
第一个参数: 参与连表的实体类class
第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性
第三个参数: 参与连表的ON的另一个实体类属性 - 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
- 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
分页查询
class test {@Resourceprivate UserMapper userMapper;void testJoin() {IPage<UserDTO> iPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class,new MPJLambdaWrapper<UserDO>().selectAll(UserDO.class).select(UserAddressDO::getTel).selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress).select(AreaDO::getProvince, AreaDO::getCity).leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId).leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId));}
}
对应sql
SELECT t.id,t.name,t.sex,t.head_img,t1.tel,t1.address AS userAddress,t2.province,t2.city
FROM user tLEFT JOIN user_address t1 ON t1.user_id = t.idLEFT JOIN area t2 ON t2.id = t1.area_id
LIMIT ?,?
MPJQueryWrapper
简单的3表查询
class test {@Resourceprivate UserMapper userMapper;void testJoin() {List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,new MPJQueryWrapper<UserDO>().selectAll(UserDO.class).select("addr.tel", "addr.address", "a.province").leftJoin("user_address addr on t.id = addr.user_id").rightJoin("area a on addr.area_id = a.id").like("addr.tel", "1").le("a.province", "1"));}
}
对应sql
SELECT t.id,t.name,t.sex,t.head_img,addr.tel,addr.address,a.province
FROM user tLEFT JOIN user_address addr on t.id = addr.user_idRIGHT JOIN area a on addr.area_id = a.id
WHERE (addr.tel LIKE ?AND a.province <= ?)
说明:
- UserDTO.class 查询结果类(resultType)
- selectAll(UserDO.class) 查询主表全部字段(主表实体类)默认主表别名 “t”
- select() mp的select策略是覆盖,以最后一次为准,这里的策略是追加,可以一直select
主表字段可以用lambda,会自动添加表别名,主表别名默认是 t ,非主表字段必须带别名查询 - leftJoin() rightJoin() innerJoin() 传sql片段 格式 (表 + 别名 + 关联条件)
- 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
分页查询
class test {@Resourceprivate UserMapper userMapper;void testJoin() {IPage<UserDTO> page = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class,new MPJQueryWrapper<UserDO>().selectAll(UserDO.class).select("addr.tel", "addr.address").select("a.province").leftJoin("user_address addr on t.id = addr.user_id").rightJoin("area a on addr.area_id = a.id"));}
}
对应sql
SELECT t.id,t.name,t.sex,t.head_img,addr.tel,addr.address,a.province
FROM user tLEFT JOIN user_address addr on t.id = addr.user_idRIGHT JOIN area a on addr.area_id = a.id
LIMIT ?,?
还可以这么操作,但不建议
class test {@Resourceprivate UserMapper userMapper;void testJoin() {List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,new MPJQueryWrapper<UserDO>().selectAll(UserDO.class).select("addr.tel", "addr.address")//行列转换.select("CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex")//求和函数.select("sum(a.province) AS province")//自定义数据集.leftJoin("(select * from user_address) addr on t.id = addr.user_id").rightJoin("area a on addr.area_id = a.id").like("addr.tel", "1").le("a.province", "1").orderByDesc("addr.id"));}
}
对应sql
SELECT t.id,t.name,t.sex,t.head_img,addr.tel,addr.address,CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex,sum(a.province) AS province
FROM user tLEFT JOIN (select * from user_address) addr on t.id = addr.user_idRIGHT JOIN area a on addr.area_id = a.id
WHERE (addr.tel LIKE ?AND a.province <= ?)
ORDER BYaddr.id DESC
6、mybatis-plus-join更多使用方法请参看Gitee
链接: mybatis-plus-join更多使用方法.
MybatisPlus联合查询相关推荐
- MyBatisPlus + Oracle 联合查询排序问题整理,2021 年最后一篇
背景 2021 年说话间就要过期了,今年干的几件事情有: 年初调研了三个任务调度框架. 4 月到 9 月参与了一个产品的开发,SpringCloud + React ,基本掌握了微服务的知识,也熟悉了 ...
- java 联合查询取值_mybatisPlus多表联合查询
包邮abaqus分析用户卷基础知识手册 131.97元 (需用券) 去购买 > //实体类package com.sk.skkill.entity; import com.baomidou.my ...
- java四表联合查询_mybatis Plus 多表联合查询
//实体类package com.sk.skkill.entity; import com.baomidou.mybatisplus.annotation.TableField; import com ...
- Jeecg-多表联合查询
需求 Jeecg提供的生成工具满足了最普遍的代码功能,也将代码最简化,但在业务处理中常出现多表联合查询的需求,比如两表条件联合查询,而mybatis-plus框架使用的QueryWrapper显然无法 ...
- jeecgboot多表联合查询
在数据大屏中需要多表联合查询的业务处理,而Jeecgboot提供的生成工具只能满足最普遍的简单代码,mybatis-plus框架使用的QueryWrapper显然无法满足多表联合查询,需要重写API接 ...
- oracle主从关系表查询,Oracle 主从表联合查询解决方法
Oracle 主从表联合查询 表A id type name 1 E AA 2 F 表B id Aid name 1 2 BB 2 2 ...
- ormlite 多表联合查询
ormlite 多表联合查询 QueryBuilder shopBrandQueryBuilder = shopBrandDao.queryBuilder(); QueryBuilder shopQu ...
- iphone8p百度云认证_探秘百度数据工厂Pingo的多存储后端数据联合查询技术
作者介绍:张志宏,2013年加入百度大数据部,曾作为核心成员参与百度大数据平台的搭建.目前是百度数据工厂Pingo核心团队的技术负责人. Pingo是来自百度的离线大数据集成开发平台,使用Spark作 ...
- mysql联合查询查询语句_mysql 各种联合查询语句
简单的介绍了各种联合查询语句的用法,有inner join ,join left等多表联合查询,有需要的朋友可以参考一下. INNER JOIN(等值连接) 只返回两个表中联结字段相等的行 LEFT ...
- MySQL中的联合查询
联合查询 联合查询:union,将多次查询(多条select语句)的结果,在字段数相同的情况下,在记录的层次上进行拼接. 联合查询由多条select语句构成,每条select语句获取的字段数相同,但与 ...
最新文章
- 随机位置显示图片不重叠前端实现详细讲解附效果图,代码可直接使用
- jquery easyui 动态绑定数据列
- linux安装java_linux中替换系统自带的OpenJDK
- 如何让 Timer 在特定时间点触发?
- WordPress窗体化侧边栏
- 渔翁服务器密码机的环境配置
- qt中设置控件不能使用
- c/c++ 求字符数组长度(非所占内存大小)
- 野生前端的数据结构基础练习(8)——图
- 问题六十六:怎么用ray tracing画CSG(Constructive Solid Geometry 构造实体几何)图形
- JAVA 下载Word文档
- ASP类计算机专业毕业设计题目
- 代码合规性:开发人员使用Helix QAC的5大原因
- sql 树形 子节点获取最顶级的节点
- 各种数据库中的dual表
- audio播放器进度条
- greedy算法策略高效求解分数背包问题
- 百度地图小区边界爬取
- PromeS unhandledRejection
- 水晶报表打印s删除数据
热门文章
- 基于STM32电压检测和电流检测
- Android实战简易教程五(ListView用法研究)
- 双目测距算法matlab模拟,基于BM算法的双目测距.pdf
- 如何更改Eclipse中Properties文件编码格式
- 五险一金 | 2020年企业社保缴费为零问题
- 计算机开关机命令,电脑定时关机命令取消以及开启方法介绍
- 电脑在指定时间关机的指令代码
- 深刻分析有效值与均方根
- React中ref的三种获取方式
- linux 下svn: E175002: 方法 REPORT 失败于 “/svn/GameSvn/!svn/me”: 不能读块分割符: 安全连接切断 (https://192.168.0.88)