阅读 52

mybatisplus如何实现多表查询,mybatis多表操作

目录 前言分页查询VO对象ControllerServiceServiceImplMapperXML内容 总结MybatiPlus文档

前言

前段时间看同事的代码,发现他用Layui+MybatisPlus做分页查询做得很规整,认真看了下代码发现这种方式不仅适用于与Layui做分页查询,在任何时候需要多表联查的时候都可以用到。
以下以Layui分页查询作为参考,在实际应用中可以灵活使用。

分页查询VO对象 @Data@AllArgsConstructor@NoArgsConstructorpublic class LayuiData { private Integer code=0; private Long count; private String msg="ok"; private Object data;} Controller

这里的“keyWord”和“registerTime”是后台页面可以查询的字段,也就是普通的参数,可以灵活变通。

@GetMapping("/getClientList")@ResponseBodypublic LayUIResult getAll( @RequestParam(name = "page", required = true, defaultValue = "1") int num, @RequestParam(name = "limit", required = true, defaultValue = "10") int size, String keyWord, String registerTime){ IPage<Map<String, Object>> listPage = clientService.findClientPage(num, size, keyWord,registerTime); //返回总数和数据 return new LayuiData (listPage.getTotal(),listPage.getRecords());} Service IPage<Map<String, Object>> findClientPage(Integer num, Integer size, String keyWord, String registerTime); ServiceImpl

这里的QueryWrapper内的实例是<Map<String, Object>,不是平常的实体类,返回的也是Map。

@Overridepublic IPage<Map<String, Object>> findClientPage(Integer num, Integer size, String keyWord, String registerTime) { //创建QueryWrapper搜索对象,判断参数不为空则传入参数 QueryWrapper<Map<String, Object>> wrapper = new QueryWrapper<>(); if (StringUtils.isNotEmpty(keyWord)) { wrapper.like("c.real_name", keyWord).or().like("c.phone", keyWord); } if (StringUtils.isNotEmpty(registerTime)) { String stime = registerTime.substring(0, 20); String etime = registerTime.substring(22, 41); wrapper.ge("c.register_time", stime).le("c.register_time", etime); } //创建分页对象 Page<Map<String, Object>> page = new Page<>(num, size); return clientMapper.findClientPage(page, wrapper);} Mapper

格式要求,QueryWrapper前面加上@param,括号里的Constants.WRAPPER内容就是"ew",对应xml文件里的ew

IPage<Map<String, Object>> findClientPage(Page<Map<String, Object>> page,@Param(Constants.WRAPPER) QueryWrapper<Map<String, Object>> wrapper); XML内容

重点在于我们用${ew.customSqlSegment}放在sql语句里,它可以直接把我们的wrapper里的查询数据等同于where查询添加进去

<select id="findClientPage" resultType="java.util.Map">SELECT c.id,c.real_name,c.phone,c.`status`,//实现将时间转换成固定格式DATE_FORMAT(c.register_time,'%Y-%m-%d %H:%i:%s') registerTime,SUM(re.money) rechargeMoney, SUM(wi.withdrawal_money) withdrawalMoney,SUM(buy_money) orderMoney,wa.balanceFROM client cLEFT JOIN recharge re ON c.id=re.client_idLEFT JOIN withdrawal wi ON c.id=wi.client_idLEFT JOIN wallet wa ON c.id=wa.client_idLEFT JOIN order_position ord on c.id=ord.client_id//重点是这里会插入wrapper的搜索语句${ew.customSqlSegment}GROUP BY c.id</select> 总结

这种方式相当于在业务层已经做好了参数判断,不用再在xml文件内用“if”标签判断了。
除了在与Layui做分页查询外,在别的需要参数请求的地方也都可以变通的用这种方法,在使用MybatisPlus时使用这种方式可以使代码更简洁,更清晰。
除此之外,在需要多表联查的时候,这种方式是非常适用的。

MybatiPlus文档

官方文档里面也做介绍,版本需要大于3.0.7
官方链接:使用 Wrapper 自定义SQL


文章分类
百科问答
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐