【前后端分离】后台多表联查

  • Post author:
  • Post category:其他




效果:通过输入框中的信息进行查询用户表,设计部门和用户表的联合查询

在这里插入图片描述



业务逻辑

根据页面上几个不同输入框输入的信息,在数据表中查找到对应的数据,类似于按条件查询



项目代码

1 项目原代码

@GetMapping("/findDoctorList")
    public Result findDoctorList(@RequestParam(required = true,defaultValue = "1")Integer current,
                                 @RequestParam(required = true,defaultValue = "6")Integer size){
        //对 用户进行分页,泛型注入的为用户类
        Page<Doctor>page=new Page<>(current,size);
        //此种查询不限查询条件,即全部查询
        Page<Doctor> doctorPage = doctorService.page(page);
        long total = doctorPage.getTotal();
        List<Doctor> records = doctorPage.getRecords();
        return Result.ok().data("total",total).data("records",records);
    }



测试效果(查出全部数据)

在这里插入图片描述

2 使用Mybatisplus自带的条件查询方式进行查询,这里以某种属性作为例子

@GetMapping("/findDList")
    public Result findDList(@RequestParam(required = true,defaultValue = "1")Integer current,
                                 @RequestParam(required = true,defaultValue = "6")Integer size){
        //对 用户进行分页,泛型注入的为用户类
        Page<D>page=new Page<>(current,size);
        LambdaQueryWrapper<D> queryWrapper=new LambdaQueryWrapper<>();
        // 只适用于单表查询 此举含义是将D中的dmentID属性赋值为1,即仅查询dmentID=1的对象
        //但此方法多表联查不好查,只能在单表内进行查询
        queryWrapper.eq(D::getDmentId,1);
        //限制性别属性为1
        queryWrapper.eq(D::getSex,1);
        // 如果以上两条同时限定,则在需要限制同时查出 dment=1和sex=1的用户
        Page<D> dPage = dService.page(page,queryWrapper);
        long total = dPage.getTotal();
        List<D> records = dPage.getRecords();
        return Result.ok().data("total",total).data("records",records);
    }



测试结果(同时限制dment=1和sex=1)

在这里插入图片描述

3 重写

QueryWrapper

方法

通过上述的过程可以看出,当按条件进行查询时,使用的是

LambdaQueryWrapper

的方法,其实直接使用

QueryWrapper

的方式进行查询也可以,只不过QueryWrapper使用的是Entity 对象封装操作类,而LambdaQueryWrapper使用的事Lambda表达式,由于在进行多表联合查询时,需要多个表中的属性字段,所以这里主要介绍使用重写

QueryWrapper

的方法。

  1. 查询SQL语句,在对应实体类的 xml 文件中,编写下面的语句
<!--findDPage与mapper.java种对应的方法一样-->
  <select id="findDPage" resultType="D">
        select u.`id`, `username`, `nickname`, `email`, `avatar`, `phone_number`, `status`,
               u.`create_time`, u.`modified_time`, `sex`, `salt`, `type`, `password`, `birth`,
               `dment_id`, `deleted`,d.name as name
        from d u
        inner join dment d
        on u.dment_id = d.id
        ${ew.customSqlSegment}<!-- 为了配合QueryWrapper中的条件 -->
    </select>

2 Mapper.java 方法

public interface DMapper extends BaseMapper<D> {
    IPage<D> findDPage(Page<D>page,@Param(Constants.WRAPPER) QueryWrapper<D> wrapper);
}

3 Service 方法

public interface DService extends IService<D> {
    IPage<D> findDPage(Page<D> page, @Param(Constants.WRAPPER) QueryWrapper<D> wrapper);
}

4 ServiceImp方法

@Service
public class DServiceImpl extends ServiceImpl<DMapper, D> implements DService {
    @Override
    public IPage<D> findDPage(Page<D> page, QueryWrapper<D> wrapper) {
        return this.baseMapper.findDPage(page,wrapper);
    }
}

5 定义View层对应的ViewObject类,此类别中的属性,对应显示页面需要的查询条件

@Data
public class DVO {
    private String username;
    private String nickname;
    private String email;
    private Integer sex;
    private Long departmentId;
}

在这里插入图片描述

5 Controller 调用

由于前端页面需要查询的数据较多,将其封装在DVO 的json 文件中传递前端到后台的值,注意使用Post方式进行请求,

 @PostMapping("/findDPage")
    public Result findDPage(@RequestParam(required = true,defaultValue = "1")Integer current,
                                 @RequestParam(required = true,defaultValue = "6")Integer size,
                                 @RequestBody DVO dVO){
        //对 用户进行分页,泛型注入的为用户类
        Page<D>page=new Page<>(current,size);
        //LambdaQueryWrapper<D> queryWrapper=new LambdaQueryWrapper<>();
        // 只适用于单表查询 多表联查不好查
        //queryWrapper.eq(D::getDepartmentId,1);
        QueryWrapper<Doctor>queryWrapper=getWapper(dVO);
        IPage<D> dPage = dService.findDPage(page,queryWrapper);
        long total = dPage.getTotal();
        List<D> records = dPage.getRecords();
        return Result.ok().data("total",total).data("records",records);
    }
    private QueryWrapper<D>getWapper(DVO dVO){
        QueryWrapper<D>queryWrapper=new QueryWrapper<>();
        if(dVO!=null){
            if(!StringUtils.isEmpty(dVO.getDepartmentId())){
                queryWrapper.eq("department_id",dVO.getDepartmentId());
            }
            if(!StringUtils.isEmpty(dVO.getUsername())){
                queryWrapper.eq("username",dVO.getUsername());
            }
            if(!StringUtils.isEmpty(dVO.getEmail())){
                queryWrapper.eq("email",dVO.getEmail());
            }
            if(!StringUtils.isEmpty(dVO.getSex())){
                queryWrapper.eq("sex",dVO.getSex());
            }
            if(!StringUtils.isEmpty(dVO.getNickname())){
                queryWrapper.eq("nickname",dVO.getNickname());
            }
        }
        return queryWrapper;
    }



测试(查询成功)

在这里插入图片描述



版权声明:本文为qq_29750461原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。