This commit is contained in:
Looly 2023-05-27 00:13:27 +08:00
parent b5b237426f
commit e13983d182
5 changed files with 105 additions and 40 deletions

View File

@ -735,6 +735,22 @@ public abstract class AbstractDb<R extends AbstractDb<R>> extends DefaultConnect
// region ----- page // region ----- page
/**
* 分页查询结果为Bean列表不计算总数<br>
*
* @param <T> Bean类型
* @param sql SQL构建器可以使用{@link SqlBuilder#of(CharSequence)} 包装普通SQL
* @param page 分页对象
* @param elementBeanType 结果集处理对象
* @param params 参数
* @return 结果对象
*/
public <T> PageResult<T> pageForBeanResult(final CharSequence sql, final Page page,
final Class<T> elementBeanType, final Object... params) {
final PageResult<T> result = new PageResult<>(page, (int) count(sql, params));
return page(sql, page, PageResultHandler.of(elementBeanType, result), params);
}
/** /**
* 分页查询结果为Bean列表不计算总数<br> * 分页查询结果为Bean列表不计算总数<br>
* *

View File

@ -12,11 +12,11 @@
package org.dromara.hutool.db; package org.dromara.hutool.db;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.StrUtil; 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.Dialect;
import org.dromara.hutool.db.dialect.DialectFactory; import org.dromara.hutool.db.dialect.DialectFactory;
import org.dromara.hutool.db.handler.NumberHandler; import org.dromara.hutool.db.handler.NumberHandler;
@ -324,12 +324,11 @@ public class DialectRunner implements Serializable {
*/ */
public PageResult<Entity> page(final Connection conn, final Query query) throws DbRuntimeException { public PageResult<Entity> page(final Connection conn, final Query query) throws DbRuntimeException {
final Page page = query.getPage(); final Page page = query.getPage();
final PageResultHandler pageResultHandler = new PageResultHandler( final PageResultHandler<Entity> entityResultHandler = PageResultHandler.of(
new PageResult<>(page.getPageNumber(), page.getPageSize(),
// 分页查询中总数的查询要去掉分页信息 // 分页查询中总数的查询要去掉分页信息
(int) count(conn, query.clone().setPage(null))), new PageResult<>(page, (int) count(conn, query.clone().setPage(null))));
this.caseInsensitive);
return page(conn, query, pageResultHandler); return page(conn, query, entityResultHandler.setCaseInsensitive(caseInsensitive));
} }
/** /**
@ -367,10 +366,10 @@ public class DialectRunner implements Serializable {
* @throws DbRuntimeException SQL执行异常 * @throws DbRuntimeException SQL执行异常
*/ */
public PageResult<Entity> page(final Connection conn, final SqlBuilder sqlBuilder, final Page page) throws DbRuntimeException { public PageResult<Entity> page(final Connection conn, final SqlBuilder sqlBuilder, final Page page) throws DbRuntimeException {
final PageResultHandler pageResultHandler = new PageResultHandler( final PageResultHandler<Entity> entityResultHandler = PageResultHandler.of(
new PageResult<>(page.getPageNumber(), page.getPageSize(), (int) count(conn, sqlBuilder)), new PageResult<>(page, (int) count(conn, sqlBuilder)));
this.caseInsensitive);
return page(conn, sqlBuilder, page, pageResultHandler); return page(conn, sqlBuilder, page, entityResultHandler.setCaseInsensitive(caseInsensitive));
} }
/** /**

View File

@ -25,6 +25,9 @@ import java.util.ArrayList;
public class PageResult<T> extends ArrayList<T> { public class PageResult<T> extends ArrayList<T> {
private static final long serialVersionUID = 9056411043515781783L; private static final long serialVersionUID = 9056411043515781783L;
/**
* 默认每页结果数
*/
public static final int DEFAULT_PAGE_SIZE = Page.DEFAULT_PAGE_SIZE; public static final int DEFAULT_PAGE_SIZE = Page.DEFAULT_PAGE_SIZE;
/** /**
@ -66,6 +69,17 @@ public class PageResult<T> extends ArrayList<T> {
this.pageSize = pageSize <= 0 ? DEFAULT_PAGE_SIZE : pageSize; 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);
}
/** /**
* 构造 * 构造
* *

View File

@ -21,52 +21,71 @@ import java.sql.SQLException;
/** /**
* 分页结果集处理类 处理出的结果为PageResult * 分页结果集处理类 处理出的结果为PageResult
* *
* @param <T> Bean类型
* @author loolly * @author loolly
*/ */
public class PageResultHandler implements RsHandler<PageResult<Entity>> { public class PageResultHandler<T> implements RsHandler<PageResult<T>> {
private static final long serialVersionUID = -1474161855834070108L; private static final long serialVersionUID = 1L;
private final PageResult<Entity> pageResult; private final Class<T> beanClass;
private final PageResult<T> pageResult;
/** /**
* 是否大小写不敏感 * 是否大小写不敏感
*/ */
private final boolean caseInsensitive; private boolean caseInsensitive;
/** /**
* 创建一个 EntityHandler对象<br> * 创建 PageResultHandler
* 结果集根据给定的分页对象查询数据库填充结果
* *
* @param pageResult 分页结果集空对象 * @param pageResult 分页结果集空对象
* @return EntityHandler对象 * @return BeanResultHandler
*/ */
public static PageResultHandler of(final PageResult<Entity> pageResult) { public static PageResultHandler<Entity> of(final PageResult<Entity> pageResult) {
return new PageResultHandler(pageResult); return of(Entity.class, pageResult);
}
/**
* 创建 PageResultHandler
*
* @param <T> Bean类型
* @param beanClass bean类
* @param pageResult 分页结果集空对象
* @return PageResultHandler
*/
public static <T> PageResultHandler<T> of(final Class<T> beanClass, final PageResult<T> pageResult) {
return new PageResultHandler<>(beanClass, pageResult);
} }
/** /**
* 构造<br> * 构造<br>
* 结果集根据给定的分页对象查询数据库填充结果 * 结果集根据给定的分页对象查询数据库填充结果
* *
* @param beanClass bean类
* @param pageResult 分页结果集空对象 * @param pageResult 分页结果集空对象
*/ */
public PageResultHandler(final PageResult<Entity> pageResult) { public PageResultHandler(final Class<T> beanClass, final PageResult<T> pageResult) {
this(pageResult, false); this.beanClass = beanClass;
}
/**
* 构造<br>
* 结果集根据给定的分页对象查询数据库填充结果
*
* @param pageResult 分页结果集空对象
* @param caseInsensitive 是否大小写不敏感
*/
public PageResultHandler(final PageResult<Entity> pageResult, final boolean caseInsensitive) {
this.pageResult = pageResult; this.pageResult = pageResult;
this.caseInsensitive = caseInsensitive;
} }
/**
* 设置是否忽略大小写
*
* @param caseInsensitive 是否忽略大小写
* @return this
*/
public PageResultHandler<T> setCaseInsensitive(final boolean caseInsensitive) {
this.caseInsensitive = caseInsensitive;
return this;
}
@SuppressWarnings("unchecked")
@Override @Override
public PageResult<Entity> handle(final ResultSet rs) throws SQLException { public PageResult<T> handle(final ResultSet rs) throws SQLException {
return ResultSetUtil.toEntityList(rs, pageResult, this.caseInsensitive); if (Entity.class == this.beanClass) {
return (PageResult<T>) ResultSetUtil.toEntityList(
rs, (PageResult<Entity>) pageResult, this.caseInsensitive);
}
return ResultSetUtil.toBeanList(rs, this.pageResult, this.beanClass);
} }
} }

View File

@ -20,11 +20,28 @@ import java.util.List;
public class IssueI73770Test { public class IssueI73770Test {
private final String sql = "select * from user where id = ?";
@Test @Test
void pageTest() { void pageForEntityResultTest() {
final PageResult<Entity> 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<User> 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<User> result = Db.of() final List<User> result = Db.of()
.pageForBeanList("select * from user where id = ?" .pageForBeanList(sql, new Page(0, 10), User.class, 9);
, new Page(0, 10), User.class, 9);
Assertions.assertEquals(1, result.size()); Assertions.assertEquals(1, result.size());
Assertions.assertEquals(9, result.get(0).getId()); Assertions.assertEquals(9, result.get(0).getId());
} }