nested exception is java.sql.SQLException:Column index out of range.;caused: Column index out of range.;
Java.sql.ResultSet
ResultSetMetaData 对象
在JDBC返回了信息的情况下,metaData.getColumnName(i)获取column 字段名称,报下标异常
因为for循环的问题
查看追溯getColumnName源码,可以看到获取column之前,都 调用了getField method,可以看到getField方法中,columnIndex 是从1开始,不在范围都抛出异常,因此for循环以0开始,当然下标异常
最后贴一段映射赋值的代码
// clazz就是实体对象
public static <T>T mapperGetValue(Class<T> clazz,ResultSet resultSet) throws SQLException {
T instance = null;
try {
instance = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
PropertyDescriptor propertyDescriptor = null;
try {
String column = metaData.getColumnName(i);
String attr = lineToHump(column);
propertyDescriptor = new PropertyDescriptor(attr, clazz);
} catch (IntrospectionException e) {
e.printStackTrace();
}
assert propertyDescriptor != null;
Method writeMethod = propertyDescriptor.getWriteMethod();
try {
writeMethod.invoke(instance,resultSet.getObject(metaData.getColumnName(i)));
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
return instance;
}
private static Pattern linePattern = Pattern.compile("_(\\w)");
/** 下划线转驼峰 */
public static String lineToHump(String str) {
str = str.toLowerCase();
Matcher matcher = linePattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}