当前位置: 首页 > news >正文

MyBatis-Plus-Join 多表查询的扩展

文章目录

  • 网站
  • 使用方法
    • 安装
    • 使用
    • Lambda形式用法(MPJLambdaWrapper)
      • 简单的连表查询
      • 一对多查询


网站

  • 官方网站:https://mybatisplusjoin.com/
  • Github地址:https://github.com/yulichang/mybatis-plus-join
  • Gitee地址:https://gitee.com/best_handsome/mybatis-plus-join

使用方法

安装

  • Maven

    <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><version>1.4.5</version>
    </dependency>
    
  • Gradle

     implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.5'
    

    或者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 = JoinWrappers.lambda(UserDO.class).selectAll(UserDO.class)//查询user表全部字段.select(UserAddressDO::getTel)//查询user_address tel 字段.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);//连表查询 返回自定义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<>(User.class).selectAll(UserDO.class)//对多查询.selectCollection(AddressDO.class, UesrDTO::getAddressList)//对一查询.selectAssociation(AddressDO.class, UesrDTO::getAddress).leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId);List<UserDTO> dtoList = userMapper.selectJoinList(UserDTO.class, wrapper);//关于对多分页查询//由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。}
}

MPJLambdaWrapper其他功能

  • 一对一,一对多使用
  • 简单的SQL函数使用
  • ON语句多条件支持
  • 其他全部功能请参考使用文档
http://www.lryc.cn/news/100561.html

相关文章:

  • 认清现实重新理解游戏的本质
  • LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难
  • ETHERNET/IP转RS485/RS232网关什么是EtherNet/IP?
  • 使用node内置test runner,和 Jest say 拜拜
  • 《面试1v1》Kafka的架构设计是什么样子
  • 比较常见CPU的区别:Intel、ARM、AMD
  • CAN转EtherNet/IP网关can协议是什么意思
  • java可变字符序列:StringBuffer、StringBuilder
  • Mac/win开发快捷键、vs插件、库源码、开发中的专业名词
  • linux 系统编程
  • Python策略模式介绍、使用方法
  • 城市气象数据可视化:洞察气候变化,构建智慧城市
  • Rust-IO
  • cp -r 源目录 目标目录
  • redis之Bitmap
  • 建设数据中台到底有啥用?
  • [运维|系统] Centos设置本地编码
  • 深入探索Python中的os.listdir函数
  • ROS1ROS2之CmakeList.txt和package.xml用法详解
  • C#设计模式之---适配器模式
  • 串口设备驱动
  • Nginx实现反向代理和负载均衡
  • 小米手机MIUI优化的影响
  • 【图论】kruskal算法
  • Django框架:使用channels实现websocket,配置和项目实际使用
  • 基于RK3588+FPGA+AI算法定制的智慧交通与智能安防解决方案
  • AI面试官:LINQ和Lambda表达式(一)
  • FPGA学习——FPGA利用状态机实现电子锁模拟
  • Bert经典变体学习
  • uniapp checkbox radio 样式修改