spring boot集成mybatis(2) – 使用pagehelper实现分页

概述

本文在前一篇教程的基础上,使用常用的pagehelper插件,添加分页功能。本文将实现一个列出所有用户的接口,分页返回结果。

准备数据

数据库和数据表都使用spring boot集成mybatis(1)用过的的,因为要分页,表里需要插入更多数据。

mysql命令行客户端连接数据库

mysql -h localhost -u root -p

插入数据的sql语句:

INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc3', '13512345603', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc4', '13512345604', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc5', '13512345605', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc6', '13512345606', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc7', '13512345607', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc8', '13512345608', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc9', '13512345609', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc10', '13512345610', '123');

 

项目依赖

不创建新项目,重用spring boot集成mybatis(1)的项目,没有项目请按spring boot集成mybatis(1)教程创建。 Eclipse打开该项目,在pom.xml文件中,添加依赖:pagehelper-spring-boot-starter,引入pagehelper相关依赖包

添加依赖:pagehelper-spring-boot-starter

在pom.xml中添加依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>

 

完整的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.qikegu</groupId>
  <artifactId>springboot-mybatis-demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot-mybatis-demo</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.10</version>
    </dependency>
    
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

 

项目配置

添加pagehelper配置

在application.properties中添加pagehelper配置

pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

 

说明:

helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。你也可以配置helperDialect属性来指定分页插件使用哪种方言。

reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

params:用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为

pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

 

supportMethodsArguments:默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。

更多信息参考pagehelper官网

application.properties完整内容

## 服务器端口,如果不配置默认是8080端口
server.port=8096 

## 数据库设置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.0.99:3306/qikegu_demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=qazwsx

## mybatis配置
#  指向映射类目录
mybatis.type-aliases-package=com.qikegu.demo.model
# 指向映射xml文件目录
mybatis.mapper-locations=classpath:mapper/*.xml

## pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

 

添加代码

pagehelper 使用方法

pagehelper使用方法有好几种,这里我们介绍最常用的2种:

//方法1,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10); // pageNum=1, pageSize=10
List<Country> list = countryMapper.selectIf(1);
//方法2,参数方法调用 
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数 
public interface CountryMapper { 
    List<Country> selectByPageNumSize( @Param("user") User user, 
                                       @Param("pageNum") int pageNum, 
                                       @Param("pageSize") int pageSize); 
} 

//配置supportMethodsArguments=true 
//在代码中直接调用: 
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);

 

本文例子采取方法1,更多方法参考pagehelper官网

代码实现

添加我们要实现的功能:列出所有用户,分页返回结果。下面几个文件需要修改:

  • UserController.java – 控制层
  • UserService.java & UserServiceImpl.java – 服务层
  • UserMapper.java & UserMapper.xml – 数据访问层

如图:

UserController.java

新增一个函数

@RequestMapping(value="", method = RequestMethod.GET, produces="application/json")
 public PageInfo<User> listUser(
 		@RequestParam(value="page", required=false, defaultValue="1") int page,
 		@RequestParam(value="page-size", required=false, defaultValue="5") int pageSize){
 	

     List<User> result = userService.listUser(page, pageSize);
     // PageInfo包装结果,返回更多分页相关信息
     PageInfo<User> pi = new PageInfo<User>(result);
     
     return pi;
 }

 

说明

此函数是接口的控制层,其中

  • @RequestParam 注解获取url中的?page=1&page-size=5参数,value="page"是url中的参数名,required指参数是否必须,如果是必须URL却没有这个参数会报错,defaultValue="1"缺省值
  • PageInfo PageInfo包装结果,返回更多分页相关信息

完整代码:

package com.qikegu.demo.controller;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qikegu.demo.model.User;
import com.qikegu.demo.service.UserService;

@RestController
@EnableAutoConfiguration
@RequestMapping("/user")
public class UserController {
  
  // 注入mapper类
    @Resource
    private UserService userService;
  
    @RequestMapping(value="{id}", method=RequestMethod.GET, produces="application/json")
    public User getUser(@PathVariable long id) throws Exception {
    	
        User user = this.userService.getUserById(id);
        
        return user;
    }
    
    @RequestMapping(value="", method = RequestMethod.GET, produces="application/json")
    public PageInfo<User> listUser(
    		@RequestParam(value="page", required=false, defaultValue="1") int page,
    		@RequestParam(value="page-size", required=false, defaultValue="5") int pageSize){
    	

        List<User> result = userService.listUser(page, pageSize);
        // PageInfo包装结果,返回更多分页相关信息
        PageInfo<User> pi = new PageInfo<User>(result);
        
        return pi;
    }

}

 

UserService.java & UserServiceImpl.java

UserService.java新增一个接口

public List<User> listUser(int page, int pageSize);

 

UserServiceImpl.java新增上面接口的实现

@Override
public List<User> listUser(int page, int pageSize) {
      List<User> result = null;
      try {
      	// 调用pagehelper分页,采用starPage方式。starPage应放在Mapper查询函数之前
          PageHelper.startPage(page, pageSize); //每页的大小为pageSize,查询第page页的结果
          PageHelper.orderBy("id ASC "); //进行分页结果的排序
      	result = userMapper.selectUser();
      } catch (Exception e) {
          e.printStackTrace();
      }

  return result;
}

 

说明:

请看代码注释

完整代码:

UserService.java

package com.qikegu.demo.service;

import java.util.List;

import com.qikegu.demo.model.User;

public interface UserService {
  
    public User getUserById(long userId);
    
    public List<User> listUser(int page, int pageSize);
}

 

UserServiceImpl.java

package com.qikegu.demo.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.qikegu.demo.model.User;
import com.qikegu.demo.repository.UserMapper;
import com.qikegu.demo.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService {

  //注入mybatis数据库查询类
    @Resource
    private UserMapper userMapper;
    
    @Override
    public User getUserById(long userId) {
        return userMapper.selectByPrimaryKey(userId);
    }
    
  @Override
  public List<User> listUser(int page, int pageSize) {
        List<User> result = null;
        try {
        	// 调用pagehelper分页,采用starPage方式。starPage应放在Mapper查询函数之前
            PageHelper.startPage(page, pageSize); //每页的大小为pageSize,查询第page页的结果
            PageHelper.orderBy("id ASC "); //进行分页结果的排序
        	result = userMapper.selectUser();
        } catch (Exception e) {
            e.printStackTrace();
        }

    return result;
  }
}

 

UserMapper.java & UserMapper.xml

UserMapper.java 新增接口

// 列出用户,对应xml映射文件元素的ID
List<User> selectUser();

 

UserMapper.xml 该接口新增mybatis xml实现

<select id="selectUser" resultMap="BaseResultMap">
  select 
  <include refid="Base_Column_List" />
  from user
</select>

 

说明

请看代码注释

完整代码

UserMapper.java

package com.qikegu.demo.repository;

import java.util.List;

import com.qikegu.demo.model.User;

public interface UserMapper {

  // 查询某个用户,对应xml映射文件元素的ID
    User selectByPrimaryKey(long id);
    
    // 列出用户,对应xml映射文件元素的ID
    List<User> selectUser();
}

 

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "//mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qikegu.demo.repository.UserMapper">
  <resultMap id="BaseResultMap" type="com.qikegu.demo.model.User">
    <constructor>
      <idArg column="id" javaType="_long" jdbcType="BIGINT" />
      <arg column="nickname" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="mobile" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="password" javaType="java.lang.String" jdbcType="CHAR" />
      <arg column="role" javaType="java.lang.String" jdbcType="VARCHAR" />
    </constructor>
  </resultMap>
  
  <sql id="Base_Column_List">
  id, nickname, mobile, password, role
  </sql>
  <select id="selectByPrimaryKey" parameterType="_long" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from user
    where id = #{id,jdbcType=BIGINT}
  </select>
  
  <select id="selectUser" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from user
  </select>
  
</mapper>

 

运行

Eclipse左侧,在项目根目录上点击鼠标右键弹出菜单,选择:run as -> spring boot app 运行程序。 我们使用Postman访问接口,Postman是一款很强大的接口测试工具,很常用称得上是“居家旅行必备”,推荐使用。安装很简单,去官网下载一个,按照步骤安装就可以了。运行结果如下:

总结

分页功能可以说是web开发中的必备功能,本文在前一篇教程的基础上,介绍了mybatis pagehelper插件的集成过程,pagehelper是一款常用的分页插件,具有和Mapper.xml完全解耦的优点,推荐在项目中使用。

完整代码:github


评论