Recuperar nombres de columna de java.sql.ResultSet

233

Con java.sql.ResultSetdecir que hay una manera de obtener el nombre de una columna como Stringutilizando el índice de la columna? Eché un vistazo al documento de API pero no puedo encontrar nada.

BalusC
fuente

Respuestas:

372

Puede obtener esta información de los ResultSetmetadatos. Ver ResultSetMetaData

p.ej

 ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 ResultSetMetaData rsmd = rs.getMetaData();
 String name = rsmd.getColumnName(1);

y puedes obtener el nombre de la columna desde allí. Si lo haces

select x as y from table

entonces rsmd.getColumnLabel()también obtendrá el nombre de la etiqueta recuperada.

Brian Agnew
fuente
22
Vea también rsmd.getColumnLabelsi recupera columnas con etiquetas (por ejemploSELECT columnName AS ColumnLabel
T30
15
Puede que se sorprenda cuando vea el recuento de columnas a partir de 1. Puede recorrer los nombres de las columnas confor (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
Alphaaa
¿ getColumnName()Devuelve el nombre original de la columna si no usa el ASnombre de alias?
membersound
2
@membersound Sí, como se documenta en su Javadoc : "Si ASno se especifica un SQL , el valor devuelto por getColumnLabelserá el mismo que el getColumnNamemétodo devuelto ". . En casi todos los casos, debe usar en getColumnLabellugar de getColumnName.
Mark Rotteveel
1
Esto fallará si la tabla está vacía.
andronix
140

Además de las respuestas anteriores, si está trabajando con una consulta dinámica y desea los nombres de columna pero no sabe cuántas columnas hay, puede usar el objeto ResultSetMetaData para obtener primero el número de columnas y luego recorrerlas. .

Modificando el código de Brian:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

// The column count starts from 1
for (int i = 1; i <= columnCount; i++ ) {
  String name = rsmd.getColumnName(i);
  // Do stuff with name
}
Cyntech
fuente
¿No es así? for (int i = 1; i <= columnCount + 1; i ++) {...}
Martin
3
@ Martin No, porque eso intentará obtener la Columna n + 1 que no existe. Si quieres ser absolutamente conciso, entonces lo sería i <= columnCount.
Cyntech
21

Puede usar el objeto ResultSetMetaData ( http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html ) para eso, así:

ResultSet rs = stmt.executeQuery("SELECT * FROM table");
ResultSetMetaData rsmd = rs.getMetaData();
String firstColumnName = rsmd.getColumnName(1);
Simón
fuente
1
gracias me ayudó ... lo usé como: resultSet.getString (resultSet.findColumn ("fullname"))
C Sharper
Limite los registros recuperados a 1. De lo contrario, si la tabla es demasiado grande, una sobrecarga innecesaria entonces. Por ejemplo, para teradatabase: use la consulta "SELECT * FROM table SAMPLE 1"
josepainumkal
11

Esta pregunta es antigua y también lo son las respuestas anteriores correctas. Pero lo que estaba buscando cuando encontré este tema fue algo así como esta solución. Esperemos que ayude a alguien.

// Loading required libraries    
import java.util.*;
import java.sql.*;

public class MySQLExample {
  public void run(String sql) {
    // JDBC driver name and database URL
    String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    String DB_URL = "jdbc:mysql://localhost/demo";

    // Database credentials
    String USER = "someuser"; // Fake of course.
    String PASS = "somepass"; // This too!

    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    Vector<String> columnNames = new Vector<String>();

    try {
      // Register JDBC driver
      Class.forName(JDBC_DRIVER);

      // Open a connection
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      // Execute SQL query
      stmt = conn.createStatement();
      rs = stmt.executeQuery(sql);
      if (rs != null) {
        ResultSetMetaData columns = rs.getMetaData();
        int i = 0;
        while (i < columns.getColumnCount()) {
          i++;
          System.out.print(columns.getColumnName(i) + "\t");
          columnNames.add(columns.getColumnName(i));
        }
        System.out.print("\n");

        while (rs.next()) {
          for (i = 0; i < columnNames.size(); i++) {
            System.out.print(rs.getString(columnNames.get(i))
                + "\t");

          }
          System.out.print("\n");
        }

      }
    } catch (Exception e) {
      System.out.println("Exception: " + e.toString());
    }

    finally {
      try {
        if (rs != null) {
          rs.close();
        }
        if (stmt != null) {
          stmt.close();
        }
        if (conn != null) {
          conn.close();
        }
      } catch (Exception mysqlEx) {
        System.out.println(mysqlEx.toString());
      }

    }
  }
}
Ronald Weidner
fuente
5

SQLite 3

Usando getMetaData ();

DatabaseMetaData md = conn.getMetaData();
ResultSet rset = md.getColumns(null, null, "your_table_name", null);

System.out.println("your_table_name");
while (rset.next())
{
    System.out.println("\t" + rset.getString(4));
}

EDITAR: Esto también funciona con PostgreSQL

Sedrick
fuente
Lo probé en una base de datos teradata y obtuve el error "[Base de datos Teradata] [TeraJDBC 16.20.00.02] [Error 9719] [SQLState HY000] La función QVCI está deshabilitada".
josepainumkal
2
import java.sql.*;

public class JdbcGetColumnNames {

    public static void main(String args[]) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/komal", "root", "root");

            st = con.createStatement();

            String sql = "select * from person";
            rs = st.executeQuery(sql);
            ResultSetMetaData metaData = rs.getMetaData();

            int rowCount = metaData.getColumnCount();

            System.out.println("Table Name : " + metaData.getTableName(2));
            System.out.println("Field  \tDataType");

            for (int i = 0; i < rowCount; i++) {
                System.out.print(metaData.getColumnName(i + 1) + "  \t");
                System.out.println(metaData.getColumnTypeName(i + 1));
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Nombre de la tabla: persona Campo Tipo de datos id VARCHAR cname VARCHAR dob DATE

Rathod profundo
fuente
1

Cuando necesita los nombres de columna, pero no desea obtener entradas:

PreparedStatement stmt = connection.prepareStatement("SHOW COLUMNS FROM `yourTable`");

ResultSet set = stmt.executeQuery();

//store all of the columns names
List<String> names = new ArrayList<>();
while (set.next()) { names.add(set.getString("Field")); }

NOTA: solo funciona con MySQL

Cazador s
fuente
1
¡Solo esto funcionó para mí! Tuve que bajar para esto. No estoy seguro de por qué getColumnName (i) y getColumnLabel (i), me recuperaron datos extraños inesperados. ¡Muchas gracias!
VipiN Negi
¡Me alegro de que esto te haya ayudado!
Hunter S
1
while (rs.next()) {
   for (int j = 1; j < columncount; j++) {
       System.out.println( rsd.getColumnName(j) + "::" + rs.getString(j));      
   }
}
Jagadish Chenna
fuente
66
Por favor, ¿puede extender su respuesta con una explicación más detallada? Esto será muy útil para comprender. ¡Gracias!
vezunchik
1

Las instrucciones SQL que leen datos de una consulta de base de datos devuelven los datos en un conjunto de resultados. La instrucción SELECT es la forma estándar de seleccionar filas de una base de datos y verlas en un conjunto de resultados. La **java.sql.ResultSet**interfaz representa el conjunto de resultados de una consulta de base de datos.

  • Obtener métodos: se usa para ver los datos en las columnas de la fila actual a la que apunta el cursor.

Utilizando MetaData of a result set to fetch the exact column count

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
boolean b = rsmd.isSearchable(1);

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html

y aún más para vincularlo a la tabla del modelo de datos

public static void main(String[] args) {
    Connection conn = null;
    Statement stmt = null;
    try {
        //STEP 2: Register JDBC driver
        Class.forName("com.mysql.jdbc.Driver");

        //STEP 3: Open a connection
        System.out.println("Connecting to a selected database...");
        conn = DriverManager.getConnection(DB_URL, USER, PASS);
        System.out.println("Connected database successfully...");

        //STEP 4: Execute a query
        System.out.println("Creating statement...");
        stmt = conn.createStatement();

        String sql = "SELECT id, first, last, age FROM Registration";
        ResultSet rs = stmt.executeQuery(sql);
        //STEP 5: Extract data from result set
        while(rs.next()){
            //Retrieve by column name
            int id  = rs.getInt("id");
            int age = rs.getInt("age");
            String first = rs.getString("first");
            String last = rs.getString("last");

            //Display values
            System.out.print("ID: " + id);
            System.out.print(", Age: " + age);
            System.out.print(", First: " + first);
            System.out.println(", Last: " + last);
        }
        rs.close();
    } catch(SQLException se) {
        //Handle errors for JDBC
        se.printStackTrace();
    } catch(Exception e) {
        //Handle errors for Class.forName
        e.printStackTrace();
    } finally {
        //finally block used to close resources
        try {
            if(stmt!=null)
                conn.close();
        } catch(SQLException se) {
        } // do nothing
        try {
            if(conn!=null)
                conn.close();
        } catch(SQLException se) {
            se.printStackTrace();
        } //end finally try
    }//end try
    System.out.println("Goodbye!");
}//end main
//end JDBCExample

muy buen tutorial aquí: http://www.tutorialspoint.com/jdbc/

ResultSetMetaData meta = resultset.getMetaData();  // for a valid resultset object after executing query

Integer columncount = meta.getColumnCount();

int count = 1 ; // start counting from 1 always

String[] columnNames = null;

while(columncount <=count) {
    columnNames [i] = meta.getColumnName(i);
}

System.out.println (columnNames.size() ); //see the list and bind it to TableModel object. the to your jtbale.setModel(your_table_model);
Daniel Adenew
fuente
0

@Cyntech tiene razón.

En caso de que su tabla esté vacía y aún necesite obtener los nombres de columna de la tabla, puede obtener su columna como tipo Vector, consulte lo siguiente:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

Vector<Vector<String>>tableVector = new Vector<Vector<String>>(); 
boolean isTableEmpty = true;
int col = 0;

 while(rs.next())
    {
      isTableEmpty = false;  //set to false since rs.next has data: this means the table is not empty
       if(col != columnCount)
          {
            for(int x = 1;x <= columnCount;x++){
                 Vector<String> tFields = new Vector<String>(); 
                 tFields.add(rsmd.getColumnName(x).toString());
                 tableVector.add(tFields);
             }
            col = columnCount;
          }
     } 


      //if table is empty then get column names only
  if(isTableEmpty){  
      for(int x=1;x<=colCount;x++){
           Vector<String> tFields = new Vector<String>(); 
           tFields.add(rsmd.getColumnName(x).toString());
           tableVector.add(tFields);
        }
      }

 rs.close();
 stmt.close();

 return tableVector; 
21stking
fuente
0
ResultSet rsTst = hiSession.connection().prepareStatement(queryStr).executeQuery(); 
ResultSetMetaData meta = rsTst.getMetaData();
int columnCount = meta.getColumnCount();
// The column count starts from 1

String nameValuePair = "";
while (rsTst.next()) {
    for (int i = 1; i < columnCount + 1; i++ ) {
        String name = meta.getColumnName(i);
        // Do stuff with name

        String value = rsTst.getString(i); //.getObject(1);
        nameValuePair = nameValuePair + name + "=" +value + ",";
        //nameValuePair = nameValuePair + ", ";
    }
    nameValuePair = nameValuePair+"||" + "\t";
}
Rabi
fuente
0

Si desea usar spring jdbctemplate y no quiere tratar con el personal de conexión, puede usar lo siguiente:

jdbcTemplate.query("select * from books", new RowCallbackHandler() {
        public void processRow(ResultSet resultSet) throws SQLException {
            ResultSetMetaData rsmd = resultSet.getMetaData();
            for (int i = 1; i <= rsmd.getColumnCount(); i++ ) {
                String name = rsmd.getColumnName(i);
                // Do stuff with name
            }
        }
    });
sofá selins
fuente
0

U puede obtener el nombre y el valor de la columna de resultSet.getMetaData (); Este código funciona para mí:

Connection conn = null;
PreparedStatement preparedStatement = null;
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = MySQLJDBCUtil.getConnection();
        preparedStatement = conn.prepareStatement(sql);
        if (params != null) {
            for (int i = 0; i < params.size(); i++) {
                preparedStatement.setObject(i + 1, params.get(i).getSqlValue());
            }
            ResultSet resultSet = preparedStatement.executeQuery();
            ResultSetMetaData md = resultSet.getMetaData();
            while (resultSet.next()) {
                int counter = md.getColumnCount();
                String colName[] = new String[counter];
                Map<String, Object> field = new HashMap<>();
                for (int loop = 1; loop <= counter; loop++) {
                    int index = loop - 1;
                    colName[index] = md.getColumnLabel(loop);
                    field.put(colName[index], resultSet.getObject(colName[index]));
                }
                rows.add(field);
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            }catch (Exception e1) {
                e1.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    return rows;
君主 不是 我
fuente
0

Lo sé, esta pregunta ya está respondida, pero probablemente alguien como yo necesita acceder a un nombre de columna DatabaseMetaDatapor etiqueta en lugar de índice:

ResultSet resultSet = null;
DatabaseMetaData metaData = null;

    try {
        metaData  = connection.getMetaData();
        resultSet = metaData.getColumns(null, null, tableName, null);

        while (resultSet.next()){
            String name = resultSet.getString("COLUMN_NAME");
        }
    }
Pavlo Rozbytskyi
fuente