add setFetchSize and FetchDirection

This commit is contained in:
Looly
2025-06-20 11:37:22 +08:00
parent 39f51ee899
commit d296b94a9b
7 changed files with 119 additions and 4 deletions

View File

@@ -16,9 +16,11 @@
package cn.hutool.v7.db.config; package cn.hutool.v7.db.config;
import cn.hutool.v7.db.Db;
import cn.hutool.v7.db.dialect.Dialect; import cn.hutool.v7.db.dialect.Dialect;
import cn.hutool.v7.db.driver.DriverUtil; import cn.hutool.v7.db.driver.DriverUtil;
import cn.hutool.v7.db.ds.DSFactory; 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.SqlFilter;
import cn.hutool.v7.db.sql.filter.SqlFilterChain; import cn.hutool.v7.db.sql.filter.SqlFilterChain;
@@ -80,6 +82,15 @@ public class DbConfig extends ConnectionConfig<DbConfig> {
*/ */
private Dialect dialect; private Dialect dialect;
/**
* 结果集的一次取出数据的数量0或null表示默认值
*/
private Integer fetchSize;
/**
* 结果集的游标方向
*/
private FetchDirection fetchDirection;
/** /**
* 构造 * 构造
*/ */
@@ -169,4 +180,41 @@ public class DbConfig extends ConnectionConfig<DbConfig> {
this.dialect = dialect; this.dialect = dialect;
return this; 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;
}
} }

View File

@@ -25,6 +25,7 @@ import cn.hutool.v7.db.dialect.DialectName;
import cn.hutool.v7.db.sql.QuoteWrapper; import cn.hutool.v7.db.sql.QuoteWrapper;
import cn.hutool.v7.db.sql.SqlBuilder; import cn.hutool.v7.db.sql.SqlBuilder;
import java.io.Serial;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@@ -34,6 +35,7 @@ import java.sql.PreparedStatement;
* @author loolly * @author loolly
*/ */
public class MysqlDialect extends AnsiSqlDialect { public class MysqlDialect extends AnsiSqlDialect {
@Serial
private static final long serialVersionUID = -3734718212043823636L; private static final long serialVersionUID = -3734718212043823636L;
/** /**
@@ -81,7 +83,7 @@ public class MysqlDialect extends AnsiSqlDialect {
// 构建字段部分和参数占位符部分 // 构建字段部分和参数占位符部分
entity.forEach((field, value) -> { entity.forEach((field, value) -> {
if (StrUtil.isNotBlank(field)) { if (StrUtil.isNotBlank(field)) {
if (fieldsPart.length() > 0) { if (!fieldsPart.isEmpty()) {
// 非第一个参数,追加逗号 // 非第一个参数,追加逗号
fieldsPart.append(", "); fieldsPart.append(", ");
placeHolder.append(", "); placeHolder.append(", ");

View File

@@ -24,6 +24,7 @@ import org.stone.beecp.BeeDataSource;
import org.stone.beecp.BeeDataSourceConfig; import org.stone.beecp.BeeDataSourceConfig;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.io.Serial;
import java.util.Properties; import java.util.Properties;
/** /**
@@ -32,6 +33,7 @@ import java.util.Properties;
* @author Looly * @author Looly
*/ */
public class BeeDSFactory extends AbstractDSFactory { public class BeeDSFactory extends AbstractDSFactory {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**

View File

@@ -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;
}
}

View File

@@ -28,6 +28,7 @@ import cn.hutool.v7.db.DbException;
import cn.hutool.v7.db.Entity; import cn.hutool.v7.db.Entity;
import cn.hutool.v7.db.sql.filter.SqlFilter; import cn.hutool.v7.db.sql.filter.SqlFilter;
import java.io.Serial;
import java.sql.*; import java.sql.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -41,6 +42,7 @@ import java.util.Set;
* @since 6.0.0 * @since 6.0.0
*/ */
public class StatementBuilder implements Builder<StatementWrapper> { public class StatementBuilder implements Builder<StatementWrapper> {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
@@ -163,8 +165,7 @@ public class StatementBuilder implements Builder<StatementWrapper> {
} }
if (ArrayUtil.isArray(params)) { if (ArrayUtil.isArray(params)) {
ps.fillParams(new ArrayIter<>(params), nullTypeMap); ps.fillParams(new ArrayIter<>(params), nullTypeMap);
} else if (params instanceof Entity) { } else if (params instanceof Entity entity) {
final Entity entity = (Entity) params;
// 对于多Entity批量插入的情况为防止数据不对齐故按照首行提供键值对筛选。 // 对于多Entity批量插入的情况为防止数据不对齐故按照首行提供键值对筛选。
if(null == keys){ if(null == keys){
keys = entity.keySet(); keys = entity.keySet();

View File

@@ -51,13 +51,28 @@ public class StatementUtil {
* @since 5.8.19 * @since 5.8.19
*/ */
public static PreparedStatement prepareStatement(final boolean returnGeneratedKey, final DbConfig config, final Connection conn, final String sql, final Object... params) { 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) .setConnection(conn)
.setReturnGeneratedKey(returnGeneratedKey) .setReturnGeneratedKey(returnGeneratedKey)
.setSqlFilter(Opt.ofNullable(config).map(DbConfig::getSqlFilters).getOrNull()) .setSqlFilter(Opt.ofNullable(config).map(DbConfig::getSqlFilters).getOrNull())
.setSql(sql) .setSql(sql)
.setParams(params) .setParams(params)
.build(); .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;
} }
/** /**

View File

@@ -22,6 +22,10 @@ module hutool.db {
exports cn.hutool.v7.db; exports cn.hutool.v7.db;
exports cn.hutool.v7.db.config; 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;
exports cn.hutool.v7.db.ds.bee; exports cn.hutool.v7.db.ds.bee;
exports cn.hutool.v7.db.ds.c3p0; exports cn.hutool.v7.db.ds.c3p0;