fix PageUtil bug

This commit is contained in:
Looly 2020-03-13 16:18:11 +08:00
parent 98cbc875dc
commit a508f2d5aa
11 changed files with 128 additions and 33 deletions

View File

@ -8,6 +8,7 @@
### 新特性 ### 新特性
### Bug修复 ### Bug修复
* 【core 】 修复PageUtil第一页语义不明确的问题issue#782@Github
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
## 5.2.2 ## 5.2.2

View File

@ -2091,7 +2091,7 @@ public class CollUtil {
* 采用{@link BoundedPriorityQueue}实现分页取局部 * 采用{@link BoundedPriorityQueue}实现分页取局部
* *
* @param <T> 集合元素类型 * @param <T> 集合元素类型
* @param pageNo 页码1开始计数0和1效果相同 * @param pageNo 页码0开始计数0表示第一页
* @param pageSize 每页的条目数 * @param pageSize 每页的条目数
* @param comparator 比较器 * @param comparator 比较器
* @param colls 集合数组 * @param colls 集合数组
@ -2114,7 +2114,7 @@ public class CollUtil {
* 对指定List分页取值 * 对指定List分页取值
* *
* @param <T> 集合元素类型 * @param <T> 集合元素类型
* @param pageNo 页码1开始计数0和1效果相同 * @param pageNo 页码0开始计数0表示第一页
* @param pageSize 每页的条目数 * @param pageSize 每页的条目数
* @param list 列表 * @param list 列表
* @return 分页后的段落内容 * @return 分页后的段落内容

View File

@ -1753,6 +1753,79 @@ public class DateUtil {
} }
/**
* 计时器<br>
* 计算某个过程花费的时间精确到毫秒
*
* @param isNano 是否使用纳秒计数false则使用毫秒
* @return Timer
* @since 5.2.3
*/
public static TimeInterval timer(boolean isNano) {
return new TimeInterval(isNano);
}
/**
* 创建秒表{@link StopWatch}用于对代码块的执行时间计数
* <p>
* 使用方法如下
*
* <pre>
* StopWatch stopWatch = DateUtil.createStopWatch();
*
* // 任务1
* stopWatch.start("任务一");
* Thread.sleep(1000);
* stopWatch.stop();
*
* // 任务2
* stopWatch.start("任务一");
* Thread.sleep(2000);
* stopWatch.stop();
*
* // 打印出耗时
* Console.log(stopWatch.prettyPrint());
*
* </pre>
*
* @return {@link StopWatch}
* @since 5.2.3
*/
public static StopWatch createStopWatch() {
return new StopWatch();
}
/**
* 创建秒表{@link StopWatch}用于对代码块的执行时间计数
* <p>
* 使用方法如下
*
* <pre>
* StopWatch stopWatch = DateUtil.createStopWatch("任务名称");
*
* // 任务1
* stopWatch.start("任务一");
* Thread.sleep(1000);
* stopWatch.stop();
*
* // 任务2
* stopWatch.start("任务一");
* Thread.sleep(2000);
* stopWatch.stop();
*
* // 打印出耗时
* Console.log(stopWatch.prettyPrint());
*
* </pre>
*
* @param id 用于标识秒表的唯一ID
* @return {@link StopWatch}
* @since 5.2.3
*/
public static StopWatch createStopWatch(String id) {
return new StopWatch(id);
}
/** /**
* 生日转为年龄计算法定年龄 * 生日转为年龄计算法定年龄
* *

View File

@ -14,10 +14,17 @@ public class TimeInterval implements Serializable {
private long time; private long time;
private boolean isNano; private boolean isNano;
/**
* 构造默认使用毫秒计数
*/
public TimeInterval() { public TimeInterval() {
this(false); this(false);
} }
/**
* 构造
* @param isNano 是否使用纳秒计数false则使用毫秒
*/
public TimeInterval(boolean isNano) { public TimeInterval(boolean isNano) {
this.isNano = isNano; this.isNano = isNano;
start(); start();

View File

@ -14,25 +14,25 @@ public class PageUtil {
* 例如 * 例如
* *
* <pre> * <pre>
* 页码1每页10 = 0 * 页码0每页10 = 0
* 页码2每页10 = 10 * 页码1每页10 = 10
* *
* </pre> * </pre>
* *
* @param pageNo 页码1计数 * @param pageNo 页码0计数
* @param pageSize 每页条目数 * @param pageSize 每页条目数
* @return 开始位置 * @return 开始位置
*/ */
public static int getStart(int pageNo, int pageSize) { public static int getStart(int pageNo, int pageSize) {
if (pageNo < 1) { if (pageNo < 0) {
pageNo = 1; pageNo = 0;
} }
if (pageSize < 1) { if (pageSize < 1) {
pageSize = 0; pageSize = 0;
} }
return (pageNo - 1) * pageSize; return pageNo * pageSize;
} }
/** /**
@ -41,12 +41,12 @@ public class PageUtil {
* 例如 * 例如
* *
* <pre> * <pre>
* 页码1每页10 = [0, 10] * 页码0每页10 = [0, 10]
* 页码2每页10 = [10, 20] * 页码1每页10 = [10, 20]
* *
* </pre> * </pre>
* *
* @param pageNo 页码1计数 * @param pageNo 页码0计数
* @param pageSize 每页条目数 * @param pageSize 每页条目数
* @return 第一个数为开始位置第二个数为结束位置 * @return 第一个数为开始位置第二个数为结束位置
*/ */

View File

@ -18,6 +18,7 @@ import java.util.LinkedHashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
/** /**
@ -39,7 +40,7 @@ public class CollUtilTest {
Dict v1 = Dict.create().set("id", 12).set("name", "张三").set("age", 23); Dict v1 = Dict.create().set("id", 12).set("name", "张三").set("age", 23);
Dict v2 = Dict.create().set("age", 13).set("id", 15).set("name", "李四"); Dict v2 = Dict.create().set("age", 13).set("id", 15).set("name", "李四");
final String[] keys = v1.keySet().toArray(new String[v1.size()]); final String[] keys = v1.keySet().toArray(new String[0]);
ArrayList<Object> v1s = CollectionUtil.valuesOfKeys(v1, keys); ArrayList<Object> v1s = CollectionUtil.valuesOfKeys(v1, keys);
Assert.assertTrue(v1s.contains(12)); Assert.assertTrue(v1s.contains(12));
Assert.assertTrue(v1s.contains(23)); Assert.assertTrue(v1s.contains(23));
@ -345,6 +346,7 @@ public class CollUtilTest {
@Test @Test
public void getTest() { public void getTest() {
@SuppressWarnings("RedundantArrayCreation")
HashSet<String> set = CollUtil.newHashSet(true, new String[] { "A", "B", "C", "D" }); HashSet<String> set = CollUtil.newHashSet(true, new String[] { "A", "B", "C", "D" });
String str = CollUtil.get(set, 2); String str = CollUtil.get(set, 2);
Assert.assertEquals("C", str); Assert.assertEquals("C", str);
@ -546,8 +548,8 @@ public class CollUtilTest {
@Test @Test
public void sortPageAllTest() { public void sortPageAllTest() {
ArrayList<Integer> list = CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9); List<Integer> list = CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> sortPageAll = CollUtil.sortPageAll(2, 5, Comparator.reverseOrder(), list); List<Integer> sortPageAll = CollUtil.sortPageAll(1, 5, Comparator.reverseOrder(), list);
Assert.assertEquals(CollUtil.newArrayList(4, 3, 2, 1), sortPageAll); Assert.assertEquals(CollUtil.newArrayList(4, 3, 2, 1), sortPageAll);
} }
@ -583,7 +585,7 @@ public class CollUtilTest {
Map<String, Integer> map = CollUtil.zip(keys, values); Map<String, Integer> map = CollUtil.zip(keys, values);
Assert.assertEquals(4, map.size()); Assert.assertEquals(4, Objects.requireNonNull(map).size());
Assert.assertEquals(1, map.get("a").intValue()); Assert.assertEquals(1, map.get("a").intValue());
Assert.assertEquals(2, map.get("b").intValue()); Assert.assertEquals(2, map.get("b").intValue());

View File

@ -49,7 +49,7 @@ public class Page implements Serializable {
/** /**
* 构造 * 构造
* *
* @param pageNumber 页码 * @param pageNumber 页码0表示第一页
* @param numPerPage 每页结果数 * @param numPerPage 每页结果数
* @param order 排序对象 * @param order 排序对象
*/ */
@ -61,7 +61,7 @@ public class Page implements Serializable {
// ---------------------------------------------------------- Getters and Setters start // ---------------------------------------------------------- Getters and Setters start
/** /**
* @return 页码 * @return 页码0表示第一页
*/ */
public int getPageNumber() { public int getPageNumber() {
return pageNumber; return pageNumber;
@ -157,10 +157,14 @@ public class Page implements Serializable {
/** /**
* 开始位置和结束位置<br> * 开始位置和结束位置<br>
* 例如<br> * 例如
* 页码1每页10 = [0, 10]<br> *
* 页码2每页10 = [10, 20]<br> * <pre>
* <br> * 页码0每页10 = [0, 10]
* 页码1每页10 = [10, 20]
* 页码2每页10 = [21, 30]
*
* </pre>
* *
* @return 第一个数为开始位置第二个数为结束位置 * @return 第一个数为开始位置第二个数为结束位置
*/ */

View File

@ -16,7 +16,7 @@ public class PageResult<T> extends ArrayList<T> {
public static final int DEFAULT_PAGE_SIZE = Page.DEFAULT_PAGE_SIZE; public static final int DEFAULT_PAGE_SIZE = Page.DEFAULT_PAGE_SIZE;
/** /**
* 页码 * 页码0表示第一页
*/ */
private int page; private int page;
/** /**
@ -44,7 +44,7 @@ public class PageResult<T> extends ArrayList<T> {
/** /**
* 构造 * 构造
* *
* @param page 页码 * @param page 页码0表示第一页
* @param pageSize 每页结果数 * @param pageSize 每页结果数
*/ */
public PageResult(int page, int pageSize) { public PageResult(int page, int pageSize) {
@ -57,7 +57,7 @@ public class PageResult<T> extends ArrayList<T> {
/** /**
* 构造 * 构造
* *
* @param page 页码 * @param page 页码0表示第一页
* @param pageSize 每页结果数 * @param pageSize 每页结果数
* @param total 结果总数 * @param total 结果总数
*/ */
@ -72,14 +72,16 @@ public class PageResult<T> extends ArrayList<T> {
//---------------------------------------------------------- Getters and Setters start //---------------------------------------------------------- Getters and Setters start
/** /**
* @return 页码 * 页码0表示第一页
*
* @return 页码0表示第一页
*/ */
public int getPage() { public int getPage() {
return page; return page;
} }
/** /**
* 设置页码 * 设置页码0表示第一页
* *
* @param page 页码 * @param page 页码
*/ */

View File

@ -28,6 +28,15 @@ public class DbTest {
Assert.assertEquals("王五", find.get(0).get("name")); Assert.assertEquals("王五", find.get(0).get("name"));
} }
@Test
public void pageTest() throws SQLException {
// 测试数据库中一共4条数据第0页有3条第1页有1条
List<Entity> page0 = Db.use().page(Entity.create("user"), 0, 3);
Assert.assertEquals(3, page0.size());
List<Entity> page1 = Db.use().page(Entity.create("user"), 1, 3);
Assert.assertEquals(1, page1.size());
}
@Test @Test
public void findLikeTest() throws SQLException { public void findLikeTest() throws SQLException {
// 方式1 // 方式1

View File

@ -1,15 +1,12 @@
package cn.hutool.db; package cn.hutool.db;
import java.sql.SQLException; import cn.hutool.db.pojo.User;
import java.util.List;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import cn.hutool.db.Db; import java.sql.SQLException;
import cn.hutool.db.Entity; import java.util.List;
import cn.hutool.db.pojo.User;
/** /**
* Entity测试 * Entity测试

View File

@ -134,7 +134,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId> <artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version> <version>3.2.1</version>
<executions> <executions>
<execution> <execution>
<id>oss</id> <id>oss</id>