现在对于一些初创的公司,若依框架作为国内流行的Java企业级快速开发平台,在提升开发效率方面表现突出,但也存在一定的局限性。
若依框架给我们的开发带来了很多的便捷,
快速开发:内置的代码生成器可自动生成CRUD代码及VUE前端页面,减少70%重复编码工作,1周内完成传统1个月的工作量。
功能模块化:提供用户管理、角色权限、系统监控等预制模块,支持多数据源和插件扩展。可快速搭建OA、ERP等系统。
技术栈成熟:基于Springboot + Mybatis-Plus,整合Vue.js+ ElementUI,支持前后端分离开发,兼容微服务架构。
我们可以看到原生的若依查询分页列表的接口:
@PreAuthorize("@ss.hasPermi('law:message:list')")
@GetMapping("/list")
public TableDataInfo list(LawMessage message)
{
startPage();
List<LawMessage> list = messageService.selectMessageList(message);
return getDataTable(list);
}
其中接收的实体类为TableDataInfo:

对于入参的实体类;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class LawMessage extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** */
private Long id;
/** 留言所属类型 */
@Excel(name = "留言所属类型 0情况1 1情况2 2情况3 3情况4")
private Long legalType;
/** 工单id */
@Excel(name = "工单id")
private Long onlyId;
/** 对应法律援助申请表id */
@Excel(name = "对应申请表id")
private Long lid;
/** 留言内容 */
@Excel(name = "留言内容")
private String leaveMessage;
/** 留言时间 */
@JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
@Excel(name = "留言时间", width = 30, dateFormat = "YYYY-MM-DD HH:mm:ss")
private String msgTime;
/** 留言者id */
@Excel(name = "留言者id")
private Long userid;
/** 留言者类型(2申请人/3审核人) */
@Excel(name = "留言者类型", readConverterExp = "2=申请人/3审核人")
private String type;
}
service层:
@Override
public List<LawMessage> selectMessageList(LawMessage message)
{
return messageMapper.selectMessageList(message);
}
但是我们会发现如果在
service层里的实现中
@Override
public List<LawMessage> selectMessageList(LawMessage message)
{
// 添加代码。任何逻辑代码
return messageMapper.selectMessageList(message);
}
就会出现分页接口返回的数据是异常的。分页出现了异常了。但是有时候我们的业务要求是需要对service层做一些业务场景的操作的。这个时候如果非要将 Mapper查询之前增加一些业务逻辑,这个时候会出现返回后的TableDataInfo 返回的数据只有一页数据,不能够正常的翻页。
这个时候我们发现若是还是用若依的那一套解决不了问题,这时需要我们自己对分页模块部门进行改造了。
首先我们查看TableDataInfo的实体属性,其中包含了:total(long)、rows(List<?>)、code(int)、 msg(String)四个属性并且是继承了java.io的
Serializable(序列化)
所以我们经过改造的返回response也最后和这个返回的实体保持一致。
其次,对于rows的数据结构,我们需要考虑一下,当然不要用List直接装载。这时候我们需要引入java自带的一个返回实体:PageInfo类。
我们可以看到PageInfo 实体类的使用是这样的:
public class PageInfo<T> extends PageSerializable<T> {
}
PageSerializable 类有默认的List 泛型属性,我们可以直接将查询到的数据列表设置其中。另外还有一个重要的属性:total
这两处不能用同一个select的查询,total指的是当前业务条件下查询出来的所有数据的总数。
而List泛型里装入的是在 当前业务条件查询下另外还添加了分页的属性。所以这里装入List泛型的数据是跟pageSize一样的。是可变的。
理解到这些后我们在心里构造的分页控件应该有了一个大致的轮廓了。
直接上代码,我们对类似于原来的 /list 接口进行改造如下:
@GetMapping("/list")
public TableDataInfo list(CloudVideo cloudVideo)
{
PageInfo<CloudVideo> list = cloudVideoService.selectCloudVideoList(cloudVideo);
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(list.getList());
rspData.setTotal(list.getTotal());
return rspData;
}
其中service实现层:
@Override
public PageInfo<CloudVideo> selectCloudVideoList(CloudVideo cloudVideo) {
/** 获取分页*/
PageDomain jsonPageDomain = TableSupport.buildPageRequest();
Integer pageNum = jsonPageDomain.getPageNum();
Integer pageSize = jsonPageDomain.getPageSize();
if(pageNum==null || pageSize==null){
throw new RuntimeException("未获取到分页参数值");
}
List<CloudVideo> cloudList= new ArrayList<>();
List<CloudVideo> uList= new ArrayList<>();
if (StringUtils.isNotEmpty(cloudVideo.getVideoThemeIds())) {
List<String> ids = new ArrayList<>();
String[] split = cloudVideo.getVideoThemeIds().split(",");
for (String s : split) {
ids.add(s);
}
cloudVideo.setVideoThemeIdList(ids);
}
uList = cloudVideoMapper.selectCloudVideoList(cloudVideo);
PageHelper.startPage(pageNum,pageSize);
cloudList = cloudVideoMapper.selectCloudVideoList(cloudVideo);
PageInfo cloundInfo = new PageInfo<>(cloudList);
// 将封装后的列表放到分页对象中
cloundInfo.setTotal(uList.size());
cloundInfo.setList(cloudList);
return cloundInfo;
}
这里的核心代码有两处:
第一处,初始化分页控件:
/** 获取分页*/
PageDomain jsonPageDomain = TableSupport.buildPageRequest();
Integer pageNum = jsonPageDomain.getPageNum();
Integer pageSize = jsonPageDomain.getPageSize();
if(pageNum==null || pageSize==null){
throw new RuntimeException("未获取到分页参数值");
}
第二处:在引入分页控件之前的将limit(a1,a2)的sql注入到Mapper.xml内:
PageHelper.startPage(pageNum,pageSize);
mapper.selectXXXXXX()...
然后,初始化PageInfo,将PageInfo里的total和list赋值其中。
然后返回PageInfo即可;
至此我们可以获取到完整的分页数据:
我们用apiPost来试一下:

至此,若依分页控件改造完成。其实其他的架构的分页模块的改造和这基本上是大同小异,我们首先需要了解到前端分页插件里所需要的哪些属性,然后根据前端需要的属性对后端分页结构进行改造即可。只需要记住:
方法不限,性能优先。