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);
}
}