异常
这情况真的是怪得很。
Mybatis使用PageHelper的过程如下:
第一步,导入相关的maven坐标
<!--mybatis-pagehelper分页-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>
第二步,在mybatis的核心配置文件sqlMapConfig.xml中添加插件配置
<!--配置mybatis-pagehelper插件-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用MySQL方言的分页 -->
<property name="helperDialect" value="mysql"/><!--如果使用mysql,这里value为mysql-->
<property name="pageSizeZero" value="true"/>
</plugin>
</plugins>
第三步,进行测试
我们所查询的是查询数据库表中所有记录,所以查询语句如下:
未添加分页的代码如下:
public class Test {
public static void main(String[] args) throws IOException {
// 加载核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 获取SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 生产sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 查询所有
List<User> userList = mapper.findAll();
System.out.println(userList);
// 关闭资源
sqlSession.close();
}
}
添加分页就是添加"PageHelper.startPage(pageNum, pageSize);"代码,其中pageNum指的是当前页码,注意这个页码是从1开始的,pageSize指的是显示多少条记录。
public class Test {
public static void main(String[] args) throws IOException {
// 加载核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 获取SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 生产sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 查询所有,进行分页,页码从1开始
Page page = PageHelper.startPage(1, 2);
List<User> userList = mapper.findAll();
System.out.println(userList);
// 关闭资源
sqlSession.close();
}
}
执行代码,看打印结果,会让人大吃一惊:
我们分页查询的数据不见了,或者说没有打印出来,而打印出来的是Page信息,但很明显是分页成功的了。
不信我们可以打印SQL语句来查看,使用日志打印SQL语句需要配置下:
第一步,导入如下的包:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
第二步,在mybatis的核心配置文件sqlMapConfig.xml中添加如下内容就可以了
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
所以为什么直接打印userList会是这种结果?
所以我们无法获取到结果吗,不是的,看下面的代码:
至于到底是什么原因,还没有探究过,在此记录下此次的情况。
原因
经过评论区博友的提醒,是由于MyBatis的分页插件的版本问题。
在我所使用的5.0.0版本中,Page类继承了ArrayList类,其中toString()方法如下:
public class Page<E> extends ArrayList<E> {
....
public String toString() {
return "Page{count=" + this.count + ", pageNum=" + this.pageNum + ", pageSize=" + this.pageSize + ", startRow=" + this.startRow + ", endRow=" + this.endRow + ", total=" + this.total + ", pages=" + this.pages + ", reasonable=" + this.reasonable + ", pageSizeZero=" + this.pageSizeZero + '}';
}
}
而在5.1.10中toString()方法变成了如下,打印了ArrayList集合中的分页数据,代码如下:
public class Page<E> extends ArrayList<E> implements Closeable {
...
public String toString() {
return "Page{count=" + this.count + ", pageNum=" + this.pageNum + ", pageSize=" + this.pageSize + ", startRow=" + this.startRow + ", endRow=" + this.endRow + ", total=" + this.total + ", pages=" + this.pages + ", reasonable=" + this.reasonable + ", pageSizeZero=" + this.pageSizeZero + '}' + super.toString();
}
}
即区别在这,这就是打印集合内容的方法。
打印结果如下:
解决
所以解决该问题就是将分页插件的版本提升到5.1.10即可,其maven坐标如下:
<!--mybatis-pagehelper分页-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>