<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.4</version>
</dependency>
在mybatis核心配置文件中配置插件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
编写业务逻辑代码
使用pagehelper非常的简单,只需要在你想要分页的查询逻辑前添加一行代码即可,代码:
[ ] PageHelper.startPage(pageNum, pageSize);
[ ] pageNum:页数(第几页)
[ ] pageSize:每页的数据行数
[ ] PageInfo < UserLinkInfoResp > page = new PageInfo < >(userLinkInfoRespList);
PageInfo其实是pagehelper 封装的一个类,里面有一些 分页表常用的属性
pageNum:当前为第几页
pageSize:每页的数据行数
startRow:当前页数据从第几条开始
endRow:当前页数据从第几条结束
pages:总页数
prePage:上一页页数
nextPage:下一页页数
hasPreviousPage:是否有上一页
hasNextPage:是否有下一页
navigatepageNums:所有页码的数组
try {
//分页处理,显示第一页的5条数据
PageHelper.startPage(1, 5);
List<Country> countryList=session.selectList("selectAll");
countryList.forEach(System.out::println);
// 取分页信息
PageInfo<Country> pageInfo = new PageInfo<Country>(countryList);
long total = pageInfo.getTotal(); //获取总记录数
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭session
session.close();
}
spring boot 配置PageHelper方言
在项目配置文件application.properties配置pagehelper方言为mysql
pagehelper.helper-dialect=mysql
controller
@RequestMapping("/list")
public String list (@RequestParam(defaultValue = "asc") String order,@RequestParam(defaultValue = "1")int offset,@RequestParam(defaultValue = "10")int limit,Model model) {
PageInfo<Account> page = accSrv.findAllByPage(offset,limit,order);
model.addAttribute("page", page);
return "list";
}
public PageInfo<Account> findAllByPage(int offset, int limit, String order) {
PageHelper.startPage(offset, limit);
AccountExample example = new AccountExample();
example.setOrderByClause("id " + order);
List<Account> list = mapper.selectByExample(example );
return new PageInfo<Account>(list);
}
pagehelper 源码(ThreadLocal)
PageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,
也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息所以在多线程环境下,
各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句,
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,
并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句。
源码:找到startPage代码:
public PageInfo<TsysTables> list(Tablepar tablepar,String searchText){
PageHelper.startPage(tablepar.getPage(), tablepar.getLimit());
List<TsysTables> list= generatorMapper.queryList(searchText);
PageInfo<TsysTables> pageInfo = new PageInfo<TsysTables>(list);
return pageInfo;
}
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
Page<E> oldPage = getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
setLocalPage(page);
return page;
}
- 这里重要的代码: setLocalPage(page)
public abstract class PageMethod {
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
protected static boolean DEFAULT_COUNT = true;
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
public static <T> Page<T> getLocalPage() {
return LOCAL_PAGE.get();
}
}
- 所以PageHelper就是使用ThreadLocal存储了Page对象,在这个对象中有我们设置的pageNum、pageSize,也会查询返回的pages、total
JSON相关操作
对象转字符串
JSON.stringify(data)
字符串转对象
JSON.parse(jsonBook);
常见错误
The alias 'GeneratedCriteria' is already mapped to the value
由mybatis.type-aliases-package=com.osvue.springboot.mapper引起
解决方法:把实体类和Example分开放