效果:通过输入框中的信息进行查询用户表,设计部门和用户表的联合查询
业务逻辑
根据页面上几个不同输入框输入的信息,在数据表中查找到对应的数据,类似于按条件查询
项目代码
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
的方法。
- 查询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 版权协议,转载请附上原文出处链接和本声明。