<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分开放