MyBatis 可以使用第三方的插件来对功能进行扩展,分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。
开发步骤:
①首先配置环境
②导入通用 PageHelper 的坐标
③在 mybatis 核心配置文件中配置 PageHelper 插件
④测试分页数据
1、首先在持久层写一个查询全部信息的方法 findAll()
package cn.henu.mapper;
import cn.henu.domain.User;
import java.util.List;
public interface UserMapper {
public List<User> findAll();
}
2、在映射文件中配置查询全部信息的标签
<?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="cn.henu.mapper.UserMapper">
<select id="findAll" resultType="cn.henu.domain.User">
select * from user
</select>
</mapper>
2-1、先写一个测试类,测试一下看能不能查询出全部信息
package cn.henu.test;
import cn.henu.domain.User;
import cn.henu.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest {
//集成分页助手插件,测试分页
@Test
public void test() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
sqlSession.commit();
sqlSession.close();
}
}
查询结果:
User{id=1, username='zhangsan', password='123', birthday=null}
User{id=2, username='lisi', password='123', birthday=null}
User{id=3, username='wangwu', password='123', birthday=null}
User{id=4, username='zhaoliu', password='123', birthday=null}
User{id=5, username='tianqi', password='123', birthday=null}
User{id=6, username='xiaoming', password='123', birthday=Mon Nov 02 11:01:26 CST 2020}
User{id=7, username='wangba', password='123', birthday=Mon Nov 02 11:01:34 CST 2020}
2-2、对应数据库中的信息
接下来开始集成分页插件
3、在 pom.xml 文件中导入通用 PageHelper 的坐标
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<!--解析器-->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>3.2</version>
</dependency>
4、在 mybatis 核心配置文件中配置 PageHelper 插件,告诉 mybatis 我要使用哪个插件
<!--配置分页助手插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/><!--使用mysql的方言,即limit-->
</plugin>
</plugins>
5、在上面写的测试类中修改一些代码即可测试分页数据获取
package cn.henu.test;
import cn.henu.domain.User;
import cn.henu.mapper.UserMapper;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest {
//集成分页助手插件,测试分页
@Test
public void test() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//设置分页相关参数 当前页+每页显示的条数
PageHelper.startPage(1,3);//第一页显示3条数据
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
sqlSession.commit();
sqlSession.close();
}
}
5-1、但是运行之后会报错
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in SQL Mapper Configuration
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.ClassCastException: class com.github.pagehelper.PageHelper cannot be cast to class org.apache.ibatis.plugin.Interceptor (com.github.pagehelper.PageHelper and org.apache.ibatis.plugin.Interceptor are in unnamed module of loader 'app')
这是因为在 pom.xml 文件中导入的 pagehelper 的坐标的版本是 5.2.0 的,但从自4.0.0版本以后就不实现这个接口了,而是实现com.github.pagehelper.PageInterceptor 接口,因此修改为:
<!--配置分页助手插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="mysql"/><!--使用mysql的方言,即limit-->
</plugin>
</plugins>
但是修改为 PageInterceptor 接口之后运行又会报另外一个错误:
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in SQL Mapper Configuration
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: com.github.pagehelper.PageException: java.lang.ClassNotFoundException: mysql
这是因为从4.0.0版本以后已经可以自动识别数据库了,不需要再去指定数据库,因此修改为:
<!-- 配置分页助手插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- <property name="dialect" value="mysql"/><!–使用mysql的方言,即limit–>-->
</plugin>
</plugins>
再执行第5步的测试代码,输出结果为:
对应数据库中的前三条记录:
修改第5步测试代码中的 PageHelper.startPage() 中的参数:
//设置分页相关参数 当前页+每页显示的条数
PageHelper.startPage(2,3);//第二页显示3条数据
运行,输出结果为:
对应数据库中的中间三条记录:
修改第5步测试代码中的 PageHelper.startPage() 中的参数:
//设置分页相关参数 当前页+每页显示的条数
PageHelper.startPage(3,3);//第三页显示3条数据
运行,输出结果为:
对应数据库中的后三条记录(后三条中只有一条数据):
6、获取与分页相关的其他参数
package cn.henu.test;
import cn.henu.domain.User;
import cn.henu.mapper.UserMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest {
//集成分页助手插件,测试分页
@Test
public void test() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//设置分页相关参数 当前页+每页显示的条数
PageHelper.startPage(3,3);
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
//获取与分页相关的参数
PageInfo<User> pageInfo = new PageInfo<User>(userList);
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页显示条数:"+pageInfo.getPageSize());
System.out.println("总条数:"+pageInfo.getTotal());
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("上一页:"+pageInfo.getPrePage());
System.out.println("下一页:"+pageInfo.getNextPage());
System.out.println("是否是第一页:"+pageInfo.isIsFirstPage());
System.out.println("是否是最后一页:"+pageInfo.isIsLastPage());
sqlSession.commit();
sqlSession.close();
}
}