5、Spring Boot 2.x整合PageHelper实现分页

上一篇文章对Mybatis进行了集成,实现了对单表的查询,并且使用MockMvc对Controller代码进行了单元测试。这一篇文章重点说明对PageHelper分页的整合。

以前我记得通常要实现分页,需要两条SQL语句来实现。首先会查询出数据总数,然后计算出总页数,传递页码进行查询,不同的数据库进行分页查询的方式还不一样。

现在针对Mybatis分页,有两款插件,一个是通用Mapper,另一个是PageHelper,通过整合这两个插件,可以大大简化代码开发。

一、添加依赖

在pom.xml文件中添加分页相关的依赖

<!-- 通用Mapper插件 -->
<dependency>
	<groupId>tk.mybatis</groupId>
	<artifactId>mapper-spring-boot-starter</artifactId>
	<version>2.0.4</version>
</dependency>
<!-- 分页插件 -->
<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
	<version>1.2.9</version>
</dependency>

二、添加配置

# 通用Mapper start
# 主键自增回写方法,默认值MYSQL
mapper.identity=MYSQL
mapper.mappers=tk.mybatis.mapper.common.BaseMapper
# insert和update语句中,是否要判断字符串类型不等于空
mapper.not-empty=true
# 枚举按简单类型处理
mapper.enum-as-simple-type=true
# 通用Mapper end

# PageHelper start
pagehelper.helper-dialect=mysql
pagehelper.params=count=countSql
pagehelper.reasonable=false
pagehelper.support-methods-arguments=true
# PageHelper end

配置说明:

  • pagehelper.reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
  • support-methods-arguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。

三、下面开始编写相关代码

编写自定义的Mapper接口类

创建com.aicode.bgms目录下创建common目录,然后创建PageMapper.java

package com.aicode.bgms.common;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 自定义的PageMapper接口,启动类不能扫描到此接口
 *
 * @param <T>
 */
public interface PageMapper<T> extends Mapper<T>, MySqlMapper<T> {
}

下面的用到的查询条件类,我们在com.aicode.bgms.common目录中为分页定义一个基础查询类BaseQuery.java

package com.aicode.bgms.common;

public class BaseQuery {
    private int pageNum;

    private int pageSize;

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
}

在com.aicode.bgms.model.extra目录下,编写业务相关的查询类UserInfoExtraQuery.java使之继承上面的BaseQuery.java

package com.aicode.bgms.model.extra;

import com.aicode.bgms.common.BaseQuery;

import java.util.Date;

public class UserInfoExtraQuery extends BaseQuery{

    private String userName;

    private Date createStartTime;

    private Date createEndTime;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getCreateStartTime() {
        return createStartTime;
    }

    public void setCreateStartTime(Date createStartTime) {
        this.createStartTime = createStartTime;
    }

    public Date getCreateEndTime() {
        return createEndTime;
    }

    public void setCreateEndTime(Date createEndTime) {
        this.createEndTime = createEndTime;
    }
}

修改接口UserInfoExtraMapper.java接口类,使之继承上面的PageMapper接口,并且添加分页方法。

package com.aicode.bgms.mapper.extra;

import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.extra.UserInfoExtraQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserInfoExtraMapper {

    UserInfo findUserInfoByUserName(@Param("userName") String userName);

    List<UserInfo> findUserInfoByPage(UserInfoExtraQuery query);
}

我们这里的方法是比较复杂的类型,可传入多种查询条件。

在UserInfoExtraMapper.xml文件中添加对应的sql映射

<!-- 分页查询用户信息 -->
    <select id="findUserInfoByPage" parameterType="com.aicode.bgms.model.extra.UserInfoExtraQuery"
            resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from tb_user_info
        <where>
            <trim prefix="(" prefixOverrides="and" suffix=")">
                <if test="userName != null  and userName != ''">
                    and USER_NAME = #{userName,jdbcType=VARCHAR}
                </if>
                <if test="createStartTime != null and createEndTime != null" >
                    <![CDATA[ AND CREATE_TIME >= #{createStartTime,jdbcType=VARCHAR} and CREATE_TIME < #{createEndTime,jdbcType=VARCHAR}]]>
                </if>
            </trim>
        </where>
    </select>

在UserInfoService.java接口中添加分页查询的业务方法,如下:

PageInfo<UserInfo> queryUserInfoByPage(UserInfoExtraQuery userInfoExtraQuery);

在UserInfoServiceImpl.java实现类中实现上面的方法:

    @Override
    public PageInfo<UserInfo> queryUserInfoByPage(UserInfoExtraQuery userInfoExtraQuery) {
        PageHelper.startPage(userInfoExtraQuery.getPageNum(),userInfoExtraQuery.getPageSize());
        List<UserInfo> userInfoList = userInfoExtraMapper.findUserInfoByPage(userInfoExtraQuery);
        PageInfo<UserInfo> pageInfo = new PageInfo<>(userInfoList);
        return pageInfo;
    }

如果是单表没有查询条件的情况下,在Mapper层可以不编写任何代码;直接在Service层编写如下代码即可。

public PageInfo<UserInfo> queryPage(int pageNum, int pageSize){
    PageHelper.startPage(pageNum,pageSize);
    List<UserInfo> userInfoList = userInfoExtraMapper.selectAll();
    PageInfo<UserInfo> pageInfo = new PageInfo<>(userInfoList);
    return pageInfo;
}

下面接着编写controller层,在UserInfoController.java中添加如下方法:

    @GetMapping("/pageQuery/{pageNum}/{pageSize}")
    public PageInfo<UserInfo> pageQuery(@PathVariable("pageNum") Integer pageNum,
                                        @PathVariable("pageSize") Integer pageSize,
                                        UserInfoExtraQuery userInfoExtraQuery){
        if (pageNum <= 0) {
            //页码不合法
        }
        if (pageSize > 100 || pageSize <= 0) {
            //每页数据数不合法
        }
        userInfoExtraQuery.setPageNum(pageNum);
        userInfoExtraQuery.setPageSize(pageSize);
        return userInfoService.queryUserInfoByPage(userInfoExtraQuery);
    }

至此,我们的代码基本写完了。

上面代码中有一个PageInfo的类,这里用到的泛型方式PageInfo<UserInfo>。

如果是多张表联合查询,或者返回的结果字段与原生的实体类不对应,可以自定义一个Pojo类用于结果集。

四、使用MockMvc进行测试

在UserInfoControllerTest.java文件中添加如下的测试方法:

    @Test
    public void queryByPage()  throws Exception {
        String mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/pageQuery/1/10"))
                .andReturn().getResponse().getContentAsString();
        System.out.println("Result === " + mvcResult);
    }

使用Postman进行测试

可以看到进行了分页,当前查询的是第1页,每页3条数据,共1页。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
spring boot整合mybatis-plus和pagehelper分页插件是一种常见的开发方式,可以实现数据库的分页查询功能。下面是一个简单示例项目的源码,以供参考: 首先,需要在pom.xml文件中添加相关依赖: ```xml <dependencies> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <!-- PageHelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> </dependencies> ``` 在application.properties(或application.yml)文件中配置数据库连接信息: ```yaml spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis-plus.configuration.map-underscore-to-camel-case=true ``` 创建一个简单的实体类User: ```java public class User { private Long id; private String username; private String password; // 省略getter和setter方法 } ``` 创建一个Mapper接口UserMapper: ```java @Mapper public interface UserMapper extends BaseMapper<User> { // 省略其他方法 List<User> getUsersByPage(Page<User> page, @Param("username") String username); } ``` 创建一个Service接口UserService以及其实现类UserServiceImpl: ```java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Autowired private UserMapper userMapper; @Override public IPage<User> getUsersByPage(Page<User> page, String username) { return userMapper.getUsersByPage(page, username); } } ``` 在Controller中注入UserService,并进行分页查询操作: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public IPage<User> getUsers(@RequestParam(value = "page", defaultValue = "1") Integer pageNum, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "username", required = false) String username) { Page<User> page = new Page<>(pageNum, pageSize); return userService.getUsersByPage(page, username); } } ``` 至此,就完成了spring boot整合mybatis-plus和pagehelper分页插件的配置和使用。 请注意,这是一个简单示例项目,实际使用中可能需要根据需求进行适当调整和修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值