add rowHandler

This commit is contained in:
Looly 2023-06-02 02:01:05 +08:00
parent 6ea9350e96
commit 5396ced0fc
14 changed files with 472 additions and 173 deletions

View File

@ -12,8 +12,9 @@
package org.dromara.hutool.db.handler;
import org.dromara.hutool.db.handler.row.BeanRowHandler;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
@ -39,14 +40,19 @@ public class BeanHandler<E> implements RsHandler<E>{
return new BeanHandler<>(beanType);
}
/**
* 构造
* @param beanType Bean类型
*/
public BeanHandler(final Class<E> beanType) {
this.elementBeanType = beanType;
}
@Override
public E handle(final ResultSet rs) throws SQLException {
final ResultSetMetaData meta = rs.getMetaData();
final int columnCount = meta.getColumnCount();
return rs.next() ? ResultSetUtil.toBean(columnCount, meta, rs, this.elementBeanType) : null;
if(rs.next()){
return new BeanRowHandler<>(rs.getMetaData(), elementBeanType, true).handle(rs);
}
return null;
}
}

View File

@ -13,9 +13,9 @@
package org.dromara.hutool.db.handler;
import org.dromara.hutool.db.Entity;
import org.dromara.hutool.db.handler.row.EntityRowHandler;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
@ -56,9 +56,10 @@ public class EntityHandler implements RsHandler<Entity>{
@Override
public Entity handle(final ResultSet rs) throws SQLException {
final ResultSetMetaData meta = rs.getMetaData();
final int columnCount = meta.getColumnCount();
if(rs.next()){
return new EntityRowHandler(rs.getMetaData(), this.caseInsensitive, true).handle(rs);
}
return rs.next() ? ResultSetUtil.toEntity(columnCount, meta, rs, this.caseInsensitive) : null;
return null;
}
}

View File

@ -12,11 +12,13 @@
package org.dromara.hutool.db.handler;
import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.db.Entity;
import org.dromara.hutool.db.handler.row.EntityRowHandler;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
@ -56,6 +58,14 @@ public class EntityListHandler implements RsHandler<List<Entity>>{
@Override
public List<Entity> handle(final ResultSet rs) throws SQLException {
return ResultSetUtil.toEntityList(rs, new ArrayList<>(), this.caseInsensitive);
final ResultSetMetaData meta = rs.getMetaData();
final EntityRowHandler rowHandler = new EntityRowHandler(meta, caseInsensitive, true);
final List<Entity> result = ListUtil.of();
while (rs.next()){
result.add(rowHandler.handle(rs));
}
return result;
}
}

View File

@ -13,6 +13,7 @@
package org.dromara.hutool.db.handler;
import org.dromara.hutool.db.Entity;
import org.dromara.hutool.db.handler.row.EntityRowHandler;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -55,6 +56,14 @@ public class EntitySetHandler implements RsHandler<LinkedHashSet<Entity>>{
@Override
public LinkedHashSet<Entity> handle(final ResultSet rs) throws SQLException {
return ResultSetUtil.toEntityList(rs, new LinkedHashSet<>(), this.caseInsensitive);
final EntityRowHandler rowHandler =
new EntityRowHandler(rs.getMetaData(), caseInsensitive, true);
final LinkedHashSet<Entity> result = new LinkedHashSet<>();
while (rs.next()){
result.add(rowHandler.handle(rs));
}
return result;
}
}

View File

@ -12,28 +12,20 @@
package org.dromara.hutool.db.handler;
import org.dromara.hutool.core.bean.BeanUtil;
import org.dromara.hutool.core.bean.PropDesc;
import org.dromara.hutool.core.convert.Convert;
import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.reflect.ConstructorUtil;
import org.dromara.hutool.core.reflect.method.MethodUtil;
import org.dromara.hutool.core.reflect.TypeUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.db.DbRuntimeException;
import org.dromara.hutool.db.Entity;
import org.dromara.hutool.db.handler.row.*;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 数据结果集处理辅助类
@ -45,157 +37,35 @@ public class ResultSetUtil {
/**
* 处理单条数据
*
* @param <T> Bean类型
* @param columnCount 列数
* @param meta ResultSetMetaData
* @param rs 数据集
* @param bean 目标Bean
* @return 每一行的Entity
* @throws SQLException SQL执行异常
* @since 3.3.1
*/
public static <T> T toBean(final int columnCount, final ResultSetMetaData meta, final ResultSet rs, final T bean) throws SQLException {
return toEntity(columnCount, meta, rs).toBeanIgnoreCase(bean);
}
/**
* 处理单条数据
*
* @param <T> Bean类型
* @param columnCount 列数
* @param meta ResultSetMetaData
* @param rs 数据集
* @param beanClass 目标Bean类型
* @param <T> Bean类型
* @param meta ResultSetMetaData
* @param rs 数据集
* @param beanClass 目标Bean类型
* @return 每一行的Entity
* @throws SQLException SQL执行异常
* @since 3.3.1
*/
@SuppressWarnings("unchecked")
public static <T> T toBean(final int columnCount, final ResultSetMetaData meta, final ResultSet rs, final Class<T> beanClass) throws SQLException {
public static <T> T toBean(final ResultSetMetaData meta, final ResultSet rs, final Class<T> beanClass) throws SQLException {
Assert.notNull(beanClass, "Bean Class must be not null !");
if (beanClass.isArray()) {
//返回数组
final Class<?> componentType = beanClass.getComponentType();
final Object[] result = ArrayUtil.newArray(componentType, columnCount);
for (int i = 0, j = 1; i < columnCount; i++, j++) {
result[i] = getColumnValue(rs, j, meta.getColumnType(j), componentType);
}
return (T) result;
return (T) new ArrayRowHandler<>(meta, beanClass.getComponentType()).handle(rs);
} else if (Iterable.class.isAssignableFrom(beanClass)) {
//集合
final Object[] objRow = toBean(columnCount, meta, rs, Object[].class);
final Object[] objRow = toBean(meta, rs, Object[].class);
return Convert.convert(beanClass, objRow);
} else if (beanClass.isAssignableFrom(Entity.class)) {
//Entity的父类都可按照Entity返回
return (T) toEntity(columnCount, meta, rs);
return (T) new EntityRowHandler(meta, false, true).handle(rs);
} else if (String.class == beanClass) {
//字符串
final Object[] objRow = toBean(columnCount, meta, rs, Object[].class);
final Object[] objRow = toBean(meta, rs, Object[].class);
return (T) StrUtil.join(", ", objRow);
}
//普通bean
final T bean = ConstructorUtil.newInstanceIfPossible(beanClass);
//忽略字段大小写
final Map<String, PropDesc> propMap = BeanUtil.getBeanDesc(beanClass).getPropMap(true);
String columnLabel;
PropDesc pd;
Method setter;
Object value;
for (int i = 1; i <= columnCount; i++) {
columnLabel = meta.getColumnLabel(i);
pd = propMap.get(columnLabel);
if (null == pd) {
// 尝试驼峰命名风格
pd = propMap.get(StrUtil.toCamelCase(columnLabel));
}
setter = (null == pd) ? null : pd.getSetter();
if (null != setter) {
value = getColumnValue(rs, i, meta.getColumnType(i), TypeUtil.getFirstParamType(setter));
MethodUtil.invokeWithCheck(bean, setter, value);
}
}
return bean;
}
/**
* 处理单条数据
*
* @param columnCount 列数
* @param meta ResultSetMetaData
* @param rs 数据集
* @return 每一行的Entity
* @throws SQLException SQL执行异常
*/
public static Entity toEntity(final int columnCount, final ResultSetMetaData meta, final ResultSet rs) throws SQLException {
return toEntity(columnCount, meta, rs, false);
}
/**
* 处理单条数据
*
* @param columnCount 列数
* @param meta ResultSetMetaData
* @param rs 数据集
* @param caseInsensitive 是否大小写不敏感
* @return 每一行的Entity
* @throws SQLException SQL执行异常
* @since 4.5.16
*/
public static Entity toEntity(final int columnCount, final ResultSetMetaData meta, final ResultSet rs, final boolean caseInsensitive) throws SQLException {
return toEntity(new Entity(null, caseInsensitive), columnCount, meta, rs, true);
}
/**
* 处理单条数据
*
* @param <T> Entity及其子对象
* @param row Entity对象
* @param columnCount 列数
* @param meta ResultSetMetaData
* @param rs 数据集
* @param withMetaInfo 是否包含表名字段名等元信息
* @return 每一行的Entity
* @throws SQLException SQL执行异常
* @since 3.3.1
*/
public static <T extends Entity> T toEntity(final T row, final int columnCount, final ResultSetMetaData meta, final ResultSet rs, final boolean withMetaInfo) throws SQLException {
int type;
String columnLabel;
for (int i = 1; i <= columnCount; i++) {
type = meta.getColumnType(i);
columnLabel = meta.getColumnLabel(i);
if("rownum_".equalsIgnoreCase(columnLabel)){
// issue#2618@Github
// 分页时会查出rownum字段此处忽略掉读取
continue;
}
row.put(columnLabel, getColumnValue(rs, i, type, null));
}
if (withMetaInfo) {
try {
row.setTableName(meta.getTableName(1));
} catch (final SQLException ignore) {
//issue#I2AGLU@Gitee
// Hive等NoSQL中无表的概念此处报错跳过
}
row.setFieldNames(row.keySet());
}
return row;
}
/**
* 处理单条数据
*
* @param rs 数据集
* @return 每一行的Entity
* @throws SQLException SQL执行异常
*/
public static Entity toEntity(final ResultSet rs) throws SQLException {
final ResultSetMetaData meta = rs.getMetaData();
final int columnCount = meta.getColumnCount();
return toEntity(columnCount, meta, rs);
return new BeanRowHandler<>(meta, beanClass, true).handle(rs);
}
/**
@ -207,14 +77,7 @@ public class ResultSetUtil {
* @since 5.1.6
*/
public static List<Object> handleRowToList(final ResultSet rs) throws SQLException {
final ResultSetMetaData meta = rs.getMetaData();
final int columnCount = meta.getColumnCount();
final List<Object> row = new ArrayList<>(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.add(getColumnValue(rs, i, meta.getColumnType(i), null));
}
return row;
return new ListRowHandler<>(rs.getMetaData(), Object.class).handle(rs);
}
/**
@ -242,11 +105,10 @@ public class ResultSetUtil {
* @since 4.5.16
*/
public static <T extends Collection<Entity>> T toEntityList(final ResultSet rs, final T collection, final boolean caseInsensitive) throws SQLException {
final ResultSetMetaData meta = rs.getMetaData();
final int columnCount = meta.getColumnCount();
final RowHandler<Entity> rowHandler = new EntityRowHandler(rs.getMetaData(), caseInsensitive, true);
while (rs.next()) {
collection.add(toEntity(columnCount, meta, rs, caseInsensitive));
collection.add(rowHandler.handle(rs));
}
return collection;
@ -266,12 +128,9 @@ public class ResultSetUtil {
*/
public static <E, T extends Collection<E>> T toBeanList(final ResultSet rs, final T collection, final Class<E> elementBeanType) throws SQLException {
final ResultSetMetaData meta = rs.getMetaData();
final int columnCount = meta.getColumnCount();
while (rs.next()) {
collection.add(toBean(columnCount, meta, rs, elementBeanType));
collection.add(toBean(meta, rs, elementBeanType));
}
return collection;
}
@ -295,20 +154,18 @@ public class ResultSetUtil {
return generatedKey;
}
// -------------------------------------------------------------------------------------------------------------- Private method start
/**
* 获取字段值<br>
* 针对日期时间等做单独处理判断
*
* @param rs {@link ResultSet}
* @param columnIndex 字段索引
* @param columnIndex 字段索引从1开始计数
* @param type 字段类型默认Object
* @param targetColumnType 结果要求的类型需进行二次转换null或者Object不转换
* @return 字段值
* @throws SQLException SQL异常
*/
private static Object getColumnValue(final ResultSet rs, final int columnIndex, final int type, final Type targetColumnType) throws SQLException {
public static Object getColumnValue(final ResultSet rs, final int columnIndex, final int type, final Type targetColumnType) throws SQLException {
Object rawValue = null;
switch (type) {
case Types.TIMESTAMP:
@ -333,5 +190,4 @@ public class ResultSetUtil {
return Convert.convert(targetColumnType, rawValue);
}
}
// -------------------------------------------------------------------------------------------------------------- Private method end
}

View File

@ -12,6 +12,8 @@
package org.dromara.hutool.db.handler;
import org.dromara.hutool.db.handler.row.ListRowHandler;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
@ -35,9 +37,10 @@ public class ValueListHandler implements RsHandler<List<List<Object>>>{
@Override
public List<List<Object>> handle(final ResultSet rs) throws SQLException {
final ListRowHandler<Object> listRowHandler = new ListRowHandler<>(rs.getMetaData(), Object.class);
final ArrayList<List<Object>> result = new ArrayList<>();
while (rs.next()) {
result.add(ResultSetUtil.handleRowToList(rs));
result.add(listRowHandler.handle(rs));
}
return result;
}

View File

@ -0,0 +1,40 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.handler.row;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* {@link ResultSet}结果中的某行处理为List
*
* @param <R> 一行数据处理后的结果类型
* @author looly
*/
public abstract class AbsRowHandler<R> implements RowHandler<R> {
protected final ResultSetMetaData meta;
protected final int columnCount;
/**
* 构造
*
* @param meta {@link ResultSetMetaData}
* @throws SQLException SQL异常
*/
public AbsRowHandler(final ResultSetMetaData meta) throws SQLException {
this.meta = meta;
this.columnCount = meta.getColumnCount();
}
}

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.handler.row;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.db.handler.ResultSetUtil;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* {@link ResultSet}结果中的某行处理为数组
*
* @param <E> 数组元素类型
* @author looly
*/
public class ArrayRowHandler<E> extends AbsRowHandler<E[]> {
private final Class<E> componentType;
/**
* 构造
*
* @param meta {@link ResultSetMetaData}
* @param componentType 数组元素类型
* @throws SQLException SQL异常
*/
public ArrayRowHandler(final ResultSetMetaData meta, final Class<E> componentType) throws SQLException {
super(meta);
this.componentType = componentType;
}
@SuppressWarnings("unchecked")
@Override
public E[] handle(final ResultSet rs) throws SQLException {
final E[] result = ArrayUtil.newArray(componentType, columnCount);
for (int i = 0, j = 1; i < columnCount; i++, j++) {
result[i] = (E) ResultSetUtil.getColumnValue(rs, j, meta.getColumnType(j), componentType);
}
return result;
}
}

View File

@ -0,0 +1,79 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.handler.row;
import org.dromara.hutool.core.bean.BeanUtil;
import org.dromara.hutool.core.bean.PropDesc;
import org.dromara.hutool.core.reflect.ConstructorUtil;
import org.dromara.hutool.core.reflect.TypeUtil;
import org.dromara.hutool.core.reflect.method.MethodUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.db.handler.ResultSetUtil;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Map;
/**
* {@link ResultSet}结果中的某行处理为Bean对象
*
* @param <T> Bean类型
* @author looly
*/
public class BeanRowHandler<T> extends AbsRowHandler<T> {
private final Class<T> beanType;
private final boolean caseInsensitive;
/**
* 构造
*
* @param meta {@link ResultSetMetaData}
* @param beanType Bean类型
* @param caseInsensitive 是否大小写不敏感
* @throws SQLException SQL异常
*/
public BeanRowHandler(final ResultSetMetaData meta, final Class<T> beanType, final boolean caseInsensitive) throws SQLException {
super(meta);
this.beanType = beanType;
this.caseInsensitive = caseInsensitive;
}
@Override
public T handle(final ResultSet rs) throws SQLException {
//普通bean
final T bean = ConstructorUtil.newInstanceIfPossible(beanType);
final Map<String, PropDesc> propMap = BeanUtil.getBeanDesc(beanType).getPropMap(this.caseInsensitive);
String columnLabel;
PropDesc pd;
Method setter;
Object value;
for (int i = 1; i <= columnCount; i++) {
columnLabel = meta.getColumnLabel(i);
pd = propMap.get(columnLabel);
if (null == pd) {
// 尝试驼峰命名风格
pd = propMap.get(StrUtil.toCamelCase(columnLabel));
}
setter = (null == pd) ? null : pd.getSetter();
if (null != setter) {
value = ResultSetUtil.getColumnValue(rs, i, meta.getColumnType(i), TypeUtil.getFirstParamType(setter));
MethodUtil.invokeWithCheck(bean, setter, value);
}
}
return bean;
}
}

View File

@ -0,0 +1,86 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.handler.row;
import org.dromara.hutool.db.Entity;
import org.dromara.hutool.db.handler.ResultSetUtil;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* {@link ResultSet}结果中的某行处理为{@link Entity}对象
*
* @author looly
*/
public class EntityRowHandler extends AbsRowHandler<Entity> {
private final boolean caseInsensitive;
private final boolean withMetaInfo;
/**
* 构造
*
* @param meta {@link ResultSetMetaData}
* @param caseInsensitive 是否大小写不敏感
* @param withMetaInfo 是否包含表名字段名等元信息
* @throws SQLException SQL异常
*/
public EntityRowHandler(final ResultSetMetaData meta, final boolean caseInsensitive, final boolean withMetaInfo) throws SQLException {
super(meta);
this.caseInsensitive = caseInsensitive;
this.withMetaInfo = withMetaInfo;
}
@Override
public Entity handle(final ResultSet rs) throws SQLException {
final Entity entity = new Entity(null, caseInsensitive);
return fillEntity(entity, rs);
}
/**
* 处理单条数据
*
* @param <T> Entity及其子对象
* @param row Entity对象
* @param rs 数据集
* @return 每一行的Entity
* @throws SQLException SQL执行异常
* @since 3.3.1
*/
private <T extends Entity> T fillEntity(final T row, final ResultSet rs) throws SQLException {
int type;
String columnLabel;
for (int i = 1; i <= columnCount; i++) {
type = meta.getColumnType(i);
columnLabel = meta.getColumnLabel(i);
if("rownum_".equalsIgnoreCase(columnLabel)){
// issue#2618@Github
// 分页时会查出rownum字段此处忽略掉读取
continue;
}
row.put(columnLabel, ResultSetUtil.getColumnValue(rs, i, type, null));
}
if (withMetaInfo) {
try {
row.setTableName(meta.getTableName(1));
} catch (final SQLException ignore) {
//issue#I2AGLU@Gitee
// Hive等NoSQL中无表的概念此处报错跳过
}
row.setFieldNames(row.keySet());
}
return row;
}
}

View File

@ -0,0 +1,55 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.handler.row;
import org.dromara.hutool.db.handler.ResultSetUtil;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* {@link ResultSet}结果中的某行处理为List
*
* @param <E> 元素类型
* @author looly
*/
public class ListRowHandler<E> extends AbsRowHandler<List<E>> {
private final Class<E> elementType;
/**
* 构造
*
* @param meta {@link ResultSetMetaData}
* @param elementType 列表元素类型
* @throws SQLException SQL异常
*/
public ListRowHandler(final ResultSetMetaData meta, final Class<E> elementType) throws SQLException {
super(meta);
this.elementType = elementType;
}
@SuppressWarnings("unchecked")
@Override
public List<E> handle(final ResultSet rs) throws SQLException {
final List<E> row = new ArrayList<>(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.add((E) ResultSetUtil.getColumnValue(rs, i, meta.getColumnType(i), elementType));
}
return row;
}
}

View File

@ -0,0 +1,36 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.handler.row;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 行处理器用于处理一行数据
*
* @param <R> 一行数据处理后的结果类型
* @author looly
* @since 6.0.0
*/
@FunctionalInterface
public interface RowHandler<R> {
/**
* 处理一行数据
*
* @param rs {@link ResultSet}传入前须调用{@link ResultSet#next()}定位到行
* @return 处理行结果对象
* @throws SQLException SQL异常
*/
R handle(ResultSet rs) throws SQLException;
}

View File

@ -0,0 +1,47 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.handler.row;
import org.dromara.hutool.core.text.StrUtil;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* {@link ResultSet}结果中的某行处理为数组
*
* @author looly
*/
public class StringRowHandler implements RowHandler<String> {
private final ArrayRowHandler<Object> arrayRowHandler;
private final String delimiter;
/**
* 构造
*
* @param meta {@link ResultSetMetaData}
* @param delimiter 分隔符
* @throws SQLException SQL异常
*/
public StringRowHandler(final ResultSetMetaData meta, final String delimiter) throws SQLException {
this.arrayRowHandler = new ArrayRowHandler<>(meta, Object.class);
this.delimiter = delimiter;
}
@Override
public String handle(final ResultSet rs) throws SQLException {
return StrUtil.join(delimiter, arrayRowHandler.handle(rs));
}
}

View File

@ -0,0 +1,18 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* 结果集中一行的处理
*
* @author looly
*/
package org.dromara.hutool.db.handler.row;