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
/**
* 分页查询结果为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>
*

View File

@ -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<Entity> 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<Entity> 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<Entity> 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<Entity> entityResultHandler = PageResultHandler.of(
new PageResult<>(page, (int) count(conn, sqlBuilder)));
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> {
private static final long serialVersionUID = 9056411043515781783L;
/**
* 默认每页结果数
*/
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;
}
/**
* 构造
*
* @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
*
* @param <T> Bean类型
* @author loolly
*/
public class PageResultHandler implements RsHandler<PageResult<Entity>> {
private static final long serialVersionUID = -1474161855834070108L;
public class PageResultHandler<T> implements RsHandler<PageResult<T>> {
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 分页结果集空对象
* @return EntityHandler对象
* @return BeanResultHandler
*/
public static PageResultHandler of(final PageResult<Entity> pageResult) {
return new PageResultHandler(pageResult);
public static PageResultHandler<Entity> of(final PageResult<Entity> 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>
* 结果集根据给定的分页对象查询数据库填充结果
*
* @param beanClass bean类
* @param pageResult 分页结果集空对象
*/
public PageResultHandler(final PageResult<Entity> pageResult) {
this(pageResult, false);
}
/**
* 构造<br>
* 结果集根据给定的分页对象查询数据库填充结果
*
* @param pageResult 分页结果集空对象
* @param caseInsensitive 是否大小写不敏感
*/
public PageResultHandler(final PageResult<Entity> pageResult, final boolean caseInsensitive) {
public PageResultHandler(final Class<T> beanClass, final PageResult<T> pageResult) {
this.beanClass = beanClass;
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
public PageResult<Entity> handle(final ResultSet rs) throws SQLException {
return ResultSetUtil.toEntityList(rs, pageResult, this.caseInsensitive);
public PageResult<T> handle(final ResultSet rs) throws SQLException {
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 {
private final String sql = "select * from user where id = ?";
@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()
.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());
}