
互联网应用中,分页可谓无处不在,在每个需要展示数据的地方,都能找到分页的影子。在日常开发中,为了追求效率,通常使用数据库的物理分页。这时,对于一个业务逻辑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依赖。
配置文件1.8 2.1.0 1.2.5 org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.version} com.github.pagehelper pagehelper-spring-boot-starter ${mybatis.pagehelper.version} mysql mysql-connector-java runtime org.springframework.boot spring-boot-devtools runtime true org.springframework.boot spring-boot-starter-test test
配置数据库信息和分页参数。
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 getUserList();
}
controller类
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
// http://localhost:8080/getUserList?pageNum=1&pageSize=2
@RequestMapping("getUserList")
public Page getUserList(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
Page userList = userMapper.getUserList();
return userList;
}
}
测试