This doesn't look correct. You are using columnCount
each iteration.
for (int i = 1; i <= columnCount; i++) {
columns.add(rs.getMetaData().getColumnName(columnCount));
}
You probably meant this:
for (int i = 1; i <= columnCount; i++) {
columns.add(rs.getMetaData().getColumnName(i));
}
This would account for why you are seeing the wrong header names.