MybatisPlus实现条件查询(多表联查并实现分页)

Wrapper类的继承

   关于this.page方法的解析

        在baomidou包中,IService类中定义的page方法用于实现分页查询功能。这个方法是用来从数据库中获取数据,并进行分页处理。具体来说,page方法通常会接收分页参数(如当前页码、每页记录数)以及查询条件作为参数,然后调用BaseMapper中的selectPage方法来执行分页查询。

        我们在使用this.page方法时(我使用的是方法二)可以看到里面传入了两个参数,分别是page和queryWrapper

Ctrl+该属性查看详细方法

可以看到里面定义的具体内容

        在 MyBatis-Plus 的 IService 接口中,this.getBaseMapper() 方法是用于获取当前 Service 对应的 Mapper 对象。这个 Mapper 对象提供了对数据库表的 CRUD(创建、读取、更新、删除)操作方法,包括例如 selectPage、insert、update、delete 等。

        在该代码中,this.getBaseMapper().selectPage(page, queryWrapper) 表示通过当前 Service 对应的 Mapper 对象进行分页查询操作,并将分页查询的结果返回。

我们继续点击selectPage查看,跳转到了BaseMapper类中

        在BaseMapper中,selectPage方法的作用是执行分页查询操作。它会根据传入的分页参数和查询条件,使用数据库提供的分页查询语句(如MySQL中的limit语句)来从数据库中获取数据,然后将结果返回给IService中的page方法。

下面是一段测试代码,放在对应测试路径下的测试类中

    @Autowired
    private BreakInfoDao breakInfoDao;


    @Test
    void testGetByPage(){
        //模拟前端传入的page属性,第1页,每页10条数据
        //注意这里的泛型接口必须加上实体类 不然可能会出现类型转换异常
        IPage<BreakInfoEntity> page = new Page<>(1,10);

        LambdaQueryWrapper<BreakInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
//        设置其他查询条件(可选),这里不做演示

//        调用selectPage方法进行分页查询,调用后使用alt+enter即可引入对应类(IPage)接收
        IPage<BreakInfoEntity> result = breakInfoDao.selectPage(page, queryWrapper.select());

        // 获取分页查询结果
        List<BreakInfoEntity> breakInfoList = result.getRecords();
        for (BreakInfoEntity breakInfo : breakInfoList) {
            // 对查询结果进行处理
            System.out.println("查询到的数据:" + breakInfo); // 做一些操作
        }
        //  也可以使用下方的方法查询对应内容
        System.out.println("当前页码值:"+ result.getCurrent());
        System.out.println("每页显示数:"+result.getSize());
        System.out.println("一共多少页:"+result.getPages());
        System.out.println("一共多少条数据:"+result.getTotal());
        System.out.println("数据:"+result.getRecords());
    }

        我们在调用selectPage方法时,可以看到传入了两个参数,一个是page属性,另一个属性是一个queryWrapper的实体类,也就是我们查询的数据表

点击Ctrl+selectpage 可以查看它定义的方法内容 该方法位于BaseMapper中         总的来说,IService中的page方法负责接收分页参数和查询条件,然后调用BaseMapper中的selectPage方法来执行分页查询操作,最终将查询结果返回给调用方。

一对一数据表查询多条数据

sql字段

实体类entity

info表和setting表,需要在查询时将setting表的所有数据都传入info表

通过@TableField(exist = false)来定义setting表的对应字段

@Data
@TableName("break_info")
public class BreakInfoEntity {
//    故障信息表主键
    @TableId
    private Long infoId;
//    故障设置表id
    private Long settingId;
//    处理结果
    private String result;
//    报警时间
    private Date alertTime;
//    处理时间
    private Date handlingTime;
//    逻辑删除
    @TableLogic(value = "0", delval = "1")
    private String isDelete;


//    关联需要链接的数据 通过设置TableField为false,可以在数据库封装到实体类时,并不封装该值为false的属性
//    故障条件
    @TableField(exist = false)
    private String warningCondition;
//    故障类型
    @TableField(exist = false)
    private String alertType;
//    故障信息
    @TableField(exist = false)
    private String alertMessage;
//    故障解除信息
    @TableField(exist = false)
    private String relieveMsg;
//    设备id
    @TableField(exist = false)
    private String devId;
//    处理人
    @TableField(exist = false)
    private String handler;


    public void setBreakSettinginformation(BreakSettingEntity settingEntity){
//        根据定义的形参,分别用get
        this.warningCondition = settingEntity.getWarningCondition();
        this.alertType = settingEntity.getAlertType();
        this.alertMessage = settingEntity.getAlertMessage();
        this.relieveMsg = settingEntity.getRelieveMsg();
        this.devId = settingEntity.getDevId();
        this.handler = settingEntity.getHandler();
    }
}
@Data
@TableName("break_setting")
public class BreakSettingEntity {
    //    故障设置表id
    @TableId
    private Long settingId;
    //    故障条件
    private String warningCondition;
    //    故障类型
    private String alertType;
    //    故障信息
    private String alertMessage;
    //    故障解除信息
    private String relieveMsg;
    //    设备id
    private String devId;
    //    处理人
    private String handler;
    //    逻辑删除
    @TableLogic(value = "0", delval = "1")
    private String isDelete;
}
Dao
@Mapper
public interface BreakInfoDao extends BaseMapper<BreakInfoEntity> {

}
@Mapper
public interface BreakSettingDao extends BaseMapper<BreakSettingEntity> {

}
Service
@Service("breakInfoService")
public interface BreakInfoService extends IService<BreakInfoEntity> {

    //    连表查询和条件查询
    PageUtils selsctListToEq(Map<String, Object> params);

}
@Service("breakInfoService")
public class BreakInfoServiceImpl extends ServiceImpl<BreakInfoDao, BreakInfoEntity> implements BreakInfoService {

//故障报警信息记录的dao
    @Autowired
    private BreakInfoDao breakInfoDao;
//故障设置dao
    @Autowired
    private BreakSettingDao breakSettingDao;

    @Override
    public PageUtils selsctListToEq(Map<String, Object> params) {
//获取前端传入的条件,这里按处理结果来查询
        String result = (String) params.get("result");

//        新建一个LambdaQueryWrapper类来接收数据,封装的类型为settingshitil
        LambdaQueryWrapper<BreakSettingEntity> queryWrapper = new LambdaQueryWrapper<>();
//将设置表中需要的信息都查询出来,使用该方式可以选择性的查看我们需要的数据
        queryWrapper.select(
                BreakSettingEntity::getSettingId,
                BreakSettingEntity::getDevId,
                BreakSettingEntity::getAlertType,
                BreakSettingEntity::getWarningCondition,
                BreakSettingEntity::getAlertMessage,
                BreakSettingEntity::getRelieveMsg,
                BreakSettingEntity::getHandler);
//        将查询结果放入list
        List<BreakSettingEntity> settingEntities = breakSettingDao.selectList(queryWrapper);

//        System.out.println("getSetting1获取到的数据为"+settingEntities);


        //        将数据封装到map让类型id为key,实体类BreakSettingEntity为value
        HashMap<Long, BreakSettingEntity> setMap = new HashMap<>();

        settingEntities.forEach(x-> {
            setMap.put(x.getSettingId(),x);
        });

//        System.out.println("将setting数据表放入setMap后的数据为:"+setMap);
//        System.out.println("setMap里的get方法获取指定id的属性"+setMap.get(101l));


        QueryWrapper<BreakInfoEntity> queryWrapper1=new QueryWrapper<>();

/**在使用this.page时加入条件查询**/
        //使用this.page传入分页参数,在第二个参数传入queryWrapper类
        //在传入第二个参数时,可以直接加入传入查询条件,如eq,like等等
        IPage<BreakInfoEntity> page = this.page(
                new Query<BreakInfoEntity>().getPage(params),
                queryWrapper1.eq(StringUtils.isNotBlank(result),"result",result));

        //获取BreakInfoEntity实体类列表
        List<BreakInfoEntity> infoEntities = breakInfoDao.selectList(queryWrapper1);

//        System.out.println("获取到的info信息表数据为:"+infoEntities);

        //将BreakSettingEntity的信息注入到BreakInfoEntity中
        infoEntities.forEach(a ->{
//        因为两个表之前的关联键为settingId,这里就通过 a.getSettingId() 获取settingid,再将获取到的settingid放入setMap中
            System.out.println("在遍历info实体类时获取settingId,获取到的数据为"+a.getSettingId());
            System.out.println("在setMap中,按settingId获取到的数据为:"+setMap.get(a.getSettingId()));

//            这时就可以使用setMap.get(a.getInfoId())方法获取我们需要的setting数据,再调用我们定义的set方法传入参数
            //通过BreakInfoEntity中写的注入方法注入BreakSettingEntity实体类
            a.setBreakSettinginformation(setMap.get(a.getSettingId()));
        });
//        System.out.println(infoEntities);
        
//        设置查询的总记录数
        page.setTotal(infoEntities.size());
//        设置查询到的数据
        page.setRecords(infoEntities);

        return new PageUtils(page);
    }

}
Service思路

1.先将setting表中的数据查询出来后,包装到map类中,主键为settingId,值为setting实体对象

2.将info表的数据查询出来,再将之前的map类数据传入infoEntities,先遍历再传入对应settingId的数据,这里使用的set方法是info实体类中自己定义的,作用为给该实体类中的关联的内容赋值,赋值完成后我们就有了需要查询的所有数据

这是之前entity类中定义的set方法

    public void setBreakSettinginformation(BreakSettingEntity settingEntity){
//        根据定义的形参,分别用get
        this.warningCondition = settingEntity.getWarningCondition();
        this.alertType = settingEntity.getAlertType();
        this.alertMessage = settingEntity.getAlertMessage();
        this.relieveMsg = settingEntity.getRelieveMsg();
        this.devId = settingEntity.getDevId();
        this.handler = settingEntity.getHandler();
    }

3.调用this.page方法,将查询到的全部数据放入page,最后用PageUtils返回数据

/**在使用this.page时加入条件查询**/
        //使用this.page传入分页参数,在第二个参数传入queryWrapper类
        //在传入第二个参数时,可以直接加入传入查询条件,如eq,like等等
        IPage<BreakInfoEntity> page = this.page(
                new Query<BreakInfoEntity>().getPage(params),
                queryWrapper1.eq(StringUtils.isNotBlank(result),"result",result));
//        设置查询的总记录数
        page.setTotal(infoEntities.size());
//        设置查询到的数据
        page.setRecords(infoEntities);
controller
@RestController
@RequestMapping("/break")
public class BreakController {

    @Autowired
    private BreakInfoService breakInfoService;

    /**
     * 获取所有数据
     * */
    @GetMapping("/list")
    public R list(@RequestParam Map<String, Object> params){


        PageUtils page = breakInfoService.selsctListToEq(params);

        return R.ok().put("page",page);
    }
}

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值