前言
以前在写mysql分页的时候,都是将分页参数传给sql语句,也就是手动设置page,size这些,利用limit语句来进行的。这样有点麻烦,mybatis提供了分页插件pagehelper,下面使用pagehelper进行简单的分页。
1、PageHelper介绍
PageHelper是mybatis的通用分页插件,通过mybatis的拦截器实现分页功能,拦截sql查询请求,添加分页语句,最终实现分页查询功能。
2、分页原理
在调用dao的service方法中设置分页参数:PageHelper.startPage(page, size),分页参数会设置在ThreadLocal中。PageHelper 在mybatis执行sql前进行拦截,从ThreadLocal取出分页参数,修改当前执行的sql语句,添加分页sql,最后执行添加了分页sql的sql语句,实现分页查询。
3、PageHelper使用
(1)pom依赖
<!-- pageHelper分页 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
(2)yml配置
需要配置方言,mysql或者oracle这些,因为不同数据库分页的SQL语句不太一样。
##pageHelper分页插件配置
pagehelper:
##方言配置为mysql数据库
helper-dialect: mysql
(3)pojo
ackage com.ycz.domain.book;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "book_info")
public class BookInfo {
@Id
@Column(name = "book_id")
@Getter
@Setter
private int bookId;
@Column(name = "name")
@Getter
@Setter
private String name;
@Column(name = "author")
@Getter
@Setter
private String author;
@Column(name = "publish")
@Getter
@Setter
private String publish;
@Column(name = "ISBN")
@Getter
@Setter
private String ISBN;
@Column(name = "introduction")
@Getter
@Setter
private String introduction;
@Column(name = "language")
@Getter
@Setter
private String language;
@Column(name = "price")
@Getter
@Setter
private double price;
@Column(name = "pub_date")
@Getter
@Setter
private Date pubDate;
@Column(name = "class_id")
@Getter
@Setter
private int classId;
@Column(name = "number")
@Getter
@Setter
private int number;
@Column(name = "add_time")
@Getter
@Setter
private String addTime;
}
(4)mapper接口
package com.ycz.swagger.dao;
import org.apache.ibatis.annotations.Mapper;
import com.github.pagehelper.Page;
import com.ycz.domain.book.BookInfo;
@Mapper
public interface BookInfoMapper {
//分页查询
Page<BookInfo> findBooksPaged();
}
这里返回类型是PageHelper提供的分页Page对象,而且这个接口也没有传入分页参数page,size这些。
(5)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.ycz.swagger.dao.BookInfoMapper">
<!-- 分页查询 -->
<select id="findBooksPaged" resultType="com.ycz.domain.book.BookInfo">
select * from book_info
</select>
</mapper>
同样这里的SQL语句也没有使用limit语句,最终会生成一个带分页查询的SQL语句。
(6)api
@Api(value = "书籍管理",description = "提供书籍信息的增删改查",tags = {"书籍管理"})
public interface BookControllerApi {
QueryResponseResult<BookInfo> findBooksPaged(int page,int size);
}
(7)Service
@Service
public class BookService {
@Autowired
BookInfoMapper bookInfoMapper;
public QueryResponseResult<BookInfo> findBooksPaged(int page, int size) {
if(page <= 0) {
page = 1;
}
if(size <= 5) {
size = 5;
}
//开始分页
PageHelper.startPage(page, size);
//获取分页对象
Page<BookInfo> pg = bookInfoMapper.findBooksPaged();
//从分页对象中取出查询列表
List<BookInfo> books = pg.getResult();
//获取条数目
long total = pg.getTotal();
//查询对象
QueryResult<BookInfo> queryResult = new QueryResult<BookInfo>();
//封装参数
queryResult.setTotal(total);
queryResult.setList(books);
return new QueryResponseResult<>(TestCode.SUCCESS, queryResult);
}
}
获取Page分页对象,再从分页对象中获取查询列表。
(8)controller
@RestController
@RequestMapping("/book")
public class BookController implements BookControllerApi{
@Autowired
BookService bookService;
@Override
@GetMapping("/list/{page}/{size}")
public QueryResponseResult<BookInfo> findBooksPaged(@PathVariable("page") int page,
@PathVariable("size") int size) {
return bookService.findBooksPaged(page,size);
}
}
(9)测试
使用swagger进行测试:
返回结果:
{
"success": true,
"code": 10000,
"message": "操作成功!",
"queryResult": {
"list": [
{
"bookId": 0,
"name": "九型人格",
"author": "海伦·帕尔默",
"publish": "华夏出版社",
"introduction": "九型人格(Enneagram),又名性格型态学、九种性格。是婴儿时期人身上的九种气质,包括活跃程度;规律性;主动性;适应性;感兴趣的范围;反应的强度;心景的素质;分心程度;专注力范围/持久性。它是一个近年来倍受美国斯坦福等国际著名大学MBA学员推崇并成为现今最热门的课程之一,近十几年来已风行欧美学术界及工商界。全球500强企业的管理阶层均有研习九型性格,并以此培训员工。",
"language": "中文",
"price": 45,
"pubDate": null,
"classId": 0,
"number": 10,
"addTime": null,
"isbn": "9787508086149"
},
{
"bookId": 0,
"name": "三十六计",
"author": "佚名",
"publish": "北京联合出版公司",
"introduction": "《三十六计》或称三十六策,是指中国古代三十六个兵法策略,语源于南北朝,成书于明清。它是根据中国古代军事思想和丰富的斗争经验总结而成的兵书,是中华民族悠久非物质文化遗产之一。",
"language": "中文",
"price": 12,
"pubDate": null,
"classId": 0,
"number": 9,
"addTime": null,
"isbn": "9787550243569"
},
{
"bookId": 0,
"name": "传习录",
"author": "王阳明",
"publish": "新华书店出版社",
"introduction": "《传习录》是哲学著作,作者是中国明代哲学家、宋明理学中心学一派的代表人物王守仁(字伯安),世称阳明先生。此书记载了他的语录和论学书信。传习一词源出自《论语》中的传不习乎一语。\n ",
"language": "中文",
"price": 32,
"pubDate": null,
"classId": 0,
"number": 4,
"addTime": null,
"isbn": "9878875775657"
},
{
"bookId": 0,
"name": "何以笙箫默",
"author": "顾漫 sdf 的身份",
"publish": "朝华出版社",
"introduction": "一段年少时的爱恋,牵出一生的纠缠。大学时代的赵默笙阳光灿烂,对法学系大才子何以琛一见倾心,开朗直率的她拔足倒追,终于使才气出众的他为她停留驻足。然而,不善表达的他终于使她在一次伤心之下远走他乡……",
"language": "中文",
"price": 15,
"pubDate": null,
"classId": 0,
"number": 10,
"addTime": null,
"isbn": "9787505414709"
},
{
"bookId": 0,
"name": "人类简史",
"author": "[以色列] 尤瓦尔·赫拉利 ",
"publish": "中信出版社",
"introduction": "十万年前,地球上至少有六种不同的人\r\n但今日,世界舞台为什么只剩下了我们自己?\r\n从只能啃食虎狼吃剩的残骨的猿人,到跃居食物链顶端的智人,\r\n从雪维洞穴壁上的原始人手印,到阿姆斯壮踩上月球的脚印,\r\n从认知革命、农业革命,到科学革命、生物科技革命,\r\n我们如何登上世界舞台成为万物之灵的?\r\n从公元前1776年的《汉摩拉比法典》,到1776年的美国独立宣言,\r\n从帝国主义、资本主义,到自由主义、消费主义,\r\n从兽欲,到物欲,从兽性、人性,到神性,\r\n我们了解自己吗?我们过得更快乐吗?\r\n我们究竟希望自己得到什么、变成什么?",
"language": "英文",
"price": 68,
"pubDate": null,
"classId": 0,
"number": 20,
"addTime": null,
"isbn": "9787508647357"
},
{
"bookId": 0,
"name": "明朝那些事儿(1-9)",
"author": "当年明月 ",
"publish": "中国海关出版社",
"introduction": "《明朝那些事儿》讲述从1344年到1644年,明朝三百年间的历史。作品以史料为基础,以年代和具体人物为主线,运用小说的笔法,对明朝十七帝和其他王公权贵和小人物的命运进行全景展示,尤其对官场政治、战争、帝王心术着墨最多。作品也是一部明朝政治经济制度、人伦道德的演义。",
"language": "中文",
"price": 358.2,
"pubDate": null,
"classId": 0,
"number": 20,
"addTime": null,
"isbn": "9787801656087"
},
{
"bookId": 0,
"name": "经济学原理(上下)",
"author": "[美] 曼昆 ",
"publish": "机械工业出版社",
"introduction": "此《经济学原理》的第3版把较多篇幅用于应用与政策,较少篇幅用于正规的经济理论。书中主要从供给与需求、企业行为与消费者选择理论、长期经济增长与短期经济波动以及宏观经济政策等角度深入浅出地剖析了经济学家们的世界观。",
"language": "英文",
"price": 88,
"pubDate": null,
"classId": 0,
"number": 18,
"addTime": null,
"isbn": "9787111126768"
},
{
"bookId": 0,
"name": "方向",
"author": "马克-安托万·马修 ",
"publish": "后浪丨北京联合出版公司",
"introduction": "《方向》即便在马修的作品中也算得最独特的:不着一字,尽得风流。原作本无一字,标题只是一个→,出版时才加了个书名Sens——既可以指“方向”,也可以指“意义”。 《方向》没有“字”,但有自己的语言——请读者在尽情释放想象力和独立思考之余,破解作者的密码,听听作者对荒诞的看法。",
"language": "中文",
"price": 99.8,
"pubDate": null,
"classId": 0,
"number": 12,
"addTime": null,
"isbn": "9787020125265"
},
{
"bookId": 0,
"name": "画的秘密",
"author": "马克-安托万·马修 ",
"publish": "北京联合出版公司·后浪出版公司",
"introduction": "一本关于友情的疗伤图像小说,直击人内心最为隐秘的情感。 一部追寻艺术的纸上悬疑电影,揭示命运宇宙中奇诡的真相。 ★ 《画的秘密》荣获欧洲第二大漫画节“瑞士谢尔漫画节最佳作品奖”。 作者曾两度夺得安古兰国际漫画节重要奖项。 ★ 《画的秘密》是一部罕见的、结合了拼贴、镜像、3D等叙事手法的实验型漫画作品。作者巧妙地调度光线、纬度、时间、记忆,在一个悬念重重又温情治愈的故事中,注入了一个有关命运的哲学议题。",
"language": "中文",
"price": 60,
"pubDate": null,
"classId": 0,
"number": 21,
"addTime": null,
"isbn": "9787550265608"
},
{
"bookId": 0,
"name": "造彩虹的人",
"author": "东野圭吾 ",
"publish": "北京十月文艺出版社",
"introduction": "其实每个人身上都会发光,但只有纯粹渴求光芒的人才能看到。 从那一刻起,人生会发生奇妙的转折。功一高中退学后无所事事,加入暴走族消极度日;政史备战高考却无法集中精神,几近崩溃;辉美因家庭不和对生活失去勇气,决定自杀。面对糟糕的人生,他们无所适从,直到一天夜里,一道如同彩虹的光闯进视野。 凝视着那道光,原本几乎要耗尽的气力,源源不断地涌了出来。一切又开始充满希望。打起精神来,不能输。到这儿来呀,快来呀——那道光低声呼唤着。 他们追逐着呼唤,到达一座楼顶,看到一个人正用七彩绚烂的光束演奏出奇妙的旋律。 他们没想到,这一晚看到的彩虹,会让自己的人生彻底转...",
"language": "中文",
"price": 39.5,
"pubDate": null,
"classId": 0,
"number": 12,
"addTime": null,
"isbn": "9787530216859"
}
],
"total": 16
}
}
表中一共16条数据,返回的是第一页的数据,可以看到,其实查询了全部记录,然后根据设置的分页参数来决定返回哪一页的数据。
4、小结
这里只是记录了一下PageHelper的简单使用,官方做的这个插件其实功能很强大,以后继续深入了解。