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>
    

    或者clone代码到本地执行 mvn install, 再引入以上依赖

    注意: mybatis plus version 3.3.0+

使用

  • mapper继承MPJBaseMapper (必选)
  • service继承MPJBaseService (可选)
  • serviceImpl继承MPJBaseServiceImpl (可选)

一对多查询

class test {@Resourceprivate UserMapper userMapper;@Testvoid testResultMap() {MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>().selectAll(UserDO.class)//一对多查询.selectCollection(AddressDO.class, UesrDTO::getAddressList)//一对一查询//.selectAssociation(AddressDO.class, UesrDTO::getAddress).leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId).eq(UserDO::getId, 1).like(UserAddressDO::getTel, "1").gt(UserDO::getId, 5);//关联查询List<UserDTO> dtoList = userMapper.selectJoinList(UserDTO.class, wrapper);//分页查询 (这个方法需要启用 mybatis plus 分页插件,或者用PageHelper调用上面那个方法)Page<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(2, 10), 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语句多条件支持

Lambda形式用法(MPJLambdaWrapper)

简单的连表查询

class test {@Resourceprivate UserMapper userMapper;void testJoin() {MPJLambdaWrapper 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);//连表查询List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);//分页查询 (这个方法需要启用 mybatis plus 分页插件,或者用PageHelper调用上面那个方法)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注入风险

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 一对一 、一对多映射相关推荐

  1. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  2. MyBatis 的一对一,多对多

    一.概述 MyBatis 的一对一.多对多,主要就是 resultMap 两个属性的使用,而一对多和多对一都是相互的,只是站的角度不同: [一对多]association:一个复杂的类型关联.许多结果 ...

  3. mybatis generator一对一映射,一对多映射,批量插入,批量更新

    mybatis-generator这是原来的github地址 现在在此基础上添加了一对一和一对多映射配置,配置在table标签上 如果需要一对一配置生成,需要添加插件配置 在context中添加如下配 ...

  4. mybatis进阶--一对一查询

    所谓的一对一查询,就是说我们在查询一个表的数据的时候,需要关联查询其他表的数据. 需求 首先说一个使用一对一查询的小需求吧:假设我们在查询某一个订单的信息的时候,需要关联查询出创建这个订单对应的用户信 ...

  5. 【mybatis】一对一关联查询

    mybatis: 一对一关联查询 注意 代码部分 实体类(extity) mybatis mapper service controller 注意 在.xml文件编写中有报错,The content ...

  6. MyBatis级联一对一与一对多

    1.概述 在一个人申请某些账号或者权限的时候,比如微信的认证流程. 会让你一步一步按要求输入,比如第一步:点击微信认证,第二步:认证联系人信息填写:最后一步:填写公众号名称.功能介绍.选择运营地区就. ...

  7. mybatis映射 一对一、一对多、多对多高级映射

    1.数据库执行脚本 创建数据库表代码:   1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(3 ...

  8. Mybatis的一对一查询以及延迟加载

    一对一的关联查询: 使用业务扩展类 使用ResultMap 表如下 create table student(sid int(11) primary key not null, sname varch ...

  9. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

最新文章

  1. 宿主机虚拟机文件复制 apt-get 换成yum
  2. C#中静态方法的运用和字符串的常用方法(seventh day)
  3. 计算机平均数的函数,Excel2010
  4. 深入Java虚拟机——类型装载、连接(转)
  5. MDT2010新功能(15)——完成部署后操作
  6. STL - Unorderedset - 自定义哈希函数
  7. c primer plus 第6版 中文版pdf_内功实力再精进 试驾上汽大通V80 PLUS城市版_搜狐汽车...
  8. 工作383-获取页面的宽度
  9. 前端学习(1750):前端调试值之call stack
  10. c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现
  11. leetcode-453-Minimum Moves to Equal Array Elements
  12. [转载] Python List index方法
  13. wpf 如何实现窗口浮动_如何实现工作表数据与UserForm窗口的交互,显示第一条记录...
  14. Leetcode 304.二维区域和检索-矩阵不可变
  15. CSDN如何修改id号
  16. Qt点击按钮两次才弹出菜单如何解决
  17. 用火箭送快递?淘宝宣布联合蓝箭航天起启动“宝箭”计划...
  18. PAT 考试是什么?
  19. 基于Python的指数基金量化投资 - 指数的市盈率和市净率计算
  20. 英语四级口语考试计算机考吗,英语四级口试必须考吗 不考会怎样

热门文章

  1. 为什么amd显卡便宜却买的人少_买完3080都喊亏!AMD的新显卡用价格砸懵了所有人。。。...
  2. 计算机开启蓝牙网络,电脑蓝牙怎么开?
  3. Win10操作系统找不到已输入的环境选项解决方案
  4. PPT 下载 | 神策数据桑文锋:面向数据流的产品迭代及业务闭环
  5. 【硬件】电源选购解读手册
  6. Cookies 剪影 光照系列7
  7. 被吸并无果,启迪环境何去何从?新管理层亮相首秀了什么?
  8. 蓝桥冲刺31天之316
  9. S3C2440时钟体系结构与编程
  10. 教你怎样把在网上看到的视频下到电脑上