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();
}
这篇博客探讨了在使用Java JDBC进行数据库操作时遇到的'Column index out of range'异常。问题源于在遍历ResultSet时,for循环从0开始导致下标越界。解决方案在于修正循环条件,确保从1开始计数。博客还提供了一个实体对象映射到ResultSet的示例代码,展示了如何安全地获取并设置属性值。
1万+

被折叠的 条评论
为什么被折叠?



