MyBatisPlus列表数据(分页)和导出数据(不分页)共用同一个Service方法或Mapper接口


引言

需求:做一个导出,往往列表的数据与导出的数据是一致的,要说有不一样的,那就是导出的数据可能没有分页,既是符合条件的全部数据,而页面中的列表数据是有分页的;
数据一样可以共用同一个Service或Mapper方法,没必要写两个,在网上搜索了一波,没有找到方案,自己研究找到一种可以实现的方案,特此记录


实现思路

  1. 列表数据和导出数据分两个方法,Controller两个,Service两个,Mapper两个(不推荐使用,麻烦,代码冗余)
  2. Service、Mapper使用同一个方法,使用MyBatis插件,拦截分页查询,过滤分页(理论上可以实现,个人没试过)
  3. 扩展MybatisPlus的ServiceImpl类,增加一个方法,判断如果分页就查分页,不是分页就查所有(不推荐使用,在单表操作可以实现,一旦自己写Mapper就有问题了)
  4. 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;
    }
}

结果

分页查结果,只查分页数据
在这里插入图片描述
导出查询结果,查出符合条件的所有数据
在这里插入图片描述

### 回答1: 可以使用MybatisPlus提供的分页查询工具类Page,实现一个接口方法来获取分页数据:public interface UserMapper { IPage<User> getUserListByPage(Page page); } ### 回答2: MyBatis Plus 是一种开源的 ORM 框架,它提供了一套强大的 SQL 操作方法,简化了 CRUD 操作的编写过程。在使用 MyBatis Plus 进行分页获取数据时,可以按照以下方式编写接口方法。 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; public interface MyMapper<Data> extends BaseMapper<Data> { /** * 分页获取数据 * @param page 分页参数 * @return 分页结果 */ IPage<Data> getDataPage(Page<Data> page); } ``` 在接口中,首先继承了 MyBatis Plus 提供的 BaseMapper 接口,该接口提供了一系列基础的 CRUD 操作方法。然后定义了一个泛型方法 `getDataPage`,用于进行分页获取数据方法的参数是一个 `Page` 对象,用于指定分页的相关参数,如当前页码、每页数据条数等。`Page` 类是 MyBatis Plus 提供的分页对象,它继承了 MyBatis 的 `RowBounds` 类,并增加了 `total` 成员变量用于存储总数据条数。 方法的返回值是一个 `IPage` 对象,用于封装分页获取的数据结果。`IPage` 是 MyBatis Plus 提供的分页结果接口,它包含了分页的相关信息,如总数据条数、当前页码、每页数据条数等。在具体实现中,通过调用 MyBatis Plus 提供的方法进行分页查询,并将查询结果封装到 `IPage` 对象中返回。 使用该接口方法时,可以在对应的 Service 类中调用该方法进行分页查询数据,具体的调用方式如下: ```java import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyService { @Autowired private MyMapper<Data> myMapper; public IPage<Data> getDataPage(int pageNum, int pageSize) { Page<Data> page = new Page<>(pageNum, pageSize); return myMapper.getDataPage(page); } } ``` 在 Service 类中,可以通过调用 `getDataPage` 方法实现分页查询数据。首先创建一个 `Page` 对象,传入当前页码和每页数据条数,然后调用 `getDataPage` 方法进行查询,并将查询结果返回。 以上就是使用 MyBatis Plus 进行分页获取数据接口方法的示例。根据实际需求,可以调整接口方法的参数和返回值类型,以实现更加灵活的分页查询逻辑。 ### 回答3: MybatisPlus是一个便捷的Java持久层框架,可以简化数据库操作。下面是一个使用MybatisPlus进行分页获取数据接口方法的示例: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; public interface MyEntityMapper extends BaseMapper<MyEntity> { default List<MyEntity> getPageData(int pageNo, int pageSize) { // 创建分页对象 Page<MyEntity> page = new Page<>(pageNo, pageSize); // 执行分页查询,将结果封装到分页对象中 selectPage(page, null); // 返回查询结果 return page.getRecords(); } } ``` 在上述代码中,我们使用`Page`对象来进行分页查询。首先,我们创建一个`Page`对象,指定当前页码和每页显示的数量。然后,通过调用`selectPage`方法进行分页查询,该方法会自动将查询结果封装到`Page`对象中。 接着,我们可以通过`page.getRecords()`方法获取查询结果列表,并返回给调用端。 注意:在这个示例中,我们假设已经定义了一个名为`MyEntity`的实体类,并通过`MyEntityMapper`接口进行数据库访问。`MyEntityMapper`接口继承了`BaseMapper`,可以直接使用MybatisPlus提供的基本查询方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值