Browse Source

fix PageUtil bug

Looly 5 years ago
parent
commit
a508f2d5aa

+ 1 - 0
CHANGELOG.md

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

+ 2 - 2
hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java

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

+ 73 - 0
hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java

@@ -1754,6 +1754,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);
+	}
+
+	/**
 	 * 生日转为年龄,计算法定年龄
 	 *
 	 * @param birthDay 生日,标准日期字符串

+ 7 - 0
hutool-core/src/main/java/cn/hutool/core/date/TimeInterval.java

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

+ 9 - 9
hutool-core/src/main/java/cn/hutool/core/util/PageUtil.java

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

+ 6 - 4
hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java

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

+ 10 - 6
hutool-db/src/main/java/cn/hutool/db/Page.java

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

+ 7 - 5
hutool-db/src/main/java/cn/hutool/db/PageResult.java

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

+ 9 - 0
hutool-db/src/test/java/cn/hutool/db/DbTest.java

@@ -29,6 +29,15 @@ public class DbTest {
 	}
 
 	@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
 	public void findLikeTest() throws SQLException {
 		// 方式1
 		List<Entity> find = Db.use().find(Entity.create("user").set("name", "like 王%"));

+ 3 - 6
hutool-db/src/test/java/cn/hutool/db/FindBeanTest.java

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

+ 1 - 1
pom.xml

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