add ValueListHandler

This commit is contained in:
Looly
2020-02-29 15:06:56 +08:00
parent df96ef1a29
commit 1ed2ec9dc4
9 changed files with 128 additions and 45 deletions

View File

@@ -8,6 +8,8 @@
### 新特性 ### 新特性
* 【core 】 NumberUtil.decimalFormat增加Object对象参数支持 * 【core 】 NumberUtil.decimalFormat增加Object对象参数支持
* 【core 】 增加ReflectUtil.getFieldValue支持Alias注解 * 【core 】 增加ReflectUtil.getFieldValue支持Alias注解
* 【core 】 Bean字段支持Alias注解包括转map,转bean等
* 【core 】 增加ValueListHandler优化结果集获取方式
### Bug修复 ### Bug修复

View File

@@ -1,5 +1,6 @@
package cn.hutool.core.bean; package cn.hutool.core.bean;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.bean.copier.ValueProvider; import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
@@ -143,6 +144,18 @@ public class BeanUtilTest {
Assert.assertEquals("sub名字", map.get("sub_name")); Assert.assertEquals("sub名字", map.get("sub_name"));
} }
@Test
public void beanToMapWithAliasTest() {
SubPersonWithAlias person = new SubPersonWithAlias();
person.setAge(14);
person.setOpenid("11213232");
person.setName("测试A11");
person.setSubName("sub名字");
Map<String, Object> map = BeanUtil.beanToMap(person);
Assert.assertEquals("sub名字", map.get("aliasSubName"));
}
@Test @Test
public void beanToMapWithLocalDateTimeTest() { public void beanToMapWithLocalDateTimeTest() {
final LocalDateTime now = LocalDateTime.now(); final LocalDateTime now = LocalDateTime.now();
@@ -270,6 +283,15 @@ public class BeanUtilTest {
private Boolean slow; private Boolean slow;
} }
@Getter
@Setter
public static class SubPersonWithAlias extends Person {
@Alias("aliasSubName")
private String subName;
// boolean参数值非isXXX形式
private Boolean slow;
}
@Getter @Getter
@Setter @Setter
public static class Person { public static class Person {

View File

@@ -152,6 +152,7 @@ public final class DbUtil {
* *
* @param objsToClose 需要关闭的对象 * @param objsToClose 需要关闭的对象
*/ */
@SuppressWarnings("ConstantConditions")
public static void close(Object... objsToClose) { public static void close(Object... objsToClose) {
for (Object obj : objsToClose) { for (Object obj : objsToClose) {
if (obj instanceof AutoCloseable) { if (obj instanceof AutoCloseable) {

View File

@@ -141,7 +141,7 @@ public class SqlConnRunner {
* @throws SQLException SQL执行异常 * @throws SQLException SQL执行异常
*/ */
public int[] insert(Connection conn, Collection<Entity> records) throws SQLException { public int[] insert(Connection conn, Collection<Entity> records) throws SQLException {
return insert(conn, records.toArray(new Entity[records.size()])); return insert(conn, records.toArray(new Entity[0]));
} }
/** /**
@@ -505,7 +505,7 @@ public class SqlConnRunner {
checkConn(conn); checkConn(conn);
final int count = count(conn, where); final int count = count(conn, where);
PageResultHandler pageResultHandler = PageResultHandler.create(new PageResult<Entity>(page, numPerPage, count)); PageResultHandler pageResultHandler = PageResultHandler.create(new PageResult<>(page, numPerPage, count));
return this.page(conn, fields, where, page, numPerPage, pageResultHandler); return this.page(conn, fields, where, page, numPerPage, pageResultHandler);
} }
@@ -532,7 +532,7 @@ public class SqlConnRunner {
} }
final int count = count(conn, where); final int count = count(conn, where);
PageResultHandler pageResultHandler = PageResultHandler.create(new PageResult<Entity>(page.getPageNumber(), page.getPageSize(), count)); PageResultHandler pageResultHandler = PageResultHandler.create(new PageResult<>(page.getPageNumber(), page.getPageSize(), count));
return this.page(conn, fields, where, page, pageResultHandler); return this.page(conn, fields, where, page, pageResultHandler);
} }

View File

@@ -15,6 +15,9 @@ import cn.hutool.db.Entity;
public class EntityHandler implements RsHandler<Entity>{ public class EntityHandler implements RsHandler<Entity>{
private static final long serialVersionUID = -8742432871908355992L; private static final long serialVersionUID = -8742432871908355992L;
/** 是否大小写不敏感 */
private boolean caseInsensitive;
/** /**
* 创建一个 EntityHandler对象 * 创建一个 EntityHandler对象
* @return EntityHandler对象 * @return EntityHandler对象
@@ -23,11 +26,27 @@ public class EntityHandler implements RsHandler<Entity>{
return new EntityHandler(); return new EntityHandler();
} }
/**
* 构造
*/
public EntityHandler() {
this(false);
}
/**
* 构造
*
* @param caseInsensitive 是否大小写不敏感
*/
public EntityHandler(boolean caseInsensitive) {
this.caseInsensitive = caseInsensitive;
}
@Override @Override
public Entity handle(ResultSet rs) throws SQLException { public Entity handle(ResultSet rs) throws SQLException {
final ResultSetMetaData meta = rs.getMetaData(); final ResultSetMetaData meta = rs.getMetaData();
final int columnCount = meta.getColumnCount(); final int columnCount = meta.getColumnCount();
return rs.next() ? HandleHelper.handleRow(columnCount, meta, rs) : null; return rs.next() ? HandleHelper.handleRow(columnCount, meta, rs, this.caseInsensitive) : null;
} }
} }

View File

@@ -14,6 +14,9 @@ import cn.hutool.db.Entity;
public class EntitySetHandler implements RsHandler<LinkedHashSet<Entity>>{ public class EntitySetHandler implements RsHandler<LinkedHashSet<Entity>>{
private static final long serialVersionUID = 8191723216703506736L; private static final long serialVersionUID = 8191723216703506736L;
/** 是否大小写不敏感 */
private boolean caseInsensitive;
/** /**
* 创建一个 EntityHandler对象 * 创建一个 EntityHandler对象
* @return EntityHandler对象 * @return EntityHandler对象
@@ -22,8 +25,24 @@ public class EntitySetHandler implements RsHandler<LinkedHashSet<Entity>>{
return new EntitySetHandler(); return new EntitySetHandler();
} }
/**
* 构造
*/
public EntitySetHandler() {
this(false);
}
/**
* 构造
*
* @param caseInsensitive 是否大小写不敏感
*/
public EntitySetHandler(boolean caseInsensitive) {
this.caseInsensitive = caseInsensitive;
}
@Override @Override
public LinkedHashSet<Entity> handle(ResultSet rs) throws SQLException { public LinkedHashSet<Entity> handle(ResultSet rs) throws SQLException {
return HandleHelper.handleRs(rs, new LinkedHashSet<Entity>()); return HandleHelper.handleRs(rs, new LinkedHashSet<>(), this.caseInsensitive);
} }
} }

View File

@@ -6,7 +6,9 @@ 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.Map; import java.util.Map;
import cn.hutool.core.bean.BeanDesc.PropDesc; import cn.hutool.core.bean.BeanDesc.PropDesc;
@@ -97,8 +99,8 @@ public class HandleHelper {
} }
setter = (null == pd) ? null : pd.getSetter(); setter = (null == pd) ? null : pd.getSetter();
if(null != setter) { if(null != setter) {
value = getColumnValue(rs, columnLabel, meta.getColumnType(i), TypeUtil.getFirstParamType(setter)); value = getColumnValue(rs, i, meta.getColumnType(i), TypeUtil.getFirstParamType(setter));
ReflectUtil.invokeWithCheck(bean, setter, new Object[] {value}); ReflectUtil.invokeWithCheck(bean, setter, value);
} }
} }
return bean; return bean;
@@ -149,9 +151,8 @@ public class HandleHelper {
String columnLabel; String columnLabel;
int type; int type;
for (int i = 1; i <= columnCount; i++) { for (int i = 1; i <= columnCount; i++) {
columnLabel = meta.getColumnLabel(i);
type = meta.getColumnType(i); type = meta.getColumnType(i);
row.put(columnLabel, getColumnValue(rs, columnLabel, type, null)); row.put(meta.getColumnLabel(i), getColumnValue(rs, i, type, null));
} }
if (withMetaInfo) { if (withMetaInfo) {
row.setTableName(meta.getTableName(1)); row.setTableName(meta.getTableName(1));
@@ -162,7 +163,7 @@ public class HandleHelper {
/** /**
* 处理单条数据 * 处理单条数据
* *
* @param rs 数据集 * @param rs 数据集
* @return 每一行的Entity * @return 每一行的Entity
* @throws SQLException SQL执行异常 * @throws SQLException SQL执行异常
@@ -173,6 +174,25 @@ public class HandleHelper {
return handleRow(columnCount, meta, rs); return handleRow(columnCount, meta, rs);
} }
/**
* 处理单行数据
*
* @param rs 数据集(行)
* @return 每一行的List
* @throws SQLException SQL执行异常
* @since 5.1.6
*/
public static List<Object> handleRowToList(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;
}
/** /**
* 处理多条数据 * 处理多条数据
* *
@@ -232,39 +252,6 @@ public class HandleHelper {
} }
// -------------------------------------------------------------------------------------------------------------- Private method start // -------------------------------------------------------------------------------------------------------------- Private method start
/**
* 获取字段值<br>
* 针对日期时间等做单独处理判断
*
* @param <T> 返回类型
* @param rs {@link ResultSet}
* @param label 字段标签或者字段名
* @param type 字段类型默认Object
* @param targetColumnType 结果要求的类型需进行二次转换null或者Object不转换
* @return 字段值
* @throws SQLException SQL异常
*/
private static <T> Object getColumnValue(ResultSet rs, String label, int type, Type targetColumnType) throws SQLException {
Object rawValue;
switch (type) {
case Types.TIMESTAMP:
rawValue = rs.getTimestamp(label);
break;
case Types.TIME:
rawValue = rs.getTime(label);
break;
default:
rawValue = rs.getObject(label);
}
if (null == targetColumnType || Object.class == targetColumnType) {
// 无需转换
return rawValue;
} else {
// 按照返回值要求转换
return Convert.convert(targetColumnType, rawValue);
}
}
/** /**
* 获取字段值<br> * 获取字段值<br>
* 针对日期时间等做单独处理判断 * 针对日期时间等做单独处理判断

View File

@@ -0,0 +1,32 @@
package cn.hutool.db.handler;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* 结果集处理类 处理出的结果为List列表
* @author loolly
*
*/
public class ValueListHandler implements RsHandler<List<List<Object>>>{
private static final long serialVersionUID = 1L;
/**
* 创建一个 EntityListHandler对象
* @return EntityListHandler对象
*/
public static ValueListHandler create() {
return new ValueListHandler();
}
@Override
public List<List<Object>> handle(ResultSet rs) throws SQLException {
final ArrayList<List<Object>> result = new ArrayList<>();
while (rs.next()) {
result.add(HandleHelper.handleRowToList(rs));
}
return result;
}
}

View File

@@ -81,6 +81,7 @@ public class CRUDTest {
@Test @Test
public void findInTest() throws SQLException { public void findInTest() throws SQLException {
List<Entity> results = db.findAll(Entity.create("user").set("id", "in 1,2,3")); List<Entity> results = db.findAll(Entity.create("user").set("id", "in 1,2,3"));
Console.log(results);
Assert.assertEquals(2, results.size()); Assert.assertEquals(2, results.size());
} }
@@ -123,13 +124,13 @@ public class CRUDTest {
Long id = db.insertForGeneratedKey(Entity.create("user").set("name", "unitTestUser").set("age", 66)); Long id = db.insertForGeneratedKey(Entity.create("user").set("name", "unitTestUser").set("age", 66));
Assert.assertTrue(id > 0); Assert.assertTrue(id > 0);
Entity result = db.get("user", "name", "unitTestUser"); Entity result = db.get("user", "name", "unitTestUser");
Assert.assertSame(66, (int) result.getInt("age")); Assert.assertSame(66, result.getInt("age"));
// 改 // 改
int update = db.update(Entity.create().set("age", 88), Entity.create("user").set("name", "unitTestUser")); int update = db.update(Entity.create().set("age", 88), Entity.create("user").set("name", "unitTestUser"));
Assert.assertTrue(update > 0); Assert.assertTrue(update > 0);
Entity result2 = db.get("user", "name", "unitTestUser"); Entity result2 = db.get("user", "name", "unitTestUser");
Assert.assertSame(88, (int) result2.getInt("age")); Assert.assertSame(88, result2.getInt("age"));
// 删 // 删
int del = db.del("user", "name", "unitTestUser"); int del = db.del("user", "name", "unitTestUser");