前言
分页插件的必要性
互联网应用中,分页可谓无处不在,在每个需要展示数据的地方,都能找到分页的影子。在日常开发中,为了追求效率,通常使用数据库的物理分页。这时,对于一个业务逻辑SQL,大多数情况需要输出两段SQL来达到分页效果:count查询总数和limit分页,这无疑增加了大量的工作量。对于这种大量的、相似的、非业务逻辑的代码,抽象出公共插件是势在必行的。
分页插件原理
Mybatis给开发者提供了一个拦截器接口,只要实现了该接口,就可以在Mybatis执行SQL前,作一些自定义的操作。分页插件就是在此基础上开发出来的,对于一个需要分页的SQL,插件会拦截并生成两段SQL。举一个简单的例子:
原SQL:
select * from table where a = '1'
拦截后的查询总数SQL:
select count(*) from table where a = '1'
拦截后的分页SQL:
select * from table where a = '1' limit 5,10
这样我们只需要根据业务逻辑开发原SQL,不需关心分页语法对原SQL的影响,拦截器已经为我们处理好了。
一、pom.xml文件
添加mybatis、pagehelper、mysql和web依赖。
<properties>
<java.version>1.8</java.version>
<mybatis.version>2.1.0</mybatis.version>
<mybatis.pagehelper.version>1.2.5</mybatis.pagehelper.version>
</properties>
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${mybatis.pagehelper.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
二、配置文件
配置数据库信息和分页参数。
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT
pagehelper:
#配置数据库类型
helperDialect: mysql
#3.3.0版本可用 - 分页参数合理化,默认false禁用
#启用合理化时,如果pageNum<1 会查询第一页,如果pageNum>pages会查询最后一页
#禁用合理化时,如果pageNum<1 或pageNum>pages会返回空数据
reasonable: true
#是否支持接口参数来传递分页参数,默认false
supportMethodsArguments: true
#3.5.0版本可用 - 为了支持startPage(Object params)方法
#增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值
#可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值
params: count=countSql
三、实体类
@Alias("user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
四、mapper类
使用注解方式。
@Mapper
public interface UserMapper {
@Select("select * from user")
Page<User> getUserList();
}
五、controller类
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
// http://localhost:8080/getUserList?pageNum=1&pageSize=2
@RequestMapping("getUserList")
public Page<User> getUserList(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
Page<User> userList = userMapper.getUserList();
return userList;
}
}