From d296b94a9b019267fe1f376c2f8917af57e2eda7 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 20 Jun 2025 11:37:22 +0800 Subject: [PATCH] add setFetchSize and FetchDirection --- .../java/cn/hutool/v7/db/config/DbConfig.java | 48 +++++++++++++++++++ .../v7/db/dialect/impl/MysqlDialect.java | 4 +- .../cn/hutool/v7/db/ds/bee/BeeDSFactory.java | 2 + .../cn/hutool/v7/db/sql/FetchDirection.java | 43 +++++++++++++++++ .../cn/hutool/v7/db/sql/StatementBuilder.java | 5 +- .../cn/hutool/v7/db/sql/StatementUtil.java | 17 ++++++- hutool-db/src/main/java/module-info.java | 4 ++ 7 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 hutool-db/src/main/java/cn/hutool/v7/db/sql/FetchDirection.java diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/config/DbConfig.java b/hutool-db/src/main/java/cn/hutool/v7/db/config/DbConfig.java index bc8111498..33d67dfeb 100644 --- a/hutool-db/src/main/java/cn/hutool/v7/db/config/DbConfig.java +++ b/hutool-db/src/main/java/cn/hutool/v7/db/config/DbConfig.java @@ -16,9 +16,11 @@ package cn.hutool.v7.db.config; +import cn.hutool.v7.db.Db; import cn.hutool.v7.db.dialect.Dialect; import cn.hutool.v7.db.driver.DriverUtil; import cn.hutool.v7.db.ds.DSFactory; +import cn.hutool.v7.db.sql.FetchDirection; import cn.hutool.v7.db.sql.filter.SqlFilter; import cn.hutool.v7.db.sql.filter.SqlFilterChain; @@ -80,6 +82,15 @@ public class DbConfig extends ConnectionConfig { */ private Dialect dialect; + /** + * 结果集的一次取出数据的数量,0或null表示默认值 + */ + private Integer fetchSize; + /** + * 结果集的游标方向 + */ + private FetchDirection fetchDirection; + /** * 构造 */ @@ -169,4 +180,41 @@ public class DbConfig extends ConnectionConfig { this.dialect = dialect; return this; } + + + /** + * 获取一次取出数据的数量,0或null表示默认值 + * @return 一次取出数据的数量,0或null表示默认值 + */ + public Integer getFetchSize() { + return fetchSize; + } + + /** + * 设置一次取出数据的数量,0或null表示默认值 + * @param fetchSize 一次取出数据的数量,0或null表示默认值 + * @return this + */ + public DbConfig setFetchSize(final Integer fetchSize) { + this.fetchSize = fetchSize; + return this; + } + + /** + * 获取结果集的游标方向 + * @return 结果集的游标方向 + */ + public FetchDirection getFetchDirection() { + return fetchDirection; + } + + /** + * 设置结果集的游标方向 + * @param fetchDirection 结果集的游标方向 + * @return this + */ + public DbConfig setFetchDirection(final FetchDirection fetchDirection) { + this.fetchDirection = fetchDirection; + return this; + } } diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/dialect/impl/MysqlDialect.java b/hutool-db/src/main/java/cn/hutool/v7/db/dialect/impl/MysqlDialect.java index e2632428a..20af07507 100644 --- a/hutool-db/src/main/java/cn/hutool/v7/db/dialect/impl/MysqlDialect.java +++ b/hutool-db/src/main/java/cn/hutool/v7/db/dialect/impl/MysqlDialect.java @@ -25,6 +25,7 @@ import cn.hutool.v7.db.dialect.DialectName; import cn.hutool.v7.db.sql.QuoteWrapper; import cn.hutool.v7.db.sql.SqlBuilder; +import java.io.Serial; import java.sql.Connection; import java.sql.PreparedStatement; @@ -34,6 +35,7 @@ import java.sql.PreparedStatement; * @author loolly */ public class MysqlDialect extends AnsiSqlDialect { + @Serial private static final long serialVersionUID = -3734718212043823636L; /** @@ -81,7 +83,7 @@ public class MysqlDialect extends AnsiSqlDialect { // 构建字段部分和参数占位符部分 entity.forEach((field, value) -> { if (StrUtil.isNotBlank(field)) { - if (fieldsPart.length() > 0) { + if (!fieldsPart.isEmpty()) { // 非第一个参数,追加逗号 fieldsPart.append(", "); placeHolder.append(", "); diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/ds/bee/BeeDSFactory.java b/hutool-db/src/main/java/cn/hutool/v7/db/ds/bee/BeeDSFactory.java index b80b0c663..708c20073 100644 --- a/hutool-db/src/main/java/cn/hutool/v7/db/ds/bee/BeeDSFactory.java +++ b/hutool-db/src/main/java/cn/hutool/v7/db/ds/bee/BeeDSFactory.java @@ -24,6 +24,7 @@ import org.stone.beecp.BeeDataSource; import org.stone.beecp.BeeDataSourceConfig; import javax.sql.DataSource; +import java.io.Serial; import java.util.Properties; /** @@ -32,6 +33,7 @@ import java.util.Properties; * @author Looly */ public class BeeDSFactory extends AbstractDSFactory { + @Serial private static final long serialVersionUID = 1L; /** diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/sql/FetchDirection.java b/hutool-db/src/main/java/cn/hutool/v7/db/sql/FetchDirection.java new file mode 100644 index 000000000..062c287d4 --- /dev/null +++ b/hutool-db/src/main/java/cn/hutool/v7/db/sql/FetchDirection.java @@ -0,0 +1,43 @@ +package cn.hutool.v7.db.sql; + +import java.sql.ResultSet; + +/** + * 获取结果集的移动方向 + * + * @author looly + * @since 7.0.0 + */ +public enum FetchDirection { + + /** + * 默认方向 + */ + FORWARD(ResultSet.FETCH_FORWARD), + /** + * 反向 + */ + REVERSE(ResultSet.FETCH_REVERSE), + /** + * 不确定方向 + */ + UNKNOWN(ResultSet.FETCH_UNKNOWN); + + /** + * 获取值 + */ + private final int value; + + FetchDirection(int value) { + this.value = value; + } + + /** + * 获取值 + * + * @return 值 + */ + public int getValue() { + return value; + } +} diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementBuilder.java b/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementBuilder.java index 8e0078d70..a1ac0157a 100644 --- a/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementBuilder.java +++ b/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementBuilder.java @@ -28,6 +28,7 @@ import cn.hutool.v7.db.DbException; import cn.hutool.v7.db.Entity; import cn.hutool.v7.db.sql.filter.SqlFilter; +import java.io.Serial; import java.sql.*; import java.util.HashMap; import java.util.List; @@ -41,6 +42,7 @@ import java.util.Set; * @since 6.0.0 */ public class StatementBuilder implements Builder { + @Serial private static final long serialVersionUID = 1L; /** @@ -163,8 +165,7 @@ public class StatementBuilder implements Builder { } if (ArrayUtil.isArray(params)) { ps.fillParams(new ArrayIter<>(params), nullTypeMap); - } else if (params instanceof Entity) { - final Entity entity = (Entity) params; + } else if (params instanceof Entity entity) { // 对于多Entity批量插入的情况,为防止数据不对齐,故按照首行提供键值对筛选。 if(null == keys){ keys = entity.keySet(); diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementUtil.java b/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementUtil.java index 16ede23e4..c16cfb6b2 100644 --- a/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementUtil.java +++ b/hutool-db/src/main/java/cn/hutool/v7/db/sql/StatementUtil.java @@ -51,13 +51,28 @@ public class StatementUtil { * @since 5.8.19 */ public static PreparedStatement prepareStatement(final boolean returnGeneratedKey, final DbConfig config, final Connection conn, final String sql, final Object... params) { - return StatementBuilder.of() + PreparedStatement statement = StatementBuilder.of() .setConnection(conn) .setReturnGeneratedKey(returnGeneratedKey) .setSqlFilter(Opt.ofNullable(config).map(DbConfig::getSqlFilters).getOrNull()) .setSql(sql) .setParams(params) .build(); + + try{ + final Integer fetchSize = config.getFetchSize(); + if (null != fetchSize) { + statement.setFetchSize(fetchSize); + } + final FetchDirection fetchDirection = config.getFetchDirection(); + if (null != fetchDirection) { + statement.setFetchDirection(fetchDirection.getValue()); + } + } catch (SQLException e){ + throw new DbException(e); + } + + return statement; } /** diff --git a/hutool-db/src/main/java/module-info.java b/hutool-db/src/main/java/module-info.java index fc64b2f63..e88452b83 100644 --- a/hutool-db/src/main/java/module-info.java +++ b/hutool-db/src/main/java/module-info.java @@ -22,6 +22,10 @@ module hutool.db { exports cn.hutool.v7.db; exports cn.hutool.v7.db.config; + exports cn.hutool.v7.db.handler; + exports cn.hutool.v7.db.dialect; + exports cn.hutool.v7.db.sql; + exports cn.hutool.v7.db.sql.filter; exports cn.hutool.v7.db.ds; exports cn.hutool.v7.db.ds.bee; exports cn.hutool.v7.db.ds.c3p0;