gpt4 book ai didi

java - 原始类型的反射映射

转载 作者:行者123 更新时间:2023-11-30 10:43:54 25 4
gpt4 key购买 nike

我需要一个用于 JDBC 的可嵌套 bean rowmapper,我使用了:

public class NestedRowMapper<T> implements RowMapper<T> {

private static Logger log = LoggerFactory.getLogger(NestedRowMapper.class);

private Class<T> mappedClass;

public NestedRowMapper(Class<T> mappedClass) {
this.mappedClass = mappedClass;
}

@Override
public T mapRow(ResultSet rs, int rowNum) throws SQLException {

T mappedObject = BeanUtils.instantiate(this.mappedClass);
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(mappedObject);

bw.setAutoGrowNestedPaths(true);

ResultSetMetaData meta_data = rs.getMetaData();
int columnCount = meta_data.getColumnCount();

for (int index = 1; index <= columnCount; index++) {

String column=null;
Object value=null;
try {

column = JdbcUtils.lookupColumnName(meta_data, index);
value = JdbcUtils.getResultSetValue(rs, index, Class.forName(meta_data.getColumnClassName(index)));

bw.setPropertyValue(column, value);

} catch (TypeMismatchException | NotWritablePropertyException | ClassNotFoundException e) {
log.error("",column,value,bw.getClass().getSimpleName(),e);
}
}

return mappedObject;
}
}

这很好用,除非它找到原始类型,在这种情况下 BeanWrapper.setPropertyValue 会失败。

例如,如果在我的映射 bean 中有一个 boolean 值(原始)而不是 boolean 值(类)属性,它将失败。我怎样才能更正它以让它也映射原始类型属性?

最佳答案

我想你可以查看源代码 org.springframework.jdbc.core.BeanPropertyRowMapper,你需要从 java 类定义中获取类类型,而不是从 ResultSet 元数据中获取。

例如,将您的 Class.forName(meta_data.getColumnClassName(index)) 替换为以下方法 getClass(column)

private Class<?> getClass(String column) {
PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(this.mappedClass);
for (PropertyDescriptor pd : pds) {
if (pd.getName().equals(column)) {
return pd.getPropertyType();
}
}
return null;
}

这只是一个例子,你需要像 BeanPropertyRowMapper 那样做缓存/ try catch

关于java - 原始类型的反射映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37593947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com