mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
add rowHandler
This commit is contained in:
parent
6ea9350e96
commit
5396ced0fc
@ -12,8 +12,9 @@
|
|||||||
|
|
||||||
package org.dromara.hutool.db.handler;
|
package org.dromara.hutool.db.handler;
|
||||||
|
|
||||||
|
import org.dromara.hutool.db.handler.row.BeanRowHandler;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.ResultSetMetaData;
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,14 +40,19 @@ public class BeanHandler<E> implements RsHandler<E>{
|
|||||||
return new BeanHandler<>(beanType);
|
return new BeanHandler<>(beanType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
* @param beanType Bean类型
|
||||||
|
*/
|
||||||
public BeanHandler(final Class<E> beanType) {
|
public BeanHandler(final Class<E> beanType) {
|
||||||
this.elementBeanType = beanType;
|
this.elementBeanType = beanType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public E handle(final ResultSet rs) throws SQLException {
|
public E handle(final ResultSet rs) throws SQLException {
|
||||||
final ResultSetMetaData meta = rs.getMetaData();
|
if(rs.next()){
|
||||||
final int columnCount = meta.getColumnCount();
|
return new BeanRowHandler<>(rs.getMetaData(), elementBeanType, true).handle(rs);
|
||||||
return rs.next() ? ResultSetUtil.toBean(columnCount, meta, rs, this.elementBeanType) : null;
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
package org.dromara.hutool.db.handler;
|
package org.dromara.hutool.db.handler;
|
||||||
|
|
||||||
import org.dromara.hutool.db.Entity;
|
import org.dromara.hutool.db.Entity;
|
||||||
|
import org.dromara.hutool.db.handler.row.EntityRowHandler;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.ResultSetMetaData;
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,9 +56,10 @@ public class EntityHandler implements RsHandler<Entity>{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Entity handle(final ResultSet rs) throws SQLException {
|
public Entity handle(final ResultSet rs) throws SQLException {
|
||||||
final ResultSetMetaData meta = rs.getMetaData();
|
if(rs.next()){
|
||||||
final int columnCount = meta.getColumnCount();
|
return new EntityRowHandler(rs.getMetaData(), this.caseInsensitive, true).handle(rs);
|
||||||
|
}
|
||||||
|
|
||||||
return rs.next() ? ResultSetUtil.toEntity(columnCount, meta, rs, this.caseInsensitive) : null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,11 +12,13 @@
|
|||||||
|
|
||||||
package org.dromara.hutool.db.handler;
|
package org.dromara.hutool.db.handler;
|
||||||
|
|
||||||
|
import org.dromara.hutool.core.collection.ListUtil;
|
||||||
import org.dromara.hutool.db.Entity;
|
import org.dromara.hutool.db.Entity;
|
||||||
|
import org.dromara.hutool.db.handler.row.EntityRowHandler;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.ResultSetMetaData;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,6 +58,14 @@ public class EntityListHandler implements RsHandler<List<Entity>>{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Entity> handle(final ResultSet rs) throws SQLException {
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
package org.dromara.hutool.db.handler;
|
package org.dromara.hutool.db.handler;
|
||||||
|
|
||||||
import org.dromara.hutool.db.Entity;
|
import org.dromara.hutool.db.Entity;
|
||||||
|
import org.dromara.hutool.db.handler.row.EntityRowHandler;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
@ -55,6 +56,14 @@ public class EntitySetHandler implements RsHandler<LinkedHashSet<Entity>>{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LinkedHashSet<Entity> handle(final ResultSet rs) throws SQLException {
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,28 +12,20 @@
|
|||||||
|
|
||||||
package org.dromara.hutool.db.handler;
|
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.convert.Convert;
|
||||||
import org.dromara.hutool.core.lang.Assert;
|
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.text.StrUtil;
|
||||||
import org.dromara.hutool.core.array.ArrayUtil;
|
|
||||||
import org.dromara.hutool.db.DbRuntimeException;
|
import org.dromara.hutool.db.DbRuntimeException;
|
||||||
import org.dromara.hutool.db.Entity;
|
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.lang.reflect.Type;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.ResultSetMetaData;
|
import java.sql.ResultSetMetaData;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据结果集处理辅助类
|
* 数据结果集处理辅助类
|
||||||
@ -45,157 +37,35 @@ public class ResultSetUtil {
|
|||||||
/**
|
/**
|
||||||
* 处理单条数据
|
* 处理单条数据
|
||||||
*
|
*
|
||||||
* @param <T> Bean类型
|
* @param <T> Bean类型
|
||||||
* @param columnCount 列数
|
* @param meta ResultSetMetaData
|
||||||
* @param meta ResultSetMetaData
|
* @param rs 数据集
|
||||||
* @param rs 数据集
|
* @param beanClass 目标Bean类型
|
||||||
* @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类型
|
|
||||||
* @return 每一行的Entity
|
* @return 每一行的Entity
|
||||||
* @throws SQLException SQL执行异常
|
* @throws SQLException SQL执行异常
|
||||||
* @since 3.3.1
|
* @since 3.3.1
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@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 !");
|
Assert.notNull(beanClass, "Bean Class must be not null !");
|
||||||
|
|
||||||
if (beanClass.isArray()) {
|
if (beanClass.isArray()) {
|
||||||
//返回数组
|
//返回数组
|
||||||
final Class<?> componentType = beanClass.getComponentType();
|
return (T) new ArrayRowHandler<>(meta, beanClass.getComponentType()).handle(rs);
|
||||||
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;
|
|
||||||
} else if (Iterable.class.isAssignableFrom(beanClass)) {
|
} 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);
|
return Convert.convert(beanClass, objRow);
|
||||||
} else if (beanClass.isAssignableFrom(Entity.class)) {
|
} else if (beanClass.isAssignableFrom(Entity.class)) {
|
||||||
//Entity的父类都可按照Entity返回
|
//Entity的父类都可按照Entity返回
|
||||||
return (T) toEntity(columnCount, meta, rs);
|
return (T) new EntityRowHandler(meta, false, true).handle(rs);
|
||||||
} else if (String.class == beanClass) {
|
} 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);
|
return (T) StrUtil.join(", ", objRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
//普通bean
|
return new BeanRowHandler<>(meta, beanClass, true).handle(rs);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -207,14 +77,7 @@ public class ResultSetUtil {
|
|||||||
* @since 5.1.6
|
* @since 5.1.6
|
||||||
*/
|
*/
|
||||||
public static List<Object> handleRowToList(final ResultSet rs) throws SQLException {
|
public static List<Object> handleRowToList(final ResultSet rs) throws SQLException {
|
||||||
final ResultSetMetaData meta = rs.getMetaData();
|
return new ListRowHandler<>(rs.getMetaData(), Object.class).handle(rs);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -242,11 +105,10 @@ public class ResultSetUtil {
|
|||||||
* @since 4.5.16
|
* @since 4.5.16
|
||||||
*/
|
*/
|
||||||
public static <T extends Collection<Entity>> T toEntityList(final ResultSet rs, final T collection, final boolean caseInsensitive) throws SQLException {
|
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 RowHandler<Entity> rowHandler = new EntityRowHandler(rs.getMetaData(), caseInsensitive, true);
|
||||||
final int columnCount = meta.getColumnCount();
|
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
collection.add(toEntity(columnCount, meta, rs, caseInsensitive));
|
collection.add(rowHandler.handle(rs));
|
||||||
}
|
}
|
||||||
|
|
||||||
return collection;
|
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 {
|
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 ResultSetMetaData meta = rs.getMetaData();
|
||||||
final int columnCount = meta.getColumnCount();
|
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
collection.add(toBean(columnCount, meta, rs, elementBeanType));
|
collection.add(toBean(meta, rs, elementBeanType));
|
||||||
}
|
}
|
||||||
|
|
||||||
return collection;
|
return collection;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,20 +154,18 @@ public class ResultSetUtil {
|
|||||||
return generatedKey;
|
return generatedKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------------------------------- Private method start
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取字段值<br>
|
* 获取字段值<br>
|
||||||
* 针对日期时间等做单独处理判断
|
* 针对日期时间等做单独处理判断
|
||||||
*
|
*
|
||||||
* @param rs {@link ResultSet}
|
* @param rs {@link ResultSet}
|
||||||
* @param columnIndex 字段索引
|
* @param columnIndex 字段索引,从1开始计数
|
||||||
* @param type 字段类型,默认Object
|
* @param type 字段类型,默认Object
|
||||||
* @param targetColumnType 结果要求的类型,需进行二次转换(null或者Object不转换)
|
* @param targetColumnType 结果要求的类型,需进行二次转换(null或者Object不转换)
|
||||||
* @return 字段值
|
* @return 字段值
|
||||||
* @throws SQLException SQL异常
|
* @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;
|
Object rawValue = null;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Types.TIMESTAMP:
|
case Types.TIMESTAMP:
|
||||||
@ -333,5 +190,4 @@ public class ResultSetUtil {
|
|||||||
return Convert.convert(targetColumnType, rawValue);
|
return Convert.convert(targetColumnType, rawValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// -------------------------------------------------------------------------------------------------------------- Private method end
|
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
package org.dromara.hutool.db.handler;
|
package org.dromara.hutool.db.handler;
|
||||||
|
|
||||||
|
import org.dromara.hutool.db.handler.row.ListRowHandler;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -35,9 +37,10 @@ public class ValueListHandler implements RsHandler<List<List<Object>>>{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<List<Object>> handle(final ResultSet rs) throws SQLException {
|
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<>();
|
final ArrayList<List<Object>> result = new ArrayList<>();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
result.add(ResultSetUtil.handleRowToList(rs));
|
result.add(listRowHandler.handle(rs));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
Loading…
x
Reference in New Issue
Block a user