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;
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<DbConfig> {
*/
private Dialect dialect;
/**
* 结果集的一次取出数据的数量0或null表示默认值
*/
private Integer fetchSize;
/**
* 结果集的游标方向
*/
private FetchDirection fetchDirection;
/**
* 构造
*/
@@ -169,4 +180,41 @@ public class DbConfig extends ConnectionConfig<DbConfig> {
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;
}
}

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.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(", ");

View File

@@ -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;
/**

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.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<StatementWrapper> {
@Serial
private static final long serialVersionUID = 1L;
/**
@@ -163,8 +165,7 @@ public class StatementBuilder implements Builder<StatementWrapper> {
}
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();

View File

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

View File

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