From e13983d1824dfcb2b5ac8303107d6f543921a83f Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 27 May 2023 00:13:27 +0800 Subject: [PATCH] fix code --- .../org/dromara/hutool/db/AbstractDb.java | 16 +++++ .../org/dromara/hutool/db/DialectRunner.java | 25 ++++--- .../org/dromara/hutool/db/PageResult.java | 14 ++++ .../hutool/db/handler/PageResultHandler.java | 67 ++++++++++++------- .../dromara/hutool/db/IssueI73770Test.java | 23 ++++++- 5 files changed, 105 insertions(+), 40 deletions(-) diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/AbstractDb.java b/hutool-db/src/main/java/org/dromara/hutool/db/AbstractDb.java index ecb1a7d34..99c00235c 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/AbstractDb.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/AbstractDb.java @@ -735,6 +735,22 @@ public abstract class AbstractDb> extends DefaultConnect // region ----- page + /** + * 分页查询,结果为Bean列表,不计算总数
+ * + * @param Bean类型 + * @param sql SQL构建器,可以使用{@link SqlBuilder#of(CharSequence)} 包装普通SQL + * @param page 分页对象 + * @param elementBeanType 结果集处理对象 + * @param params 参数 + * @return 结果对象 + */ + public PageResult pageForBeanResult(final CharSequence sql, final Page page, + final Class elementBeanType, final Object... params) { + final PageResult result = new PageResult<>(page, (int) count(sql, params)); + return page(sql, page, PageResultHandler.of(elementBeanType, result), params); + } + /** * 分页查询,结果为Bean列表,不计算总数
* diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java b/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java index 157993775..557b069b2 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java @@ -12,11 +12,11 @@ package org.dromara.hutool.db; +import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.text.StrUtil; -import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.db.dialect.Dialect; import org.dromara.hutool.db.dialect.DialectFactory; import org.dromara.hutool.db.handler.NumberHandler; @@ -306,8 +306,8 @@ public class DialectRunner implements Serializable { } try { return SqlExecutor.queryAndClosePs(dialect.psForCount(conn, - SqlBuilder.of(selectSql).addParams(sqlBuilder.getParamValueArray())), - new NumberHandler()).longValue(); + SqlBuilder.of(selectSql).addParams(sqlBuilder.getParamValueArray())), + new NumberHandler()).longValue(); } catch (final SQLException e) { throw new DbRuntimeException(e); } @@ -324,12 +324,11 @@ public class DialectRunner implements Serializable { */ public PageResult page(final Connection conn, final Query query) throws DbRuntimeException { final Page page = query.getPage(); - final PageResultHandler pageResultHandler = new PageResultHandler( - new PageResult<>(page.getPageNumber(), page.getPageSize(), - // 分页查询中总数的查询要去掉分页信息 - (int) count(conn, query.clone().setPage(null))), - this.caseInsensitive); - return page(conn, query, pageResultHandler); + final PageResultHandler entityResultHandler = PageResultHandler.of( + // 分页查询中总数的查询要去掉分页信息 + new PageResult<>(page, (int) count(conn, query.clone().setPage(null)))); + + return page(conn, query, entityResultHandler.setCaseInsensitive(caseInsensitive)); } /** @@ -367,10 +366,10 @@ public class DialectRunner implements Serializable { * @throws DbRuntimeException SQL执行异常 */ public PageResult page(final Connection conn, final SqlBuilder sqlBuilder, final Page page) throws DbRuntimeException { - final PageResultHandler pageResultHandler = new PageResultHandler( - new PageResult<>(page.getPageNumber(), page.getPageSize(), (int) count(conn, sqlBuilder)), - this.caseInsensitive); - return page(conn, sqlBuilder, page, pageResultHandler); + final PageResultHandler entityResultHandler = PageResultHandler.of( + new PageResult<>(page, (int) count(conn, sqlBuilder))); + + return page(conn, sqlBuilder, page, entityResultHandler.setCaseInsensitive(caseInsensitive)); } /** diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/PageResult.java b/hutool-db/src/main/java/org/dromara/hutool/db/PageResult.java index 29b13d345..9684949fe 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/PageResult.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/PageResult.java @@ -25,6 +25,9 @@ import java.util.ArrayList; public class PageResult extends ArrayList { private static final long serialVersionUID = 9056411043515781783L; + /** + * 默认每页结果数 + */ public static final int DEFAULT_PAGE_SIZE = Page.DEFAULT_PAGE_SIZE; /** @@ -66,6 +69,17 @@ public class PageResult extends ArrayList { this.pageSize = pageSize <= 0 ? DEFAULT_PAGE_SIZE : pageSize; } + /** + * 构造 + * + * @param page 分页对象 + * @param total 结果总数 + * @since 6.0.0 + */ + public PageResult(final Page page, final int total) { + this(page.getPageNumber(), page.getPageSize(), total); + } + /** * 构造 * diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/handler/PageResultHandler.java b/hutool-db/src/main/java/org/dromara/hutool/db/handler/PageResultHandler.java index 7ff94f051..e71d9d816 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/handler/PageResultHandler.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/handler/PageResultHandler.java @@ -21,52 +21,71 @@ import java.sql.SQLException; /** * 分页结果集处理类 ,处理出的结果为PageResult * + * @param Bean类型 * @author loolly */ -public class PageResultHandler implements RsHandler> { - private static final long serialVersionUID = -1474161855834070108L; +public class PageResultHandler implements RsHandler> { + private static final long serialVersionUID = 1L; - private final PageResult pageResult; + private final Class beanClass; + private final PageResult pageResult; /** * 是否大小写不敏感 */ - private final boolean caseInsensitive; + private boolean caseInsensitive; /** - * 创建一个 EntityHandler对象
- * 结果集根据给定的分页对象查询数据库,填充结果 + * 创建 PageResultHandler * * @param pageResult 分页结果集空对象 - * @return EntityHandler对象 + * @return BeanResultHandler */ - public static PageResultHandler of(final PageResult pageResult) { - return new PageResultHandler(pageResult); + public static PageResultHandler of(final PageResult pageResult) { + return of(Entity.class, pageResult); + } + + /** + * 创建 PageResultHandler + * + * @param Bean类型 + * @param beanClass bean类 + * @param pageResult 分页结果集空对象 + * @return PageResultHandler + */ + public static PageResultHandler of(final Class beanClass, final PageResult pageResult) { + return new PageResultHandler<>(beanClass, pageResult); } /** * 构造
* 结果集根据给定的分页对象查询数据库,填充结果 * + * @param beanClass bean类 * @param pageResult 分页结果集空对象 */ - public PageResultHandler(final PageResult pageResult) { - this(pageResult, false); - } - - /** - * 构造
- * 结果集根据给定的分页对象查询数据库,填充结果 - * - * @param pageResult 分页结果集空对象 - * @param caseInsensitive 是否大小写不敏感 - */ - public PageResultHandler(final PageResult pageResult, final boolean caseInsensitive) { + public PageResultHandler(final Class beanClass, final PageResult pageResult) { + this.beanClass = beanClass; this.pageResult = pageResult; - this.caseInsensitive = caseInsensitive; } + /** + * 设置是否忽略大小写 + * + * @param caseInsensitive 是否忽略大小写 + * @return this + */ + public PageResultHandler setCaseInsensitive(final boolean caseInsensitive) { + this.caseInsensitive = caseInsensitive; + return this; + } + + @SuppressWarnings("unchecked") @Override - public PageResult handle(final ResultSet rs) throws SQLException { - return ResultSetUtil.toEntityList(rs, pageResult, this.caseInsensitive); + public PageResult handle(final ResultSet rs) throws SQLException { + if (Entity.class == this.beanClass) { + return (PageResult) ResultSetUtil.toEntityList( + rs, (PageResult) pageResult, this.caseInsensitive); + } + return ResultSetUtil.toBeanList(rs, this.pageResult, this.beanClass); } } diff --git a/hutool-db/src/test/java/org/dromara/hutool/db/IssueI73770Test.java b/hutool-db/src/test/java/org/dromara/hutool/db/IssueI73770Test.java index b3a357f33..cd3a2e429 100644 --- a/hutool-db/src/test/java/org/dromara/hutool/db/IssueI73770Test.java +++ b/hutool-db/src/test/java/org/dromara/hutool/db/IssueI73770Test.java @@ -20,11 +20,28 @@ import java.util.List; public class IssueI73770Test { + private final String sql = "select * from user where id = ?"; + @Test - void pageTest() { + void pageForEntityResultTest() { + final PageResult result = Db.of() + .page(sql, new Page(0, 10), 9); + Assertions.assertEquals(1, result.size()); + Assertions.assertEquals(9, result.get(0).get("id")); + } + + @Test + void pageForBeanResultTest() { + final PageResult result = Db.of() + .pageForBeanResult(sql, new Page(0, 10), User.class, 9); + Assertions.assertEquals(1, result.size()); + Assertions.assertEquals(9, result.get(0).getId()); + } + + @Test + void pageForBeanListTest() { final List result = Db.of() - .pageForBeanList("select * from user where id = ?" - , new Page(0, 10), User.class, 9); + .pageForBeanList(sql, new Page(0, 10), User.class, 9); Assertions.assertEquals(1, result.size()); Assertions.assertEquals(9, result.get(0).getId()); }