JAVA快餐 5 spring boot集成mybatis(2) – 使用pagehelper实现分页
PS:本教程只限认识pagehelper,熟悉使用方法,里面有很多用不上的参数。实际项目中通常使用自己封装的分页方法
概述
本文在前一篇教程的基础上,使用常用的pagehelper插件,添加分页功能。本文将实现一个列出所有用户的接口,分页返回结果
项目依赖
不创建新项目,重用章节 [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="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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=pageSizeZerosupportMethodsArguments
:默认值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 javax.annotation.Resource; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.stereotype.Service; import com.qikegu.demo.model.User; import com.qikegu.demo.repository.UserMapper; import com.qikegu.demo.service.UserService; import java.util.List; @Service("userService") public class UserServiceImpl implements UserService { // 注入mapper类 @Resource private UserMapper userMapper; @Override public User getUserById(long userId) { return userMapper.selectByPrimaryKey(userId); } @Override public PageInfo listUser(int pageno, int pageSize) { List<User> result = null; try { // 调用pagehelper分页,采用starPage方式。starPage应放在Mapper查询函数之前 Page page = PageHelper.startPage(pageno, pageSize); //每页的大小为pageSize,查询第page页的结果 PageHelper.orderBy("id ASC "); //进行分页结果的排序 result = userMapper.selectUser(); PageInfo<User> pi = new PageInfo<User>(result); pi.setPageNum(page.getPageNum()); pi.setPageSize(page.getPageSize()); pi.setTotal(page.getTotal()); return pi; } catch (Exception e) { e.printStackTrace(); } return null; } }
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" "http://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完全解耦的优点,推荐在项目中使用。
参考:https://www.qikegu.com/docs/2558