MyBatis Plus 如何实现连表查询 mybatis plus join
mybatis-plus-join
项目地址
gitee
github
使用方法
安装
- Maven
<dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><version>1.4.4</version> </dependency>
- Gradle
implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.4'
或者clone代码到本地执行 mvn install, 再引入以上依赖
注意: mybatis plus version 3.3.0+
使用
- mapper继承MPJBaseMapper (必选)
- service继承MPJBaseService (可选)
- serviceImpl继承MPJBaseServiceImpl (可选)
Lambda形式用法(MPJLambdaWrapper)
简单的连表查询
class test {@Resourceprivate UserMapper userMapper;void testJoin() {//和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>().selectAll(UserDO.class)//查询user表全部字段.select(UserAddressDO::getTel)//查询user_address tel 字段.selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)//别名 t.address AS userAddress.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);//连表查询 返回自定义ResultTypeList<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);//分页查询 (需要启用 mybatis plus 分页插件)Page<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class, wrapper);}
}
对应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只能查询相同表的字段
- selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
- leftJoin() 参数说明
第一个参数: 参与连表的实体类class
第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性
第三个参数: 参与连表的ON的另一个实体类属性 - 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
- 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
一对多查询
class test {@Resourceprivate UserMapper userMapper;@Testvoid testResultMap() {MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>().selectAll(UserDO.class)//一对多查询.selectCollection(AddressDO.class, UesrDTO::getAddressList).leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId);List<UserDTO> dtoList = userMapper.selectJoinList(UserDTO.class, wrapper);}
}
等效于ResultMap
<resultMap id="xxxxxxxx" type="com.github.yulichang.join.dto.UserDTO"><result property="id" column="id"/><result property="name" column="name"/><!--其他属性省略--><collection property="addressList" javaType="java.util.List"ofType="com.github.yulichang.join.entity.UserAddressDO"><id property="id" column="mpj_id"/><result property="address" column="address"/><result property="userId" column="user_id"/><!--其他属性省略--></collection>
</resultMap>
MPJLambdaWrapper其他功能
- 一对一,一对多使用
- 简单的SQL函数使用
- ON语句多条件支持
String形式用法(MPJQueryWrapper)
简单的连表查询
class test {@Resourceprivate UserMapper userMapper;void testJoin() {MPJQueryWrapper wrapper = 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");//列表查询List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);//分页查询 (需要启用 mybatis plus 分页插件)List<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, wrapper);}
}
对应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() {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
wiki
MyBatis Plus 如何实现连表查询 mybatis plus join相关推荐
- Mybatis源码分析--关联表查询及延迟加载原理(二)
在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...
- Mybatis入门:4(多表查询操作)
多表查询操作 Mybatis的多表操作 表之间的关系有几种:一对多.一对一.多对一.多对多 举例: 用户和订单就是一对多--一个用户可以下多个订单 订单和用户就是多对一--多个订单属于同一个用户 人和 ...
- SpringBoot+MyBatis 基于xml实现多表查询的两种方式
1.创建SpringBoot项目,导入依赖 <dependencies><dependency><groupId>org.springframework.boot& ...
- SQL多表查询:SQL JOIN连接查询各种用法总结
在实际应用中,大多的查询都是需要多表连接查询的,但很多初学SQL的小伙伴总对各种JOIN有些迷糊.回想一下,初期很长一段时间,我常用的似乎也就是等值连接 WHERE 后面加等号,对各种JOIN也是不求 ...
- php tp5的联表查询,Thinkphp使用join联表查询的方法
本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...
- 数据库多表查询 myBatis四表联查
查询目标 user表 role表 角色和菜单的关系 menu表 funs表(功能) 表和表的关系 1.user对role 是多对一role对user是一对多即一个user对应一个role 一个role ...
- Mybatis(1)---入门篇单表查询
1.Mybatis介绍 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- Mybatis(14)多表查询
准备工作 新建项目day03_eesy_03one2many复制day03_eesy_02dynamicSQL项目 1.账户表创建 CREATE TABLE `account` (`ID` INT(1 ...
- oracle 连多表查询语句,Oracle join多表查询
join(连接)是一个查询,它将来自两个或多个表.视图的数据组合在一起. 我通过一些示例来向大家介绍join的常用方法. 一.生成测试数据 1.创建超女基本信息历史表(T_GIRL_HIS) crea ...
最新文章
- 企业工作流程化重要吗?
- xss实例-输出在script/script之间的情况
- php输出下划线,使用php GD库输出带下划线文本的图像
- Spring @Conditional
- 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子)
- TCP/IP协议网络模型
- 6.4. Pirum is a simple PEAR Channel Server Manager
- python中tkinter模块_Python模块:tkinter
- 鸿蒙开发工具下载设置Mac
- 上反对下反对推理图_判断推理解题技巧:下反对关系的秒选技巧
- GB与CE标准对照表-转载
- Email,电子邮箱免费注册流程
- 文本数据挖掘----初识数据挖掘
- 高级程序员的思维模式
- AmbientOcclusion(AO)
- 计算机word快捷方式,右键-新建-WORD等快捷方式丢失了怎么找回?
- Mathorcup数学建模竞赛第六届-【妈妈杯】B题:车位分布的优化设计与评价(附一等奖获奖论文和matlab代码)
- VRF虚拟路由转发实例说明
- pycharm安装pip
- Ubuntu卸载python3.6
热门文章
- Elasticsearch8.0版本中Elasticsearch Java API Client客户端的基本使用方法
- Java JDBC | 四种连接数据库的方法
- html5支持的几种音频格式介绍
- 华为OD机试用Python实现 -【MVP 争夺战】(2023-Q1 新题)
- httprunner3、pytest、allure资料整理合集
- Catch2库下载安装
- cocos2dx掼蛋_精通Cocos2d-x游戏开发(进阶卷) (王永宝著) 完整pdf扫描版[98MB]
- Redis缓存三大问题
- VUE3 v-if 与v-show用法
- 气传导耳机哪家好、气传导耳机品牌推荐