引言
需求:做一个导出,往往列表的数据与导出的数据是一致的,要说有不一样的,那就是导出的数据可能没有分页,既是符合条件的全部数据,而页面中的列表数据是有分页的;
数据一样可以共用同一个Service或Mapper方法,没必要写两个,在网上搜索了一波,没有找到方案,自己研究找到一种可以实现的方案,特此记录
实现思路
- 列表数据和导出数据分两个方法,Controller两个,Service两个,Mapper两个(不推荐使用,麻烦,代码冗余)
- Service、Mapper使用同一个方法,使用MyBatis插件,拦截分页查询,过滤分页(理论上可以实现,个人没试过)
- 扩展MybatisPlus的ServiceImpl类,增加一个方法,判断如果分页就查分页,不是分页就查所有(不推荐使用,在单表操作可以实现,一旦自己写Mapper就有问题了)
- Service、Mapper使用同一个方法,不用插件,直接修改页数,接下来说到的(推荐使用)
源码分析
本来是打算使用第二种方法,自己添加一个插件来达到目的,后来查看MyBatisPlus分页拦截器的源码时,发现了一个更简单的方法,可以不用自己去写插件
在看到com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor#beforeQuery,这个类的beforeQuery方法时,里面有一段代码(上面圈起来的),当分页的当前页总数小于0是,直接退出,不进行后面的分页封装,然后试了一下,在查列表数据的时间传正常数据,在导出的时候将页数置-1,实现了导出和列表数据共用同一个Service,Mapper方法
实现代码
Controller
关键代码:userDTO.setIsPage(false); // 页数置-1
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 列表数据
* @param response
* @param userDTO
*/
@GetMapping("/listData")
public R listData(HttpServletResponse response, UserDTO userDTO) {
Page<Map<String, Object>> userList = userService.testPageExport(userDTO);
return R.ok().data(userList);
}
/**
* 导出
* @param response
* @param userDTO
*/
@GetMapping("/export")
public void export(HttpServletResponse response, UserDTO userDTO) {
userDTO.setIsPage(false); // 页数置-1
Page<Map<String, Object>> userList = userService.testPageExport(userDTO);
Map<String, String> map = new LinkedHashMap<>();
map.put("username", "用户名");
map.put("create_time", "创建时间");
HuExcelUtils.exportExcel(response, "用户", userList.getRecords(), map, null);
}
}
Service
以下两种方法均可以实现
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
/**
* 直接用MyBatisPlus内置方法
* @param userDTO
* @return
*/
@Override
public Page<Map<String, Object>> testPageExport(UserDTO userDTO) {
QueryWrapper<User> qw = new QueryWrapper<>();
// QwUtils.eq(qw, "username", "root");
return baseMapper.selectMapsPage(userDTO.page(), qw);
}
/**
* 手动实现Mapper
* @param userDTO
* @return
*/
@Override
public Page<Map<String, Object>> testPageExportMapper(UserDTO userDTO) {
return baseMapper.pageData(userDTO.page(), userDTO);
}
}
Mapper
public interface UserMapper extends BaseMapper<User> {
Page<Map<String, Object>> pageData(Page page, UserDTO userDTO);
}
Mapper xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cow.mapper.UserMapper">
<select id="pageData" resultType="java.util.Map">
select id, username, create_time from bs_user
</select>
</mapper>
DTO
public class UserDTO extends PageDTO {
// 各种查询条件
}
public class PageDTO {
/**
* 每页显示的条数
*/
private long limit = 10;
/**
* 当前页
*/
private long page = 1;
/**
* 是否分页 true 分页 false 不分页
*/
private boolean isPage = true;
public Page page() {
if (!this.isPage) {
this.limit = -1;
}
return new Page(this.page, this.limit);
}
public long getLimit() {
return this.limit;
}
public void setLimit(long limit) {
this.limit = limit;
}
public long getPage() {
return this.page;
}
public void setPage(long page) {
this.page = page;
}
public boolean getIsPage() {
return this.isPage;
}
public void setIsPage(boolean page) {
this.isPage = page;
}
}
结果
分页查结果,只查分页数据
导出查询结果,查出符合条件的所有数据