更新历史日志

.

更新日志

4.2.1 - 2016-12-11

  • 解决SimpleCache类遗留问题导致的错误 #143 fix by dhhua

4.2.0 - 2016-12-09

  • 使用新的方式进行分页,4.2版本是从5.0版本分离出来的一个特殊版本,这个版本兼容4.x的所有功能,5.0版本时为了简化分页逻辑,会去掉部分功能,所以4.2是4.x的最后一个版本。
  • 支持 MyBatis 3.1.0+ 版本
  • 增加对 Derby 数据库的支持
  • 对除 informix 外的全部数据库进行测试,全部通过
  • PageHelper增加手动清除方法clearPage()
  • 解决 SqlServer 多个with(nolock)时出错的问题
  • 对CountMappedStatement 进行缓存,配置方式见BaseSqlUtil 319行
  • 由于SqlServer的sql处理特殊,因此增加了两个SQL缓存,具体配置参考SqlServerDialect类
  • 添加 sqlserver 别名进行排序功能,在解析sql时,会自动将使用的别名转换成列名 by panmingzhi
  • 新增sqlCacheClass参数,该参数可选,可以设置sql缓存实现类,默认为SimpleCache,当项目包含guava时,使用GuavaCache,也可以通过参数sqlCacheClass指定自己的实现类,有关详情看com.github.pagehelper.cache包。
  • 解决#135,增加/keep orderby/注解,SQL中包含该注释时,count查询时不会移出order by
  • sqlserver没有orderby时,使用order by rand() #82 #118

4.1.6 - 2016-06-05

  • 通过间接处理字符串解决SqlServer中不支持with(nolock)的问题#86,详情可以看SqlServerParserSqlServer2012Dialect

4.1.5 - 2016-05-29

  • 更新PageProviderSqlSource,支持3.4.0版本的Provider注解方式的分页#102
  • 解决SqlUtil未初始化PARAMS属性导致的错误

4.1.4 - 2016-05-12

  • 解决closeConn未设置时,默认值被覆盖变成false的问题#97
  • closeConn不只对动态数据源有效,当没有设置dialect属性自动获取数据库类型的时候同样有效
  • 解决关闭tomcat的时候提示线程安全问题#98,这个问题不会导致内存溢出,已经增加处理

4.1.3 - 2016-03-31

  • 解决反射类没有完全捕获异常的问题#94
  • 把SqlServer类所有private都改成了protected,方便继承修改#93

4.1.2 - 2016-03-06

  • 增加可配参数closeConn,当使用动态数据源时,分页插件获取jdbcUrl后,控制是否关闭当前连接,默认true关闭
  • count查询改为count(0),分库分表情况下的效率可能更高

4.1.1 - 2016-01-05:

  • 解决动态数据源时获取连接后未关闭的严重bug#80
  • 解决动态数据源时SqlSource和parser绑定导致不能切换方言的问题

4.1.0 - 2015-12-30:

  • 增加autoRuntimeDialect参数,允许在运行时根据多数据源自动识别对应方言的分页(暂时不支持自动选择sqlserver2012,只能使用sqlserver)。
  • 去掉了4.0.3版本增加的returnPageInfo参数,接口返回值不支持PageInfo类型,可以使用下面ISelect中演示的方法获取
  • 增加对SqlServer2012的支持,需要手动指定dialect=sqlserver2012,否则会使用2005的方式进行分页
  • jsqlparser升级到0.9.4版本,使用jar包时必须用最新的0.9.4版本,使用Maven会自动依赖0.9.4
  • 增加ISelect接口,方便调用,使用方法可以参考src/test/java/com.github.pagehelper.test.basic.TestISelect测试。

使用该接口可以参考如下用法(返回值为PagePageInfo):

//jdk6,7用法,创建接口
Page<Country> page = PageHelper.startPage(1, 10).setOrderBy("id desc").doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectGroupBy();
    }
});
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).setOrderBy("id desc").doSelectPage(()-> countryMapper.selectGroupBy());
//为了说明可以链式使用,上面是单独setOrderBy("id desc"),也可以直接如下
Page<Country> page = PageHelper.startPage(1, 10, "id desc").doSelectPage(()-> countryMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).setOrderBy("id desc").doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectGroupBy();
    }
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).setOrderBy("id desc").doSelectPageInfo(() -> countryMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectLike(country);
    }
});
//lambda
total = PageHelper.count(()->countryMapper.selectLike(country));

4.0.3 - 2015-11-09:

  • PageHelper新增3个offsetPage方法,参数主要是offsetlimit,允许不规则分页

  • 新增两个可配参数supportMethodsArgumentsreturnPageInfo(该参数在4.1.0版本去掉),具体含义和用法请看如何使用分页插件中的参数介绍

4.0.2 - 2015-11-02

  • 简化Page<E>类,包含排序条件orderBy

  • dialect参数是数据库名称时不区分大小写

  • dialect参数可以设置为实现com.github.pagehelper.parser.Parser接口的实现类全限定名称

  • 增加对h2数据库的支持

  • OrderByHelper(排序插件)融合到PageHelper中,移除OrderByHelper

  • 该版本调整比较大,但对开发人员影响较小,为以后扩展和完善提供方便

4.0.1 -2015-09-10

4.0.0 - 2015-07-13

  • 配置属性dialect不在强制要求,可以不写,分页插件会自动判断

  • 解决从request中获取分页参数时的错误,感谢探路者☆

  • PageInfo增加空构造方法,所有属性增加setter方法

  • 增加对排序的支持

  • 可以单独使用PageHelper.orderBy(String orderBy)对查询语句增加排序,也可以配合startPage的其他方法使用

  • 可以使用PageHelper.startPage(int start,int size,String orderBy)对分页查询进行排序

  • 修改分页查询的处理逻辑,主要是将原sqlSource包装成可以分页和排序的sqlSource

3.7.5 - 2015-06-12

  • 增加对MyBatis3.2.0以上版本的校验,如果是不是3.2.0以上版本,会抛出异常提示

  • 解决3.7.1更新中实际没有解决的入参为不可变Map类型时的错误

3.7.4 - 2015-05-26

  • 为了支持3.3.0去掉了分页插件自带的SytemObjectMetaObject类(该类在早期版本为了支持3.2.0以前的MyBatis)

  • 最新支持MyBatis - 3.2.0到最新3.3.0版本

3.7.3 - 2015-05-22

  • Page继承的ArrayList,会根据pageSize初始化大小,这就导致当pageSize过大(如Integer.MAX_VALUE),实际数据量很小时的内存溢出,此处改为初始化大小为0的List

  • 当想查询某页后面的全部数据时,可以使用PageHelper.startPage(pageNum, Integer.MAX_VALUE)进行分页,RowBounds(offset, Integer.MAX_VALUE)一样。

  • 针对PageHelper.startPage(1, Integer.MAX_VALUE)优化,会取消分页,直接查询全部数据(能起到pageSizeZero参数所起的作用)。

  • 针对RowBounds(0, Integer.MAX_VALUE)优化,会取消分页,直接查询全部数据(能起到pageSizeZero参数所起的作用)。

3.7.2 - 2015-05-13

  • jsqlparser解析sql会抛出Error异常,由于只捕获Exception,所以导致部分解析失败的sql无法使用嵌套方式处理,所以修改为捕获Throwable

3.7.1 - 2015-05-05

  • 增加Infomix数据库支持,设置dialect值为infomix即可
  • 解决入参为不可变Map类型时的错误

3.7.0 - 2015-04-21

  • 由于orderby参数经常被错误认为的使用,因此该版本全面移除了orderby
  • Page<E>移除orderby属性
  • PageHelperstartPage方法中,移除包含orderby参数的方法,sqlserver相关包含该参数的全部移除
  • 对SqlServer进行分页查询时,请在sql中包含order by语句,否则会抛出异常
  • offsetAsPageNum=false的时候,由于PageNum问题,RowBounds查询的时候reasonable会强制为false,已解决
  • 少数情况下的select中包含单个函数查询时,会使用嵌套的count查询

3.6.4 - 2015-04-05

  • 重构,将原来的内部类全部独立出来,尤其是Parser接口以及全部实现。 现在可以直接使用Parser,使用方法如下:
   String originalSql = "Select * from country o where id > 10 order by id desc ";

   Parser parser = AbstractParser.newParser("mysql");
   //获取count查询sql
   String countSql = parser.getCountSql(originalSql);
   //获取分页sql,这种方式不适合sqlserver数据库
   String pageSql = parser.getPageSql(originalSql);

   //sqlserver用下面的方法
   SqlServer sqlServer = new SqlServer();
   pageSql = sqlServer.convertToPageSql(originalSql, 1, 10);

3.6.3 - 2015-03-10

  • 解决了一个潜在的bug,对通用Mapper中的SqlMapper进行分页时,需要使用这个版本

3.6.2 - 2015-03-09

  • 本次更新只是增加了一个异常提示,当错误的配置了多个分页插件时,会有更友好的错误提示:

分页插件配置错误:请不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!

3.6.1 - 2015-02-28

  • 解决select distinct导致count查询结果不正确的bug#35

  • 完善测试

3.6.0 - 2015-02-03

  • 支持db2数据库

  • 支持sqlserver(2005+)数据库

  • sqlserver注意事项:

    • 请先保证你的SQL可以执行
    • sql中最好直接包含order by,可以自动从sql提取
    • 如果没有order by,可以通过入参提供,但是需要自己保证正确(3.7.0版本以后,移除了该参数,请在sql中包含order by)
    • 如果sql有order by,可以通过orderby参数覆盖sql中的order by
    • order by的列名不能使用别名(UNION,INTERSECT,MINUS,EXCEPT等复杂sql不受限制,具体可以自己尝试)
    • 表和列使用别名的时候不要使用单引号(‘)
  • 简单修改结构

  • startPage方法返回值从void改为Page,获取Page后可以修改参数值

  • Page增加一个针对sqlserver的属性orderBy(3.7.0版本以后,移除了该属性),用法看上面的注意事项

  • Page增加了一个链式赋值的方法,可以像下面这样使用: PageHelper.startPage(1,10).count(false).reasonable(true).pageSizeZero(false)

  • PageHelper增加了startPage(int pageNum, int pageSize,String orderBy)方法(3.7.0版本以后,移除了该方法),针对sqlserver

3.5.1 - 2015-01-20

  • 解决bug#25,当参数是null并且是动态查询时,由于加入分页参数,导致参数不在是null,因而会导致部分判断出错,导致异常。

  • 上面这个bug会影响使用了动态标签并且允许入参为null的所有查询,虽然并不常见,但是建议各位使用最新版本

3.5.0 - 2015-01-11

  • 增加更丰富的调用方法#23
    • startPage(int pageNum, int pageSize)
    • startPage(int pageNum, int pageSize, boolean count)
    • +startPage(int pageNum, int pageSize, boolean count, Boolean reasonable)
    • +startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero)
    • +startPage(Object params)注:只能是MapServletRequest类型

参数中的reasonablepageSizeZero都可以覆盖默认配置,如果传null会用默认配置。

  • 为了支持startPage(Object params)方法,增加了一个params参数来配置参数映射,用于从MapServletRequest中取值,详细内容看文档下面的具体介绍。

  • 解决一个<foreach>标签使用对象内部属性循环时的bug#24

3.4.2 - 2014-12-27

  • PageInfo中的judgePageBoudary方法修改: java isLastPage = pageNum == pages && pageNum != 1; //改为 isLastPage = pageNum == pages;

3.4.1 - 2014-12-24

  • 重大bug修复,SqlParser解析sql失败的时候返回了不带count(*)的sql,导致查询失败。

  • 产生原因,由于SqlParser在系统中出现的位置修改后,导致这里出现错误。

  • 强烈推荐各位更新到最新版本。

v3.4.0 - 2014-12-18

  • 增加了对@SelectProvider注解方法的支持,不使用这种方式的不影响

  • 对基本逻辑进行修改,减少反射调用和获取BoundSql次数

v3.3.2 - 2014-12-10

  • PageInfo 增加序列化。

v3.3.1bug修复 - 2014-12-07

  • 动态sql时,判断条件不会出现在ParameterMappings中,会导致获取不到属性。通常是因为判断条件中的属性没有出现在#{}中。

v3.3.0

  1. MappedStatement对象进行缓存,包括count查询的MappedStatement以及分页查询的MappedStatement,分页查询改为预编译查询。

  2. 独立的SqlUtil类,由于原来的PageHelper太复杂,因此将拦截器外的其他代码独立到SqlUtil中,方便查看代码和维护。SqlUtil中增加Parser接口,提供一个抽象的SimpleParser实现,不同数据库的分页代码通过继承SimpleParser实现。

  3. 特殊的Parser实现类SqlParser类,这是一个独立的java类,主要提供了更高性能的count查询sql,可以根据sql自动改为count(*)查询,自动去除不需要的order by语句,如果需要使用该类,只要把该类放到SqlUtil类相同的包下即可,同时需要引入Jar包jsqlparser-0.9.1.jar

  4. 增强的PageInfo类,PageInfo类包含了分页几乎所有需要用到的属性值,减少了对分页逻辑的过多投入。

  5. 分页合理化,自动处理pageNum的异常情况。例如当pageNum<=0时,会设置pageNum=1,然后查询第一页。当pageNum>pages(总页数)时,自动将pageNum=pages,查询最后一页。

  6. 增加对PostgreSQL,MariaDB,SQLite支持。其中MariaDB,SQLiteMysql分页一样。

v3.2.3

  1. 解决mysql带有for update时分页错误的问题。

  2. pageSize(或RowBoundslimit<=0 时不再进行分页查询,只会进行count查询(RowBounds需要配置进行count查询),相当于用分页查询来做count查询了。

  3. 增加了pageSizeZero参数,当pageSizeZero=true时,如果pageSize=0(或RowBounds.limit=0),就会查询全部的结果。这个参数对于那些在特殊情况下要查询全部结果的人有用。配置该参数后会与上面第二条冲突,解决方法就是如果只想查询count,就设置pageSize<0(如 -1),只要不等于0(或者不配置pageSizeZero)就不会出现全部查询的情况。

  4. 这个版本没有包含count查询时自动去除order by的功能,这个功能将会添加到3.3.0版本中。

  5. 为了便于本项目的统一管理和发布,本项目会和github上面同步,项目会改为Maven管理的结构。

v3.2.2

  1. 简单重构优化代码。

  2. 新增PageInfo包装类,对分页结果Page进行封装,方便EL使用。

  3. SystemMetaObject类的fromObject方法内置到分页插件中,方便低版本的Mybatis使用该插件。

v3.2.1

  1. 新增offsetAsPageNum参数,用来控制RowBounds中的offset是否作为pageNum使用,pageNumstartPage中的含义相同,pageNum是页码。该参数默认为false,使用默认值时,不需要配置该参数。

  2. 新增rowBoundsWithCount参数,用来控制使用RowBounds时是否执行count查询。该参数默认为false,使用默认值时,不需要配置该参数。

v3.2.0

  1. 增加了对Hsqldb的支持,主要目的是为了方便测试使用Hsqldb

  2. 增加了该项目的一个测试项目Mybatis-Sample,测试项目数据库使用Hsqldb

  3. 增加MIT协议

v3.1.2

  1. 解决count sql在oracle中的错误

v3.1.1

  1. 统一返回值为Page<E>(可以直接按List使用),方便在页面使用EL表达式,如${page.pageNum},${page.total}

v3.1.0

  1. 解决了RowBounds分页的严重BUG,原先会在物理分页基础上进行内存分页导致严重错误,已修复

  2. 增加对MySql的支持,该支持由鲁家宁增加。

v3.0

  1. 现在支持两种形式的分页,使用PageHelper.startPage方法或者使用RowBounds参数

  2. PageHelper.startPage方法修改,原先的startPage(int pageNum, int pageSize)默认求count,新增的startPage(int pageNum, int pageSize, boolean count)设置count=false可以不执行count查询

  3. 移除endPage方法,现在本地变量localPage改为取出后清空本地变量。

  4. 修改Page<E>类,继承ArrayList<E>

  5. 关于两种形式的调用,请看示例代码

v2.1

  1. 解决并发异常

  2. 分页sql改为直接拼sql

v2.0

  1. 支持Mybatis缓存,count和分页同时支持(二者同步)

  2. 修改拦截器签名,拦截Executor

  3. Page<E>类移到外面,方便调用

v1.0

  1. 支持<foreach>等标签的分页查询

  2. 提供便捷的使用方式